mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 19:00:17 +02:00
The XID signal handler is OS specific and needs to be delegated to being handled in the frontend. This only happens when we create a thread with pthread rather than clone/fork/vfork. The first created pthread will reset the XID signal handler in glibc, which we need to check the first time this occurs. A little bit disjoint while the actual thread creation still happens in the backend but will come together once the thread creation gets moved to the frontend. The only game I am aware of that requires this to work is SOMA since its one of its middleware libraries tries asking for root privileges. Retested the game to make sure it still works as expected.
45 lines
1.5 KiB
C++
45 lines
1.5 KiB
C++
// SPDX-License-Identifier: MIT
|
|
#pragma once
|
|
#include <FEXCore/Core/SignalDelegator.h>
|
|
#include <FEXCore/HLE/SyscallHandler.h>
|
|
|
|
namespace FEX::DummyHandlers {
|
|
|
|
class DummySyscallHandler: public FEXCore::HLE::SyscallHandler, public FEXCore::Allocator::FEXAllocOperators {
|
|
public:
|
|
uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame *Frame, FEXCore::HLE::SyscallArguments *Args) override {
|
|
// Don't do anything
|
|
return 0;
|
|
}
|
|
|
|
FEXCore::HLE::SyscallABI GetSyscallABI(uint64_t Syscall) override {
|
|
// Don't do anything
|
|
return {0, false, 0};
|
|
}
|
|
|
|
// These are no-ops implementations of the SyscallHandler API
|
|
FEXCore::HLE::AOTIRCacheEntryLookupResult LookupAOTIRCacheEntry(FEXCore::Core::InternalThreadState *Thread, uint64_t GuestAddr) override {
|
|
return {0, 0};
|
|
}
|
|
};
|
|
|
|
class DummySignalDelegator final : public FEXCore::SignalDelegator, public FEXCore::Allocator::FEXAllocOperators {
|
|
public:
|
|
void SignalThread(FEXCore::Core::InternalThreadState *Thread, FEXCore::Core::SignalEvent Event) override {}
|
|
|
|
FEXCore::Core::InternalThreadState *GetBackingTLSThread() {
|
|
return GetTLSThread();
|
|
}
|
|
|
|
protected:
|
|
void RegisterTLSState(FEXCore::Core::InternalThreadState *Thread) override;
|
|
void UninstallTLSState(FEXCore::Core::InternalThreadState *Thread) override;
|
|
|
|
private:
|
|
FEXCore::Core::InternalThreadState *GetTLSThread();
|
|
};
|
|
|
|
fextl::unique_ptr<FEXCore::HLE::SyscallHandler> CreateSyscallHandler();
|
|
fextl::unique_ptr<FEX::DummyHandlers::DummySignalDelegator> CreateSignalDelegator();
|
|
}
|