diff --git a/FEXCore/Source/Interface/Core/JIT/BranchOps.cpp b/FEXCore/Source/Interface/Core/JIT/BranchOps.cpp index 2b641de6b..569f16938 100644 --- a/FEXCore/Source/Interface/Core/JIT/BranchOps.cpp +++ b/FEXCore/Source/Interface/Core/JIT/BranchOps.cpp @@ -262,16 +262,10 @@ DEF_OP(Syscall) { // X1: ThreadState // X2: Pointer to SyscallArguments - FEXCore::IR::SyscallFlags Flags = Op->Flags; PushDynamicRegs(TMP1); uint32_t GPRSpillMask = ~0U; uint32_t FPRSpillMask = ~0U; - if ((Flags & FEXCore::IR::SyscallFlags::NOSYNCSTATEONENTRY) == FEXCore::IR::SyscallFlags::NOSYNCSTATEONENTRY) { - // Need to spill all caller saved registers still - GPRSpillMask = CALLER_GPR_MASK; - FPRSpillMask = CALLER_FPR_MASK; - } SpillStaticRegs(TMP1, true, GPRSpillMask, FPRSpillMask); @@ -305,22 +299,22 @@ DEF_OP(Syscall) { add(ARMEmitter::Size::i64Bit, ARMEmitter::Reg::rsp, ARMEmitter::Reg::rsp, SPOffset); - if ((Flags & FEXCore::IR::SyscallFlags::NORETURN) != FEXCore::IR::SyscallFlags::NORETURN) { - // Result is now in x0 - // Fix the stack and any values that were stepped on - FillStaticRegs(true, GPRSpillMask, FPRSpillMask, ARMEmitter::Reg::r1, ARMEmitter::Reg::r2); + // Result is now in x0 + // Fix the stack and any values that were stepped on + FillStaticRegs(true, GPRSpillMask, FPRSpillMask, ARMEmitter::Reg::r1, ARMEmitter::Reg::r2); - // Now the registers we've spilled are back in their original host registers - // We can safely claim we are no longer in a syscall - str(ARMEmitter::XReg::zr, STATE, offsetof(FEXCore::Core::CpuStateFrame, InSyscallInfo)); + // Now the registers we've spilled are back in their original host registers + // We can safely claim we are no longer in a syscall + str(ARMEmitter::XReg::zr, STATE, offsetof(FEXCore::Core::CpuStateFrame, InSyscallInfo)); - PopDynamicRegs(); + PopDynamicRegs(); - if ((Flags & FEXCore::IR::SyscallFlags::NORETURNEDRESULT) != FEXCore::IR::SyscallFlags::NORETURNEDRESULT) { - // Move result to its destination register. - // Only if `NORETURNEDRESULT` wasn't set, otherwise we might overwrite the CPUState refilled with `FillStaticRegs` - mov(ARMEmitter::Size::i64Bit, GetReg(Node), ARMEmitter::Reg::r0); - } + const auto OSABI = CTX->SyscallHandler->GetOSABI(); + + if (OSABI != FEXCore::HLE::SyscallOSABI::OS_GENERIC) { + // Move result to its destination register. + // Only if `NORETURNEDRESULT` wasn't set, otherwise we might overwrite the CPUState refilled with `FillStaticRegs` + mov(ARMEmitter::Size::i64Bit, GetReg(Node), ARMEmitter::Reg::r0); } } diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 00dca3af4..5c753fd23 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -28,7 +28,6 @@ $end_info$ #include #include #include -#include namespace FEXCore::IR { @@ -51,8 +50,6 @@ void OpDispatchBuilder::SyscallOp(OpcodeArgs, bool IsSyscallInst) { FEXCore::X86State::REG_RSI, FEXCore::X86State::REG_RDI, FEXCore::X86State::REG_RBP, }; - SyscallFlags DefaultSyscallFlags = FEXCore::IR::SyscallFlags::DEFAULT; - const auto OSABI = CTX->SyscallHandler->GetOSABI(); if (OSABI == FEXCore::HLE::SyscallOSABI::OS_LINUX64) { NumArguments = GPRIndexes_64.size(); @@ -64,7 +61,6 @@ void OpDispatchBuilder::SyscallOp(OpcodeArgs, bool IsSyscallInst) { // All registers will be spilled before the syscall and filled afterwards so no JIT-side argument handling is necessary. NumArguments = 0; GPRIndexes = nullptr; - DefaultSyscallFlags = FEXCore::IR::SyscallFlags::NORETURNEDRESULT; } else { ERROR_AND_DIE_FMT("Unhandled OSABI syscall"); } @@ -98,9 +94,10 @@ void OpDispatchBuilder::SyscallOp(OpcodeArgs, bool IsSyscallInst) { } FlushRegisterCache(); - auto SyscallOp = _Syscall(Arguments[0], Arguments[1], Arguments[2], Arguments[3], Arguments[4], Arguments[5], Arguments[6], DefaultSyscallFlags); + auto SyscallOp = _Syscall(Arguments[0], Arguments[1], Arguments[2], Arguments[3], Arguments[4], Arguments[5], Arguments[6]); - if ((DefaultSyscallFlags & FEXCore::IR::SyscallFlags::NORETURNEDRESULT) != FEXCore::IR::SyscallFlags::NORETURNEDRESULT) { + // Generic ABI doesn't store result in RAX. + if (OSABI != FEXCore::HLE::SyscallOSABI::OS_GENERIC) { StoreGPRRegister(X86State::REG_RAX, SyscallOp); } diff --git a/FEXCore/Source/Interface/IR/IR.json b/FEXCore/Source/Interface/IR/IR.json index f10cf7239..de829f9b2 100644 --- a/FEXCore/Source/Interface/IR/IR.json +++ b/FEXCore/Source/Interface/IR/IR.json @@ -138,7 +138,6 @@ "FenceType": "FenceType", "RegisterClass": "RegClass", "CondClass": "CondClass", - "SyscallFlags": "FEXCore::IR::SyscallFlags", "SHA256Sum": "SHA256Sum", "MemOffsetType": "MemOffsetType", "BreakDefinition": "BreakDefinition", @@ -314,7 +313,7 @@ "CallbackReturn": { "HasSideEffects": true }, - "GPR = Syscall GPR:$SyscallID, GPR:$Arg0, GPR:$Arg1, GPR:$Arg2, GPR:$Arg3, GPR:$Arg4, GPR:$Arg5, SyscallFlags:$Flags": { + "GPR = Syscall GPR:$SyscallID, GPR:$Arg0, GPR:$Arg1, GPR:$Arg2, GPR:$Arg3, GPR:$Arg4, GPR:$Arg5": { "HasSideEffects": true, "Desc": ["Dispatches a guest syscall through to the SyscallHandler class" ], diff --git a/FEXCore/Source/Interface/IR/IRDumper.cpp b/FEXCore/Source/Interface/IR/IRDumper.cpp index ddb08e7b5..b3e6a0140 100644 --- a/FEXCore/Source/Interface/IR/IRDumper.cpp +++ b/FEXCore/Source/Interface/IR/IRDumper.cpp @@ -149,20 +149,6 @@ static void PrintArg(fextl::stringstream* out, const IRListView*, RoundMode Arg) }(); } -static void PrintArg(fextl::stringstream* out, const IRListView*, SyscallFlags Arg) { - *out << [Arg] { - switch (Arg) { - case SyscallFlags::DEFAULT: return "Default"; - case SyscallFlags::OPTIMIZETHROUGH: return "Optimize Through"; - case SyscallFlags::NOSYNCSTATEONENTRY: return "No Sync State on Entry"; - case SyscallFlags::NORETURN: return "No Return"; - case SyscallFlags::NOSIDEEFFECTS: return "No Side Effects"; - case SyscallFlags::NORETURNEDRESULT: return "No Returned Result"; - } - return ""; - }(); -} - static void PrintArg(fextl::stringstream* out, const IRListView*, NamedVectorConstant Arg) { *out << [Arg] { // clang-format off diff --git a/FEXCore/include/FEXCore/HLE/SyscallHandler.h b/FEXCore/include/FEXCore/HLE/SyscallHandler.h index 5677b5989..712fda130 100644 --- a/FEXCore/include/FEXCore/HLE/SyscallHandler.h +++ b/FEXCore/include/FEXCore/HLE/SyscallHandler.h @@ -54,10 +54,6 @@ public: virtual ~SyscallHandler() = default; virtual uint64_t HandleSyscall(FEXCore::Core::CpuStateFrame* Frame, FEXCore::HLE::SyscallArguments* Args) = 0; - virtual SyscallABI GetSyscallABI(uint64_t Syscall) = 0; - virtual FEXCore::IR::SyscallFlags GetSyscallFlags(uint64_t Syscall) const { - return FEXCore::IR::SyscallFlags::DEFAULT; - } SyscallOSABI GetOSABI() const { return OSABI; diff --git a/FEXCore/include/FEXCore/IR/IR.h b/FEXCore/include/FEXCore/IR/IR.h index 89eb2ea0d..b0efd3b51 100644 --- a/FEXCore/include/FEXCore/IR/IR.h +++ b/FEXCore/include/FEXCore/IR/IR.h @@ -8,26 +8,6 @@ namespace FEXCore::IR { -enum class SyscallFlags : uint8_t { - DEFAULT = 0, - // Syscalldoesn't care about CPUState being serialized up to the syscall instruction. - // Means dead code elimination can optimize through a syscall operation. - OPTIMIZETHROUGH = 1 << 0, - // Syscall only reads the passed in arguments. Doesn't read CPUState. - NOSYNCSTATEONENTRY = 1 << 1, - // Syscall doesn't return. Code generation after syscall return can be removed. - NORETURN = 1 << 2, - // Syscall doesn't have any side-effects, so if the result isn't used then it can be removed. - NOSIDEEFFECTS = 1 << 3, - // Syscall doesn't return a result. - // Means the resulting register shouldn't be written (Usually RAX). - // Usually used with !NOSYNCSTATEONENTRY, so the syscall can modify CPU state entirely. - // Then on return FEXCore picks up the new state. - NORETURNEDRESULT = 1 << 4, -}; - -FEX_DEF_NUM_OPS(SyscallFlags) - // This enum of named vector constants are linked to an array in CPUBackend.cpp. // This is used with the IROp `LoadNamedVectorConstant` to load a vector constant // that would otherwise be costly to materialize. diff --git a/Source/Tools/CodeSizeValidation/Main.cpp b/Source/Tools/CodeSizeValidation/Main.cpp index 173a8de71..1562c19ed 100644 --- a/Source/Tools/CodeSizeValidation/Main.cpp +++ b/Source/Tools/CodeSizeValidation/Main.cpp @@ -447,18 +447,6 @@ public: return 0; } - FEXCore::HLE::SyscallABI GetSyscallABI(uint64_t Syscall) override { - if (Syscall == 0) { - // Claim syscall 0 is simple for instcountci inline tests. - return FEXCore::HLE::SyscallABI { - .NumArgs = 0, - .HasReturn = true, - .HostSyscallNumber = 0, // Just map to host syscall zero, it isn't going to get called. - }; - } - return {0, false, -1}; - } - // These are no-ops implementations of the SyscallHandler API std::optional LookupExecutableFileSection(FEXCore::Core::InternalThreadState& Thread, uint64_t GuestAddr) override { diff --git a/Source/Tools/CommonTools/DummyHandlers.h b/Source/Tools/CommonTools/DummyHandlers.h index fea414779..fd54d59e4 100644 --- a/Source/Tools/CommonTools/DummyHandlers.h +++ b/Source/Tools/CommonTools/DummyHandlers.h @@ -16,11 +16,6 @@ public: 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 std::optional LookupExecutableFileSection(FEXCore::Core::InternalThreadState&, uint64_t) override { return std::nullopt; diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls.h b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls.h index d346ec6fa..9a9f312ff 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls.h +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls.h @@ -138,9 +138,7 @@ public: SyscallPtrArg5 Ptr5; SyscallPtrArg6 Ptr6; }; - int32_t HostSyscallNumber; uint8_t NumArgs; - FEXCore::IR::SyscallFlags Flags; #ifdef DEBUG_STRACE fextl::string StraceFmt; #endif @@ -150,32 +148,14 @@ public: return &Definitions.at(Syscall); } - FEXCore::HLE::SyscallABI GetSyscallABI(uint64_t Syscall) override { - if (NeedsSeccomp) { - // Override ABI if seccomp is enabled. - return {FEXCore::HLE::SyscallArguments::MAX_ARGS, true, -1}; - } - auto& Def = Definitions.at(Syscall); - return {Def.NumArgs, true, Def.HostSyscallNumber}; - } - - FEXCore::IR::SyscallFlags GetSyscallFlags(uint64_t Syscall) const override { - if (NeedsSeccomp) { - // Override flags if seccomp is enabled. - return FEXCore::IR::SyscallFlags::DEFAULT; - } - auto& Def = Definitions.at(Syscall); - return Def.Flags; - } - - virtual void RegisterSyscall_32(int SyscallNumber, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, + virtual void RegisterSyscall_32(int SyscallNumber, #ifdef DEBUG_STRACE const fextl::string& TraceFormatString, #endif void* SyscallHandler, int ArgumentCount) { } - virtual void RegisterSyscall_64(int SyscallNumber, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, + virtual void RegisterSyscall_64(int SyscallNumber, #ifdef DEBUG_STRACE const fextl::string& TraceFormatString, #endif @@ -661,14 +641,8 @@ inline static uint64_t futimesat_compat(int dirfd, const char* pathname, const T } // namespace FEX::HLE // Registers syscall for both 32bit and 64bit -#define REGISTER_SYSCALL_IMPL(name, lambda) REGISTER_SYSCALL_IMPL_INTERNAL(name, ~0, FEXCore::IR::SyscallFlags::DEFAULT, lambda) - -#define REGISTER_SYSCALL_IMPL_FLAGS(name, flags, lambda) REGISTER_SYSCALL_IMPL_INTERNAL(name, ~0, flags, lambda) - -#define REGISTER_SYSCALL_IMPL_PASS_FLAGS(name, flags, lambda) REGISTER_SYSCALL_IMPL_INTERNAL(name, SYSCALL_DEF(name), flags, lambda) - -#define REGISTER_SYSCALL_IMPL_INTERNAL(name, number, flags, lambda) \ - do { \ - FEX::HLE::x64::RegisterSyscall(Handler, FEX::HLE::x64::SYSCALL_x64_##name, (number), (flags), #name, (lambda)); \ - FEX::HLE::x32::RegisterSyscall(Handler, FEX::HLE::x32::SYSCALL_x86_##name, (number), (flags), #name, (lambda)); \ +#define REGISTER_SYSCALL_IMPL(name, lambda) \ + do { \ + FEX::HLE::x64::RegisterSyscall(Handler, FEX::HLE::x64::SYSCALL_x64_##name, #name, (lambda)); \ + FEX::HLE::x32::RegisterSyscall(Handler, FEX::HLE::x32::SYSCALL_x86_##name, #name, (lambda)); \ } while (false) diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/EPoll.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/EPoll.cpp index 9a67249f2..dc48d2862 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/EPoll.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/EPoll.cpp @@ -19,10 +19,9 @@ namespace FEX::HLE { void RegisterEpoll(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_FLAGS(epoll_create, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int size) -> uint64_t { - uint64_t Result = epoll_create(size); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(epoll_create, [](FEXCore::Core::CpuStateFrame* Frame, int size) -> uint64_t { + uint64_t Result = epoll_create(size); + SYSCALL_ERRNO(); + }); } } // namespace FEX::HLE diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FD.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FD.cpp index 5b42e0ae5..a137c43dc 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FD.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FD.cpp @@ -31,127 +31,110 @@ $end_info$ namespace FEX::HLE { void RegisterFD(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_FLAGS(poll, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, struct pollfd* fds, nfds_t nfds, int timeout) -> uint64_t { - if (nfds) { - // fds is allowed to be garbage if nfds is zero. - FaultSafeUserMemAccess::VerifyIsWritable(fds, sizeof(struct pollfd) * nfds); - } - uint64_t Result = ::poll(fds, nfds, timeout); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(poll, [](FEXCore::Core::CpuStateFrame* Frame, struct pollfd* fds, nfds_t nfds, int timeout) -> uint64_t { + if (nfds) { + // fds is allowed to be garbage if nfds is zero. + FaultSafeUserMemAccess::VerifyIsWritable(fds, sizeof(struct pollfd) * nfds); + } + uint64_t Result = ::poll(fds, nfds, timeout); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(open, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, int flags, uint32_t mode) -> uint64_t { - flags = FEX::HLE::RemapFromX86Flags(flags); - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Open(pathname, flags, mode); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(open, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, int flags, uint32_t mode) -> uint64_t { + flags = FEX::HLE::RemapFromX86Flags(flags); + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Open(pathname, flags, mode); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(close, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int fd) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Close(fd); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(close, [](FEXCore::Core::CpuStateFrame* Frame, int fd) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Close(fd); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(chown, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t { - uint64_t Result = ::chown(pathname, owner, group); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(chown, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t { + uint64_t Result = ::chown(pathname, owner, group); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(lchown, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t { - uint64_t Result = ::lchown(pathname, owner, group); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(lchown, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, uid_t owner, gid_t group) -> uint64_t { + uint64_t Result = ::lchown(pathname, owner, group); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(access, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, int mode) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Access(pathname, mode); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(access, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, int mode) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Access(pathname, mode); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(pipe, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int pipefd[2]) -> uint64_t { - uint64_t Result = ::pipe(pipefd); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(pipe, [](FEXCore::Core::CpuStateFrame* Frame, int pipefd[2]) -> uint64_t { + uint64_t Result = ::pipe(pipefd); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(dup3, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int oldfd, int newfd, int flags) -> uint64_t { - flags = FEX::HLE::RemapFromX86Flags(flags); - uint64_t Result = ::dup3(oldfd, newfd, flags); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(dup3, [](FEXCore::Core::CpuStateFrame* Frame, int oldfd, int newfd, int flags) -> uint64_t { + flags = FEX::HLE::RemapFromX86Flags(flags); + uint64_t Result = ::dup3(oldfd, newfd, flags); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(inotify_init, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { - uint64_t Result = ::inotify_init(); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(inotify_init, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { + uint64_t Result = ::inotify_init(); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(openat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int dirfs, const char* pathname, int flags, uint32_t mode) -> uint64_t { - flags = FEX::HLE::RemapFromX86Flags(flags); - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Openat(dirfs, pathname, flags, mode); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(openat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfs, const char* pathname, int flags, uint32_t mode) -> uint64_t { + flags = FEX::HLE::RemapFromX86Flags(flags); + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Openat(dirfs, pathname, flags, mode); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(readlinkat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, char* buf, size_t bufsiz) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Readlinkat(dirfd, pathname, buf, bufsiz); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(readlinkat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, char* buf, size_t bufsiz) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Readlinkat(dirfd, pathname, buf, bufsiz); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(faccessat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int mode) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.FAccessat(dirfd, pathname, mode); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(faccessat, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int mode) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.FAccessat(dirfd, pathname, mode); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(faccessat2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int mode, int flags) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.FAccessat2(dirfd, pathname, mode, flags); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(faccessat2, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int mode, int flags) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.FAccessat2(dirfd, pathname, mode, flags); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(openat2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int dirfs, const char* pathname, struct open_how* how, size_t usize) -> uint64_t { - open_how HostHow {}; - size_t HostSize = std::min(sizeof(open_how), usize); - memcpy(&HostHow, how, HostSize); + REGISTER_SYSCALL_IMPL( + openat2, [](FEXCore::Core::CpuStateFrame* Frame, int dirfs, const char* pathname, struct open_how* how, size_t usize) -> uint64_t { + open_how HostHow {}; + size_t HostSize = std::min(sizeof(open_how), usize); + memcpy(&HostHow, how, HostSize); - HostHow.flags = FEX::HLE::RemapFromX86Flags(HostHow.flags); - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Openat2(dirfs, pathname, &HostHow, HostSize); - SYSCALL_ERRNO(); - }); + HostHow.flags = FEX::HLE::RemapFromX86Flags(HostHow.flags); + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Openat2(dirfs, pathname, &HostHow, HostSize); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(eventfd, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, uint32_t count) -> uint64_t { - uint64_t Result = ::syscall(SYSCALL_DEF(eventfd2), count, 0); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(eventfd, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t count) -> uint64_t { + uint64_t Result = ::syscall(SYSCALL_DEF(eventfd2), count, 0); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(pipe2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int pipefd[2], int flags) -> uint64_t { - flags = FEX::HLE::RemapFromX86Flags(flags); - uint64_t Result = ::pipe2(pipefd, flags); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(pipe2, [](FEXCore::Core::CpuStateFrame* Frame, int pipefd[2], int flags) -> uint64_t { + flags = FEX::HLE::RemapFromX86Flags(flags); + uint64_t Result = ::pipe2(pipefd, flags); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS( - statx, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int flags, uint32_t mask, struct statx* statxbuf) -> uint64_t { + REGISTER_SYSCALL_IMPL( + statx, [](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, int flags, uint32_t mask, struct statx* statxbuf) -> uint64_t { // Flags don't need remapped uint64_t Result = FEX::HLE::_SyscallHandler->FM.Statx(dirfd, pathname, flags, mask, statxbuf); SYSCALL_ERRNO(); }); - REGISTER_SYSCALL_IMPL_FLAGS(close_range, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, unsigned int first, unsigned int last, unsigned int flags) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.CloseRange(first, last, flags); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(close_range, [](FEXCore::Core::CpuStateFrame* Frame, unsigned int first, unsigned int last, unsigned int flags) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.CloseRange(first, last, flags); + SYSCALL_ERRNO(); + }); } } // namespace FEX::HLE diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FS.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FS.cpp index bf4022505..98fe3d35c 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FS.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FS.cpp @@ -25,65 +25,55 @@ namespace FEX::HLE { void RegisterFS(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_FLAGS(rename, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* oldpath, const char* newpath) -> uint64_t { - uint64_t Result = ::rename(oldpath, newpath); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(rename, [](FEXCore::Core::CpuStateFrame* Frame, const char* oldpath, const char* newpath) -> uint64_t { + uint64_t Result = ::rename(oldpath, newpath); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(mkdir, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t { - uint64_t Result = ::mkdir(pathname, mode); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(mkdir, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t { + uint64_t Result = ::mkdir(pathname, mode); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(rmdir, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname) -> uint64_t { - uint64_t Result = ::rmdir(pathname); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(rmdir, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname) -> uint64_t { + uint64_t Result = ::rmdir(pathname); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(link, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* oldpath, const char* newpath) -> uint64_t { - uint64_t Result = ::link(oldpath, newpath); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(link, [](FEXCore::Core::CpuStateFrame* Frame, const char* oldpath, const char* newpath) -> uint64_t { + uint64_t Result = ::link(oldpath, newpath); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(unlink, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname) -> uint64_t { - uint64_t Result = ::unlink(pathname); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(unlink, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname) -> uint64_t { + uint64_t Result = ::unlink(pathname); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(symlink, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* target, const char* linkpath) -> uint64_t { - uint64_t Result = ::symlink(target, linkpath); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(symlink, [](FEXCore::Core::CpuStateFrame* Frame, const char* target, const char* linkpath) -> uint64_t { + uint64_t Result = ::symlink(target, linkpath); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(readlink, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* buf, size_t bufsiz) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Readlink(pathname, buf, bufsiz); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(readlink, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* buf, size_t bufsiz) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Readlink(pathname, buf, bufsiz); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(chmod, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t { - uint64_t Result = ::chmod(pathname, mode); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(chmod, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t { + uint64_t Result = ::chmod(pathname, mode); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(mknod, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode, dev_t dev) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->FM.Mknod(pathname, mode, dev); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(mknod, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode, dev_t dev) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->FM.Mknod(pathname, mode, dev); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(creat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t { - uint64_t Result = ::creat(pathname, mode); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(creat, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, mode_t mode) -> uint64_t { + uint64_t Result = ::creat(pathname, mode); + SYSCALL_ERRNO(); + }); REGISTER_SYSCALL_IMPL( setxattr, [](FEXCore::Core::CpuStateFrame* Frame, const char* path, const char* name, const void* value, size_t size, int flags) -> uint64_t { diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/IO.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/IO.cpp index 58a9135ca..a2e584ecd 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/IO.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/IO.cpp @@ -19,16 +19,14 @@ namespace FEX::HLE { void RegisterIO(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_FLAGS(iopl, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int level) -> uint64_t { - // Just claim we don't have permission - return -EPERM; - }); + REGISTER_SYSCALL_IMPL(iopl, [](FEXCore::Core::CpuStateFrame* Frame, int level) -> uint64_t { + // Just claim we don't have permission + return -EPERM; + }); - REGISTER_SYSCALL_IMPL_FLAGS(ioperm, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, unsigned long from, unsigned long num, int turn_on) -> uint64_t { - // ioperm not available on our architecture - return -EPERM; - }); + REGISTER_SYSCALL_IMPL(ioperm, [](FEXCore::Core::CpuStateFrame* Frame, unsigned long from, unsigned long num, int turn_on) -> uint64_t { + // ioperm not available on our architecture + return -EPERM; + }); } } // namespace FEX::HLE diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Info.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Info.cpp index b56f9239c..3a9f2ef6a 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Info.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Info.cpp @@ -37,68 +37,65 @@ using cap_user_data_t = void*; void RegisterInfo(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_FLAGS( - uname, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, [](FEXCore::Core::CpuStateFrame* Frame, struct utsname* buf) -> uint64_t { - auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); + REGISTER_SYSCALL_IMPL(uname, [](FEXCore::Core::CpuStateFrame* Frame, struct utsname* buf) -> uint64_t { + auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); - struct utsname Local {}; - if (::uname(&Local) == 0) { - memcpy(buf->nodename, Local.nodename, sizeof(Local.nodename)); - static_assert(sizeof(Local.nodename) <= sizeof(buf->nodename)); - memcpy(buf->domainname, Local.domainname, sizeof(Local.domainname)); - static_assert(sizeof(Local.domainname) <= sizeof(buf->domainname)); - } else { - strcpy(buf->nodename, "FEXCore"); - LogMan::Msg::EFmt("Couldn't determine host nodename. Defaulting to '{}'", buf->nodename); - } - strcpy(buf->sysname, "Linux"); - uint32_t GuestVersion = FEX::HLE::_SyscallHandler->GetGuestKernelVersion(); - if (Thread->persona & UNAME26) { - // Kernel version converts from 6.x.y to 2.6.60+x. - GuestVersion = FEX::HLE::SyscallHandler::KernelVersion(2, 6, 60 + FEX::HLE::SyscallHandler::KernelMinor(GuestVersion)); - } - snprintf(buf->release, sizeof(buf->release), "%d.%d.%d", FEX::HLE::SyscallHandler::KernelMajor(GuestVersion), - FEX::HLE::SyscallHandler::KernelMinor(GuestVersion), FEX::HLE::SyscallHandler::KernelPatch(GuestVersion)); + struct utsname Local {}; + if (::uname(&Local) == 0) { + memcpy(buf->nodename, Local.nodename, sizeof(Local.nodename)); + static_assert(sizeof(Local.nodename) <= sizeof(buf->nodename)); + memcpy(buf->domainname, Local.domainname, sizeof(Local.domainname)); + static_assert(sizeof(Local.domainname) <= sizeof(buf->domainname)); + } else { + strcpy(buf->nodename, "FEXCore"); + LogMan::Msg::EFmt("Couldn't determine host nodename. Defaulting to '{}'", buf->nodename); + } + strcpy(buf->sysname, "Linux"); + uint32_t GuestVersion = FEX::HLE::_SyscallHandler->GetGuestKernelVersion(); + if (Thread->persona & UNAME26) { + // Kernel version converts from 6.x.y to 2.6.60+x. + GuestVersion = FEX::HLE::SyscallHandler::KernelVersion(2, 6, 60 + FEX::HLE::SyscallHandler::KernelMinor(GuestVersion)); + } + snprintf(buf->release, sizeof(buf->release), "%d.%d.%d", FEX::HLE::SyscallHandler::KernelMajor(GuestVersion), + FEX::HLE::SyscallHandler::KernelMinor(GuestVersion), FEX::HLE::SyscallHandler::KernelPatch(GuestVersion)); - const char version[] = "#" GIT_DESCRIBE_STRING " SMP " __DATE__ " " __TIME__; - strcpy(buf->version, version); - static_assert(sizeof(version) <= sizeof(buf->version), "uname version define became too large!"); - if (Thread->persona & PER_LINUX32) { - // Tell the guest that we are a 32bit kernel - strcpy(buf->machine, "i686"); - } else { - // Tell the guest that we are a 64bit kernel - strcpy(buf->machine, "x86_64"); - } - return 0; - }); + const char version[] = "#" GIT_DESCRIBE_STRING " SMP " __DATE__ " " __TIME__; + strcpy(buf->version, version); + static_assert(sizeof(version) <= sizeof(buf->version), "uname version define became too large!"); + if (Thread->persona & PER_LINUX32) { + // Tell the guest that we are a 32bit kernel + strcpy(buf->machine, "i686"); + } else { + // Tell the guest that we are a 64bit kernel + strcpy(buf->machine, "x86_64"); + } + return 0; + }); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(personality, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, uint32_t persona) -> uint64_t { - auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); + REGISTER_SYSCALL_IMPL(personality, [](FEXCore::Core::CpuStateFrame* Frame, uint32_t persona) -> uint64_t { + auto Thread = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); - if (persona == ~0U) { - // Special case, only queries the persona. - return Thread->persona; - } + if (persona == ~0U) { + // Special case, only queries the persona. + return Thread->persona; + } - // Mask off `PER_LINUX32` because AArch64 doesn't support it. - uint32_t NewPersona = persona & ~PER_LINUX32; + // Mask off `PER_LINUX32` because AArch64 doesn't support it. + uint32_t NewPersona = persona & ~PER_LINUX32; - // This syscall can not physically fail with PER_LINUX32 masked off. - // It also can not fail on a real x86 kernel. - (void)::syscall(SYSCALL_DEF(personality), NewPersona); + // This syscall can not physically fail with PER_LINUX32 masked off. + // It also can not fail on a real x86 kernel. + (void)::syscall(SYSCALL_DEF(personality), NewPersona); - // Return the old persona while setting the new one. - auto OldPersona = Thread->persona; - Thread->persona = persona; - return OldPersona; - }); + // Return the old persona while setting the new one. + auto OldPersona = Thread->persona; + Thread->persona = persona; + return OldPersona; + }); - REGISTER_SYSCALL_IMPL_FLAGS(seccomp, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, unsigned int operation, unsigned int flags, void* args) -> uint64_t { - return FEX::HLE::_SyscallHandler->SeccompEmulator.Handle(Frame, operation, flags, args); - }); + REGISTER_SYSCALL_IMPL(seccomp, [](FEXCore::Core::CpuStateFrame* Frame, unsigned int operation, unsigned int flags, void* args) -> uint64_t { + return FEX::HLE::_SyscallHandler->SeccompEmulator.Handle(Frame, operation, flags, args); + }); REGISTER_SYSCALL_IMPL( ptrace, [](FEXCore::Core::CpuStateFrame* Frame, int /*enum __ptrace_request*/ request, pid_t pid, void* addr, void* data) -> uint64_t { uint64_t Result {}; diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Memory.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Memory.cpp index 91e48c300..fd5ddbf76 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Memory.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Memory.cpp @@ -22,20 +22,18 @@ namespace FEX::HLE { void RegisterMemory(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_FLAGS(brk, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, void* addr) -> uint64_t { - uint64_t Result = FEX::HLE::_SyscallHandler->HandleBRK(Frame, addr); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(brk, [](FEXCore::Core::CpuStateFrame* Frame, void* addr) -> uint64_t { + uint64_t Result = FEX::HLE::_SyscallHandler->HandleBRK(Frame, addr); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(madvise, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length, int32_t advice) -> uint64_t { - uint64_t Result = ::madvise(addr, length, advice); + REGISTER_SYSCALL_IMPL(madvise, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length, int32_t advice) -> uint64_t { + uint64_t Result = ::madvise(addr, length, advice); - if (Result != -1) { - FEX::HLE::_SyscallHandler->TrackMadvise(Frame->Thread, (uintptr_t)addr, length, advice); - } - SYSCALL_ERRNO(); - }); + if (Result != -1) { + FEX::HLE::_SyscallHandler->TrackMadvise(Frame->Thread, (uintptr_t)addr, length, advice); + } + SYSCALL_ERRNO(); + }); } } // namespace FEX::HLE diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Passthrough.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Passthrough.cpp index eccf14ec2..933010174 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Passthrough.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Passthrough.cpp @@ -213,349 +213,187 @@ uint64_t SyscallPassthrough7(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, void RegisterCommon(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_PASS_FLAGS(read, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(write, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(lseek, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_yield, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(msync, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mincore, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(shmget, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(shmctl, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getpid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(socket, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(connect, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sendto, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(recvfrom, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(shutdown, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(bind, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(listen, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getsockname, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getpeername, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(socketpair, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(kill, SyscallFlags::DEFAULT, SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(semget, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(msgget, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(msgsnd, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(msgrcv, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(msgctl, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(flock, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fsync, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fdatasync, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(truncate, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(ftruncate, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getcwd, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(chdir, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fchdir, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fchmod, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fchown, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(umask, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(syslog, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(geteuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getegid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setpgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getppid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setsid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setreuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setregid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getgroups, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setgroups, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setresuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getresuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setresgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getresgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getpgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setfsuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setfsgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getsid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(capget, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(capset, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getpriority, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setpriority, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_setparam, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_getparam, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_setscheduler, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_getscheduler, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_get_priority_max, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_get_priority_min, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mlock, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(munlock, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(pivot_root, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(chroot, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sync, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(acct, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mount, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(umount2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(swapon, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(swapoff, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(gettid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fsetxattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fgetxattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(flistxattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fremovexattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(tkill, SyscallFlags::DEFAULT, SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_setaffinity, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_getaffinity, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(io_setup, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(io_destroy, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(io_submit, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(io_cancel, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(remap_file_pages, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(timer_getoverrun, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(timer_delete, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(tgkill, SyscallFlags::DEFAULT, SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mbind, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(set_mempolicy, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(get_mempolicy, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mq_unlink, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(add_key, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(request_key, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(keyctl, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(ioprio_set, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(ioprio_get, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(inotify_add_watch, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(inotify_rm_watch, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(migrate_pages, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mkdirat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mknodat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fchownat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(unlinkat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(renameat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(linkat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(symlinkat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fchmodat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(unshare, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(splice, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(tee, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(move_pages, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(timerfd_create, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(accept4, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(eventfd2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(epoll_create1, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(inotify_init1, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fanotify_init, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fanotify_mark, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(prlimit_64, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(name_to_handle_at, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(open_by_handle_at, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(syncfs, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(setns, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getcpu, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(kcmp, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_setattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(sched_getattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(renameat2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(getrandom, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(memfd_create, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(membarrier, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mlock2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(copy_file_range, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(pkey_mprotect, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(pkey_alloc, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(pkey_free, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(io_uring_setup, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(io_uring_enter, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(io_uring_register, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(open_tree, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(move_mount, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fsopen, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fsconfig, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fsmount, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(fspick, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(pidfd_open, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(pidfd_getfd, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mount_setattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(quotactl_fd, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(landlock_create_ruleset, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(landlock_add_rule, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(landlock_restrict_self, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(memfd_secret, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(process_mrelease, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(read, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(write, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(lseek, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(sched_yield, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(msync, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(mincore, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(shmget, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(shmctl, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(getpid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(socket, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(connect, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(sendto, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(recvfrom, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(shutdown, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(bind, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(listen, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(getsockname, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(getpeername, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(socketpair, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(kill, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(semget, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(msgget, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(msgsnd, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(msgrcv, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(msgctl, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(flock, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(fsync, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(fdatasync, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(truncate, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(ftruncate, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(getcwd, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(chdir, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(fchdir, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(fchmod, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(fchown, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(umask, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(getuid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(syslog, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(getgid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(setuid, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(setgid, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(geteuid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(getegid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(setpgid, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(getppid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(setsid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(setreuid, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(setregid, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(getgroups, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(setgroups, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(setresuid, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(getresuid, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(setresgid, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(getresgid, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(getpgid, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(setfsuid, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(setfsgid, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(getsid, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(capget, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(capset, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(getpriority, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(setpriority, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(sched_setparam, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(sched_getparam, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(sched_setscheduler, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(sched_getscheduler, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(sched_get_priority_max, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(sched_get_priority_min, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(mlock, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(munlock, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(pivot_root, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(chroot, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(sync, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(acct, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(mount, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(umount2, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(swapon, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(swapoff, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(gettid, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL(fsetxattr, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(fgetxattr, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(flistxattr, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(fremovexattr, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(tkill, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(sched_setaffinity, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(sched_getaffinity, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(io_setup, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(io_destroy, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(io_submit, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(io_cancel, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(remap_file_pages, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(timer_getoverrun, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(timer_delete, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(tgkill, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(mbind, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(set_mempolicy, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(get_mempolicy, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(mq_unlink, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(add_key, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(request_key, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(keyctl, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(ioprio_set, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(ioprio_get, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(inotify_add_watch, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(inotify_rm_watch, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(migrate_pages, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(mkdirat, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(mknodat, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(fchownat, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(unlinkat, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(renameat, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(linkat, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(symlinkat, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(fchmodat, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(unshare, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(splice, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(tee, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(move_pages, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(timerfd_create, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(accept4, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(eventfd2, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(epoll_create1, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(inotify_init1, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(fanotify_init, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(fanotify_mark, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(prlimit_64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(name_to_handle_at, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(open_by_handle_at, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(syncfs, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(setns, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(getcpu, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(kcmp, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(sched_setattr, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(sched_getattr, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(renameat2, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(getrandom, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(memfd_create, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(membarrier, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(mlock2, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(copy_file_range, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(pkey_mprotect, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(pkey_alloc, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(pkey_free, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(io_uring_setup, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(io_uring_enter, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(io_uring_register, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(open_tree, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(move_mount, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(fsopen, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(fsconfig, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(fsmount, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(fspick, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(pidfd_open, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(pidfd_getfd, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(mount_setattr, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(quotactl_fd, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(landlock_create_ruleset, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(landlock_add_rule, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(landlock_restrict_self, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL(memfd_secret, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL(process_mrelease, SyscallPassthrough2); if (Handler->IsHostKernelVersionAtLeast(5, 16, 0)) { - REGISTER_SYSCALL_IMPL_PASS_FLAGS(futex_waitv, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); + REGISTER_SYSCALL_IMPL(futex_waitv, SyscallPassthrough5); } else { REGISTER_SYSCALL_IMPL(futex_waitv, UnimplementedSyscallSafe); } if (Handler->IsHostKernelVersionAtLeast(5, 17, 0)) { - REGISTER_SYSCALL_IMPL_PASS_FLAGS(set_mempolicy_home_node, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(set_mempolicy_home_node, SyscallPassthrough4); } else { REGISTER_SYSCALL_IMPL(set_mempolicy_home_node, UnimplementedSyscallSafe); } if (Handler->IsHostKernelVersionAtLeast(6, 8, 0)) { - REGISTER_SYSCALL_IMPL_PASS_FLAGS(futex_wake, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(futex_wait, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(futex_requeue, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(statmount, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(listmount, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(lsm_get_self_attr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(lsm_set_self_attr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_PASS_FLAGS(lsm_list_modules, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(futex_wake, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(futex_wait, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL(futex_requeue, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(statmount, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(listmount, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(lsm_get_self_attr, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(lsm_set_self_attr, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL(lsm_list_modules, SyscallPassthrough3); } else { REGISTER_SYSCALL_IMPL(futex_wake, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(futex_wait, UnimplementedSyscallSafe); @@ -567,8 +405,7 @@ void RegisterCommon(FEX::HLE::SyscallHandler* Handler) { REGISTER_SYSCALL_IMPL(lsm_list_modules, UnimplementedSyscallSafe); } if (Handler->IsHostKernelVersionAtLeast(6, 10, 0)) { - REGISTER_SYSCALL_IMPL_PASS_FLAGS(mseal, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); + REGISTER_SYSCALL_IMPL(mseal, SyscallPassthrough3); } else { REGISTER_SYSCALL_IMPL(mseal, UnimplementedSyscallSafe); } @@ -578,157 +415,84 @@ namespace x64 { void RegisterPassthrough(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; RegisterCommon(Handler); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(ioctl, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(pread_64, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(pwrite_64, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(readv, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(writev, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(dup, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(nanosleep, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(getitimer, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(setitimer, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(sendfile, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(accept, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(sendmsg, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(recvmsg, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(setsockopt, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(getsockopt, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(wait4, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(semop, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(gettimeofday, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(getrlimit, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(getrusage, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(sysinfo, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(times, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(rt_sigqueueinfo, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(fstatfs, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(sched_rr_get_interval, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(mlockall, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(munlockall, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(adjtimex, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(setrlimit, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(settimeofday, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(readahead, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(futex, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(io_getevents, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(semtimedop, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(timer_create, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(timer_settime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(timer_gettime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(clock_settime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(clock_gettime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(clock_getres, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(clock_nanosleep, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(mq_open, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(mq_timedsend, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(mq_timedreceive, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(mq_notify, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(mq_getsetattr, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(waitid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(pselect6, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(ppoll, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(set_robust_list, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(get_robust_list, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(sync_file_range, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(vmsplice, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(utimensat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(fallocate, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(timerfd_settime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(timerfd_gettime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(preadv, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(pwritev, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(rt_tgsigqueueinfo, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(recvmmsg, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(clock_adjtime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(sendmmsg, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(process_vm_readv, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(process_vm_writev, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(preadv2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(pwritev2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(io_pgetevents, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(pidfd_send_signal, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(process_madvise, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(fadvise64, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(ioctl, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(pread_64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(pwrite_64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(readv, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(writev, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(dup, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X64(nanosleep, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(getitimer, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(setitimer, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(sendfile, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(accept, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(sendmsg, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(recvmsg, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(setsockopt, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(getsockopt, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(wait4, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(semop, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(gettimeofday, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(getrlimit, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(getrusage, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(sysinfo, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X64(times, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X64(rt_sigqueueinfo, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(fstatfs, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(sched_rr_get_interval, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(mlockall, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X64(munlockall, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL_X64(adjtimex, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X64(setrlimit, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(settimeofday, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(readahead, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(futex, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X64(io_getevents, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(semtimedop, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(timer_create, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(timer_settime, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(timer_gettime, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(clock_settime, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(clock_gettime, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(clock_getres, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(clock_nanosleep, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(mq_open, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(mq_timedsend, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(mq_timedreceive, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(mq_notify, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(mq_getsetattr, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(waitid, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(pselect6, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X64(ppoll, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(set_robust_list, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(get_robust_list, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X64(sync_file_range, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(vmsplice, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(utimensat, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(fallocate, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(timerfd_settime, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(timerfd_gettime, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(preadv, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(pwritev, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(rt_tgsigqueueinfo, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(recvmmsg, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(clock_adjtime, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X64(sendmmsg, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(process_vm_readv, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X64(process_vm_writev, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X64(preadv2, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X64(pwritev2, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X64(io_pgetevents, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X64(pidfd_send_signal, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(process_madvise, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X64(fadvise64, SyscallPassthrough4); if (Handler->IsHostKernelVersionAtLeast(6, 5, 0)) { - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(cachestat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(cachestat, SyscallPassthrough4); } else { REGISTER_SYSCALL_IMPL_X64(cachestat, UnimplementedSyscallSafe); } if (Handler->IsHostKernelVersionAtLeast(6, 6, 0)) { - REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(fchmodat2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X64(fchmodat2, SyscallPassthrough4); } else { REGISTER_SYSCALL_IMPL_X64(fchmodat2, UnimplementedSyscallSafe); } @@ -739,79 +503,41 @@ namespace x32 { void RegisterPassthrough(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; RegisterCommon(Handler); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(getuid32, getuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(getgid32, getgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(geteuid32, geteuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(getegid32, getegid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough0); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setreuid32, setreuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setregid32, setregid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(getgroups32, getgroups, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setgroups32, setgroups, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(fchown32, fchown, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setresuid32, setresuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(getresuid32, getresuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setresgid32, setresgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(getresgid32, getresgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough3); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setuid32, setuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setgid32, setgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setfsuid32, setfsuid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(setfsgid32, setfsgid, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough1); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(sendfile64, sendfile, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(clock_gettime64, clock_gettime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(clock_settime64, clock_settime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(clock_adjtime64, clock_adjtime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(clock_getres_time64, clock_getres, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(clock_nanosleep_time64, clock_nanosleep, - SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(timer_gettime64, timer_gettime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(timer_settime64, timer_settime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(timerfd_gettime64, timerfd_gettime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(timerfd_settime64, timerfd_settime, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(utimensat_time64, utimensat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(ppoll_time64, ppoll, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(io_pgetevents_time64, io_pgetevents, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(mq_timedsend_time64, mq_timedsend, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(mq_timedreceive_time64, mq_timedreceive, - SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough5); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(semtimedop_time64, semtimedop, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough4); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(futex_time64, futex, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough6); - REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(sched_rr_get_interval_time64, sched_rr_get_interval, - SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(getuid32, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL_X32(getgid32, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL_X32(geteuid32, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL_X32(getegid32, SyscallPassthrough0); + REGISTER_SYSCALL_IMPL_X32(setreuid32, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(setregid32, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(getgroups32, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(setgroups32, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(fchown32, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X32(setresuid32, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X32(getresuid32, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X32(setresgid32, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X32(getresgid32, SyscallPassthrough3); + REGISTER_SYSCALL_IMPL_X32(setuid32, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X32(setgid32, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X32(setfsuid32, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X32(setfsgid32, SyscallPassthrough1); + REGISTER_SYSCALL_IMPL_X32(sendfile64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X32(clock_gettime64, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(clock_settime64, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(clock_adjtime64, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(clock_getres_time64, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(clock_nanosleep_time64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X32(timer_gettime64, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(timer_settime64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X32(timerfd_gettime64, SyscallPassthrough2); + REGISTER_SYSCALL_IMPL_X32(timerfd_settime64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X32(utimensat_time64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X32(ppoll_time64, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X32(io_pgetevents_time64, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X32(mq_timedsend_time64, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X32(mq_timedreceive_time64, SyscallPassthrough5); + REGISTER_SYSCALL_IMPL_X32(semtimedop_time64, SyscallPassthrough4); + REGISTER_SYSCALL_IMPL_X32(futex_time64, SyscallPassthrough6); + REGISTER_SYSCALL_IMPL_X32(sched_rr_get_interval_time64, SyscallPassthrough2); } } // namespace x32 } // namespace FEX::HLE diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Thread.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Thread.cpp index a93ca7c99..d160be3a1 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Thread.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Thread.cpp @@ -398,127 +398,124 @@ void RegisterThread(FEX::HLE::SyscallHandler* Handler) { FEX_UNREACHABLE; }); - REGISTER_SYSCALL_IMPL_FLAGS(fork, SyscallFlags::DEFAULT, ([](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { - FEX::HLE::clone3_args args {.Type = TypeOfClone::TYPE_CLONE2, - .args = { - .flags = 0, - .pidfd = 0, - .child_tid = 0, - .parent_tid = 0, - .exit_signal = SIGCHLD, - .stack = 0, - .stack_size = 0, - .tls = 0, - .set_tid = 0, - .set_tid_size = 0, - .cgroup = 0, - }}; + REGISTER_SYSCALL_IMPL(fork, ([](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { + FEX::HLE::clone3_args args {.Type = TypeOfClone::TYPE_CLONE2, + .args = { + .flags = 0, + .pidfd = 0, + .child_tid = 0, + .parent_tid = 0, + .exit_signal = SIGCHLD, + .stack = 0, + .stack_size = 0, + .tls = 0, + .set_tid = 0, + .set_tid_size = 0, + .cgroup = 0, + }}; - return ForkGuest(Frame->Thread, Frame, &args); - })); + return ForkGuest(Frame->Thread, Frame, &args); + })); - REGISTER_SYSCALL_IMPL_FLAGS(vfork, SyscallFlags::DEFAULT, ([](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { - FEX::HLE::clone3_args args {.Type = TypeOfClone::TYPE_CLONE2, - .args = { - .flags = CLONE_VFORK, - .pidfd = 0, - .child_tid = 0, - .parent_tid = 0, - .exit_signal = SIGCHLD, - .stack = 0, - .stack_size = 0, - .tls = 0, - .set_tid = 0, - .set_tid_size = 0, - .cgroup = 0, - }}; + REGISTER_SYSCALL_IMPL(vfork, ([](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { + FEX::HLE::clone3_args args {.Type = TypeOfClone::TYPE_CLONE2, + .args = { + .flags = CLONE_VFORK, + .pidfd = 0, + .child_tid = 0, + .parent_tid = 0, + .exit_signal = SIGCHLD, + .stack = 0, + .stack_size = 0, + .tls = 0, + .set_tid = 0, + .set_tid_size = 0, + .cgroup = 0, + }}; - return ForkGuest(Frame->Thread, Frame, &args); - })); + return ForkGuest(Frame->Thread, Frame, &args); + })); - REGISTER_SYSCALL_IMPL_FLAGS(getpgrp, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { - uint64_t Result = ::getpgrp(); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(getpgrp, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { + uint64_t Result = ::getpgrp(); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(clone3, SyscallFlags::DEFAULT, - ([](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::kernel_clone3_args* cl_args, size_t size) -> uint64_t { - FEX::HLE::clone3_args args {}; - args.Type = TypeOfClone::TYPE_CLONE3; - memcpy(&args.args, cl_args, std::min(sizeof(FEX::HLE::kernel_clone3_args), size)); - return CloneHandler(Frame, &args); - })); + REGISTER_SYSCALL_IMPL(clone3, ([](FEXCore::Core::CpuStateFrame* Frame, FEX::HLE::kernel_clone3_args* cl_args, size_t size) -> uint64_t { + FEX::HLE::clone3_args args {}; + args.Type = TypeOfClone::TYPE_CLONE3; + memcpy(&args.args, cl_args, std::min(sizeof(FEX::HLE::kernel_clone3_args), size)); + return CloneHandler(Frame, &args); + })); - REGISTER_SYSCALL_IMPL_FLAGS(exit, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY | SyscallFlags::NORETURN, - [](FEXCore::Core::CpuStateFrame* Frame, int status) -> uint64_t { - // TLS/DTV teardown is something FEX can't control. Disable glibc checking when we leave a pthread. - // Since this thread is hard stopping, we can't track the TLS/DTV teardown in FEX's thread handling. - FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator::HardDisable(); - auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); + REGISTER_SYSCALL_IMPL(exit, [](FEXCore::Core::CpuStateFrame* Frame, int status) -> uint64_t { + // TLS/DTV teardown is something FEX can't control. Disable glibc checking when we leave a pthread. + // Since this thread is hard stopping, we can't track the TLS/DTV teardown in FEX's thread handling. + FEXCore::Allocator::YesIKnowImNotSupposedToUseTheGlibcAllocator::HardDisable(); + auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); - if (ThreadObject->ThreadInfo.clear_child_tid) { - std::atomic* Addr = reinterpret_cast*>(ThreadObject->ThreadInfo.clear_child_tid); - Addr->store(0); - syscall(SYSCALL_DEF(futex), ThreadObject->ThreadInfo.clear_child_tid, FUTEX_WAKE, ~0ULL, 0, 0, 0); - } + if (ThreadObject->ThreadInfo.clear_child_tid) { + std::atomic* Addr = reinterpret_cast*>(ThreadObject->ThreadInfo.clear_child_tid); + Addr->store(0); + syscall(SYSCALL_DEF(futex), ThreadObject->ThreadInfo.clear_child_tid, FUTEX_WAKE, ~0ULL, 0, 0, 0); + } - ThreadObject->StatusCode = status; + ThreadObject->StatusCode = status; - FEX::HLE::_SyscallHandler->UninstallTLSState(ThreadObject); + FEX::HLE::_SyscallHandler->UninstallTLSState(ThreadObject); - if (ThreadObject->ExecutionThread) { - // If this is a pthread based execution thread, then there is more work to be done. - // Delegate final deletion and cleanup to the pthreads Thread management. - FEX::LinuxEmulation::Threads::LongjumpDeallocateAndExit(ThreadObject, status); - } else { - FEX::HLE::_SyscallHandler->TM.DestroyThread(ThreadObject, true); - FEX::LinuxEmulation::Threads::DeallocateStackObjectAndExit(nullptr, status); - } - // This will never be reached - std::terminate(); - }); + if (ThreadObject->ExecutionThread) { + // If this is a pthread based execution thread, then there is more work to be done. + // Delegate final deletion and cleanup to the pthreads Thread management. + FEX::LinuxEmulation::Threads::LongjumpDeallocateAndExit(ThreadObject, status); + } else { + FEX::HLE::_SyscallHandler->TM.DestroyThread(ThreadObject, true); + FEX::LinuxEmulation::Threads::DeallocateStackObjectAndExit(nullptr, status); + } + // This will never be reached + std::terminate(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(prctl, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int option, unsigned long arg2, unsigned long arg3, - unsigned long arg4, unsigned long arg5) -> uint64_t { - uint64_t Result {}; + REGISTER_SYSCALL_IMPL(prctl, + [](FEXCore::Core::CpuStateFrame* Frame, int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, + unsigned long arg5) -> uint64_t { + uint64_t Result {}; #ifndef PR_GET_AUXV #define PR_GET_AUXV 0x41555856 #endif - switch (option) { - case PR_SET_SECCOMP: { - uint32_t Operation {}; - if (arg2 == SECCOMP_MODE_STRICT) Operation = SECCOMP_SET_MODE_STRICT; - if (arg2 == SECCOMP_MODE_FILTER) Operation = SECCOMP_SET_MODE_FILTER; + switch (option) { + case PR_SET_SECCOMP: { + uint32_t Operation {}; + if (arg2 == SECCOMP_MODE_STRICT) Operation = SECCOMP_SET_MODE_STRICT; + if (arg2 == SECCOMP_MODE_FILTER) Operation = SECCOMP_SET_MODE_FILTER; - return FEX::HLE::_SyscallHandler->SeccompEmulator.Handle(Frame, Operation, 0, reinterpret_cast(arg3)); - } - case PR_GET_SECCOMP: return FEX::HLE::_SyscallHandler->SeccompEmulator.GetSeccomp(Frame); - case PR_GET_AUXV: { - if (arg4 || arg5) { - return -EINVAL; - } + return FEX::HLE::_SyscallHandler->SeccompEmulator.Handle(Frame, Operation, 0, reinterpret_cast(arg3)); + } + case PR_GET_SECCOMP: return FEX::HLE::_SyscallHandler->SeccompEmulator.GetSeccomp(Frame); + case PR_GET_AUXV: { + if (arg4 || arg5) { + return -EINVAL; + } - void* addr = reinterpret_cast(arg2); - size_t UserSize = reinterpret_cast(arg3); + void* addr = reinterpret_cast(arg2); + size_t UserSize = reinterpret_cast(arg3); - const auto auxv = FEX::HLE::_SyscallHandler->GetCodeLoader()->GetAuxv(); - const auto auxvBase = auxv.address; - const auto auxvSize = auxv.size; - size_t MinSize = std::min(auxvSize, UserSize); + const auto auxv = FEX::HLE::_SyscallHandler->GetCodeLoader()->GetAuxv(); + const auto auxvBase = auxv.address; + const auto auxvSize = auxv.size; + size_t MinSize = std::min(auxvSize, UserSize); - memcpy(addr, reinterpret_cast(auxvBase), MinSize); + memcpy(addr, reinterpret_cast(auxvBase), MinSize); - // Returns the size of auxv without truncation. - return auxvSize; - } - default: Result = ::prctl(option, arg2, arg3, arg4, arg5); break; - } - SYSCALL_ERRNO(); - }); + // Returns the size of auxv without truncation. + return auxvSize; + } + default: Result = ::prctl(option, arg2, arg3, arg4, arg5); break; + } + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(arch_prctl, SyscallFlags::DEFAULT, [](FEXCore::Core::CpuStateFrame* Frame, int code, unsigned long addr) -> uint64_t { + REGISTER_SYSCALL_IMPL(arch_prctl, [](FEXCore::Core::CpuStateFrame* Frame, int code, unsigned long addr) -> uint64_t { uint64_t Result {}; switch (code) { case 0x1001: // ARCH_SET_GS @@ -562,22 +559,20 @@ void RegisterThread(FEX::HLE::SyscallHandler* Handler) { SYSCALL_ERRNO(); }); - REGISTER_SYSCALL_IMPL_FLAGS(set_tid_address, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, int* tidptr) -> uint64_t { - auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); - ThreadObject->ThreadInfo.clear_child_tid = tidptr; - return ThreadObject->ThreadInfo.TID; - }); + REGISTER_SYSCALL_IMPL(set_tid_address, [](FEXCore::Core::CpuStateFrame* Frame, int* tidptr) -> uint64_t { + auto ThreadObject = FEX::HLE::ThreadManager::GetStateObjectFromCPUState(Frame); + ThreadObject->ThreadInfo.clear_child_tid = tidptr; + return ThreadObject->ThreadInfo.TID; + }); - REGISTER_SYSCALL_IMPL_FLAGS(exit_group, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY | SyscallFlags::NORETURN, - [](FEXCore::Core::CpuStateFrame* Frame, int status) -> uint64_t { - // Save telemetry if we're exiting. - FEX::HLE::_SyscallHandler->GetSignalDelegator()->SaveTelemetry(); - FEX::HLE::_SyscallHandler->TM.CleanupForExit(); + REGISTER_SYSCALL_IMPL(exit_group, [](FEXCore::Core::CpuStateFrame* Frame, int status) -> uint64_t { + // Save telemetry if we're exiting. + FEX::HLE::_SyscallHandler->GetSignalDelegator()->SaveTelemetry(); + FEX::HLE::_SyscallHandler->TM.CleanupForExit(); - syscall(SYSCALL_DEF(exit_group), status); - // This will never be reached - std::terminate(); - }); + syscall(SYSCALL_DEF(exit_group), status); + // This will never be reached + std::terminate(); + }); } } // namespace FEX::HLE diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Timer.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Timer.cpp index 64bfc775f..059038daf 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Timer.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Timer.cpp @@ -24,16 +24,14 @@ namespace FEX::HLE { void RegisterTimer(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_FLAGS(alarm, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, unsigned int seconds) -> uint64_t { - uint64_t Result = ::alarm(seconds); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(alarm, [](FEXCore::Core::CpuStateFrame* Frame, unsigned int seconds) -> uint64_t { + uint64_t Result = ::alarm(seconds); + SYSCALL_ERRNO(); + }); - REGISTER_SYSCALL_IMPL_FLAGS(pause, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { - uint64_t Result = ::pause(); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL(pause, [](FEXCore::Core::CpuStateFrame* Frame) -> uint64_t { + uint64_t Result = ::pause(); + SYSCALL_ERRNO(); + }); } } // namespace FEX::HLE diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Syscalls.h b/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Syscalls.h index 7b6b09f84..3d4e2d97c 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Syscalls.h +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Syscalls.h @@ -52,7 +52,7 @@ public: return FEX::HLE::SyscallHandler::GuestMunmap(false, Thread, addr, length); } - void RegisterSyscall_32(int SyscallNumber, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, + void RegisterSyscall_32(int SyscallNumber, #ifdef DEBUG_STRACE const fextl::string& TraceFormatString, #endif @@ -63,8 +63,6 @@ public: #endif Def.Ptr = SyscallHandler; Def.NumArgs = ArgumentCount; - Def.Flags = Flags; - Def.HostSyscallNumber = HostSyscallNumber; #ifdef DEBUG_STRACE Def.StraceFmt = TraceFormatString; #endif @@ -87,12 +85,11 @@ fextl::unique_ptr CreateHandler(FEXCore::Context::Cont // Deduces return, args... from the function passed // Does not work with lambas, because they are objects with operator (), not functions template -void RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, - const char* Name, R (*fn)(FEXCore::Core::CpuStateFrame* Frame, Args...)) { +void RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, const char* Name, R (*fn)(FEXCore::Core::CpuStateFrame* Frame, Args...)) { #ifdef DEBUG_STRACE auto TraceFormatString = fextl::string(Name) + "(" + CollectArgsFmtString() + ") = %ld"; #endif - Handler->RegisterSyscall_32(SyscallNumber, HostSyscallNumber, Flags, + Handler->RegisterSyscall_32(SyscallNumber, #ifdef DEBUG_STRACE TraceFormatString, #endif @@ -103,29 +100,14 @@ void RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, int32_t HostSys // Non-capturing lambdas can be cast to function pointers, but this does not happen on argument matching // This is some glue logic that will cast a lambda and call the base RegisterSyscall implementation template -void RegisterSyscall(SyscallHandler* _Handler, int num, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, const char* name, F f) { - RegisterSyscall(_Handler, num, HostSyscallNumber, Flags, name, +f); +void RegisterSyscall(SyscallHandler* _Handler, int num, const char* name, F f) { + RegisterSyscall(_Handler, num, name, +f); } } // namespace FEX::HLE::x32 // Registers syscall for 32bit only -#define REGISTER_SYSCALL_IMPL_X32(name, lambda) REGISTER_SYSCALL_IMPL_X32_INTERNAL(name, ~0, FEXCore::IR::SyscallFlags::DEFAULT, lambda) - -#define REGISTER_SYSCALL_IMPL_X32_PASS(name, lambda) \ - REGISTER_SYSCALL_IMPL_X32_INTERNAL(name, SYSCALL_DEF(name), FEXCore::IR::SyscallFlags::DEFAULT, lambda) - -#define REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL(name, hostname, lambda) \ - REGISTER_SYSCALL_IMPL_X32_INTERNAL(name, SYSCALL_DEF(hostname), FEXCore::IR::SyscallFlags::DEFAULT, lambda) - -#define REGISTER_SYSCALL_IMPL_X32_FLAGS(name, flags, lambda) REGISTER_SYSCALL_IMPL_X32_INTERNAL(name, ~0, flags, lambda) - -#define REGISTER_SYSCALL_IMPL_X32_PASS_FLAGS(name, flags, lambda) REGISTER_SYSCALL_IMPL_X32_INTERNAL(name, SYSCALL_DEF(name), flags, lambda) - -#define REGISTER_SYSCALL_IMPL_X32_PASS_MANUAL_FLAGS(name, hostname, flags, lambda) \ - REGISTER_SYSCALL_IMPL_X32_INTERNAL(name, SYSCALL_DEF(hostname), flags, lambda) - -#define REGISTER_SYSCALL_IMPL_X32_INTERNAL(name, number, flags, lambda) \ - do { \ - FEX::HLE::x32::RegisterSyscall(Handler, x32::SYSCALL_x86_##name, number, flags, #name, lambda); \ +#define REGISTER_SYSCALL_IMPL_X32(name, lambda) \ + do { \ + FEX::HLE::x32::RegisterSyscall(Handler, x32::SYSCALL_x86_##name, #name, lambda); \ } while (false) diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Info.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Info.cpp index 57632063b..61fb61431 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Info.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Info.cpp @@ -19,11 +19,10 @@ void RegisterInfo(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; if (Handler->IsHostKernelVersionAtLeast(6, 6, 0)) { - REGISTER_SYSCALL_IMPL_X64_FLAGS(map_shadow_stack, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, uint64_t addr, uint64_t size, uint32_t flags) -> uint64_t { - // Claim that shadow stack isn't supported. - return -EOPNOTSUPP; - }); + REGISTER_SYSCALL_IMPL_X64(map_shadow_stack, [](FEXCore::Core::CpuStateFrame* Frame, uint64_t addr, uint64_t size, uint32_t flags) -> uint64_t { + // Claim that shadow stack isn't supported. + return -EOPNOTSUPP; + }); } else { REGISTER_SYSCALL_IMPL_X64(map_shadow_stack, UnimplementedSyscallSafe); } diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Memory.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Memory.cpp index c0063280b..994e4873d 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Memory.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Memory.cpp @@ -27,36 +27,30 @@ namespace FEX::HLE::x64 { void RegisterMemory(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_X64_FLAGS( - mmap, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length, int prot, int flags, int fd, off_t offset) -> uint64_t { + REGISTER_SYSCALL_IMPL_X64( + mmap, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length, int prot, int flags, int fd, off_t offset) -> uint64_t { return (uint64_t)FEX::HLE::_SyscallHandler->GuestMmap(Frame->Thread, addr, length, prot, flags, fd, offset); }); - REGISTER_SYSCALL_IMPL_X64_FLAGS(munmap, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length) -> uint64_t { - return FEX::HLE::_SyscallHandler->GuestMunmap(Frame->Thread, addr, length); - }); + REGISTER_SYSCALL_IMPL_X64(munmap, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t length) -> uint64_t { + return FEX::HLE::_SyscallHandler->GuestMunmap(Frame->Thread, addr, length); + }); - REGISTER_SYSCALL_IMPL_X64_FLAGS( - mremap, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) -> uint64_t { + REGISTER_SYSCALL_IMPL_X64( + mremap, [](FEXCore::Core::CpuStateFrame* Frame, void* old_address, size_t old_size, size_t new_size, int flags, void* new_address) -> uint64_t { return FEX::HLE::_SyscallHandler->GuestMremap(true, Frame->Thread, old_address, old_size, new_size, flags, new_address); }); - REGISTER_SYSCALL_IMPL_X64_FLAGS(mprotect, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t len, int prot) -> uint64_t { - return FEX::HLE::_SyscallHandler->GuestMprotect(Frame->Thread, addr, len, prot); - }); + REGISTER_SYSCALL_IMPL_X64(mprotect, [](FEXCore::Core::CpuStateFrame* Frame, void* addr, size_t len, int prot) -> uint64_t { + return FEX::HLE::_SyscallHandler->GuestMprotect(Frame->Thread, addr, len, prot); + }); - REGISTER_SYSCALL_IMPL_X64_FLAGS(shmat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - ([](FEXCore::Core::CpuStateFrame* Frame, int shmid, const void* shmaddr, int shmflg) -> uint64_t { - return FEX::HLE::_SyscallHandler->GuestShmat(true, Frame->Thread, shmid, shmaddr, shmflg); - })); + REGISTER_SYSCALL_IMPL_X64(shmat, ([](FEXCore::Core::CpuStateFrame* Frame, int shmid, const void* shmaddr, int shmflg) -> uint64_t { + return FEX::HLE::_SyscallHandler->GuestShmat(true, Frame->Thread, shmid, shmaddr, shmflg); + })); - REGISTER_SYSCALL_IMPL_X64_FLAGS(shmdt, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, const void* shmaddr) -> uint64_t { - return FEX::HLE::_SyscallHandler->GuestShmdt(true, Frame->Thread, shmaddr); - }); + REGISTER_SYSCALL_IMPL_X64(shmdt, [](FEXCore::Core::CpuStateFrame* Frame, const void* shmaddr) -> uint64_t { + return FEX::HLE::_SyscallHandler->GuestShmdt(true, Frame->Thread, shmaddr); + }); } } // namespace FEX::HLE::x64 diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.cpp index 6e78e50d7..6b7fa1be5 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.cpp @@ -64,9 +64,7 @@ void x64SyscallHandler::RegisterSyscallHandlers() { const SyscallFunctionDefinition InvalidSyscall { .Ptr = reinterpret_cast(&UnimplementedSyscall), - .HostSyscallNumber = SYSCALL_DEF(MAX), .NumArgs = 0, - .Flags = FEXCore::IR::SyscallFlags::DEFAULT, #ifdef DEBUG_STRACE .StraceFmt = "Invalid", #endif diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.h b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.h index 38c43c3b7..f6efab86b 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.h +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Syscalls.h @@ -43,7 +43,7 @@ public: } - void RegisterSyscall_64(int SyscallNumber, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, + void RegisterSyscall_64(int SyscallNumber, #ifdef DEBUG_STRACE const fextl::string& TraceFormatString, #endif @@ -54,8 +54,6 @@ public: #endif Def.Ptr = SyscallHandler; Def.NumArgs = ArgumentCount; - Def.Flags = Flags; - Def.HostSyscallNumber = HostSyscallNumber; #ifdef DEBUG_STRACE Def.StraceFmt = TraceFormatString; #endif @@ -78,12 +76,11 @@ CreateHandler(FEXCore::Context::Context* ctx, FEX::HLE::SignalDelegator* _Signal // Deduces return, args... from the function passed // Does not work with lambas, because they are objects with operator (), not functions template -void RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, - const char* Name, R (*fn)(FEXCore::Core::CpuStateFrame* Frame, Args...)) { +void RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, const char* Name, R (*fn)(FEXCore::Core::CpuStateFrame* Frame, Args...)) { #ifdef DEBUG_STRACE auto TraceFormatString = fextl::string(Name) + "(" + CollectArgsFmtString() + ") = %ld"; #endif - Handler->RegisterSyscall_64(SyscallNumber, HostSyscallNumber, Flags, + Handler->RegisterSyscall_64(SyscallNumber, #ifdef DEBUG_STRACE TraceFormatString, #endif @@ -94,23 +91,14 @@ void RegisterSyscall(SyscallHandler* Handler, int SyscallNumber, int32_t HostSys // Non-capturing lambdas can be cast to function pointers, but this does not happen on argument matching // This is some glue logic that will cast a lambda and call the base RegisterSyscall implementation template -void RegisterSyscall(SyscallHandler* _Handler, int num, int32_t HostSyscallNumber, FEXCore::IR::SyscallFlags Flags, const char* name, F f) { - RegisterSyscall(_Handler, num, HostSyscallNumber, Flags, name, +f); +void RegisterSyscall(SyscallHandler* _Handler, int num, const char* name, F f) { + RegisterSyscall(_Handler, num, name, +f); } } // namespace FEX::HLE::x64 // Registers syscall for 64bit only -#define REGISTER_SYSCALL_IMPL_X64(name, lambda) REGISTER_SYSCALL_IMPL_X64_INTERNAL(name, ~0, FEXCore::IR::SyscallFlags::DEFAULT, lambda) - -#define REGISTER_SYSCALL_IMPL_X64_PASS(name, lambda) \ - REGISTER_SYSCALL_IMPL_X64_INTERNAL(name, SYSCALL_DEF(name), FEXCore::IR::SyscallFlags::DEFAULT, lambda) - -#define REGISTER_SYSCALL_IMPL_X64_FLAGS(name, flags, lambda) REGISTER_SYSCALL_IMPL_X64_INTERNAL(name, ~0, flags, lambda) - -#define REGISTER_SYSCALL_IMPL_X64_PASS_FLAGS(name, flags, lambda) REGISTER_SYSCALL_IMPL_X64_INTERNAL(name, SYSCALL_DEF(name), flags, lambda) - -#define REGISTER_SYSCALL_IMPL_X64_INTERNAL(name, number, flags, lambda) \ - do { \ - FEX::HLE::x64::RegisterSyscall(Handler, x64::SYSCALL_x64_##name, (number), (flags), #name, (lambda)); \ +#define REGISTER_SYSCALL_IMPL_X64(name, lambda) \ + do { \ + FEX::HLE::x64::RegisterSyscall(Handler, x64::SYSCALL_x64_##name, #name, (lambda)); \ } while (false) diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Thread.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Thread.cpp index 6485077c2..d4a7ebbe8 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Thread.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Thread.cpp @@ -243,9 +243,8 @@ void RegisterThread(FEX::HLE::SyscallHandler* Handler) { } }); - REGISTER_SYSCALL_IMPL_X64_FLAGS( - clone, SyscallFlags::DEFAULT, - ([](FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, void* stack, pid_t* parent_tid, pid_t* child_tid, void* tls) -> uint64_t { + REGISTER_SYSCALL_IMPL_X64( + clone, ([](FEXCore::Core::CpuStateFrame* Frame, uint32_t flags, void* stack, pid_t* parent_tid, pid_t* child_tid, void* tls) -> uint64_t { // This is slightly different EFAULT behaviour, if child_tid or parent_tid is invalid then the kernel just doesn't write to the // pointer. Still need to be EFAULT safe although. if ((flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) && child_tid) { @@ -286,65 +285,63 @@ void RegisterThread(FEX::HLE::SyscallHandler* Handler) { // launch a new process under fex // currently does not propagate argv[0] correctly - REGISTER_SYSCALL_IMPL_X64_FLAGS(execve, SyscallFlags::DEFAULT, - [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* const argv[], char* const envp[]) -> uint64_t { - fextl::vector Args; - fextl::vector Envp; + REGISTER_SYSCALL_IMPL_X64(execve, [](FEXCore::Core::CpuStateFrame* Frame, const char* pathname, char* const argv[], char* const envp[]) -> uint64_t { + fextl::vector Args; + fextl::vector Envp; - if (argv) { - for (int i = 0; argv[i]; i++) { - Args.push_back(argv[i]); - } - - Args.push_back(nullptr); - } - - if (envp) { - for (int i = 0; envp[i]; i++) { - Envp.push_back(envp[i]); - } - - Envp.push_back(nullptr); - } - - auto* const* ArgsPtr = argv ? const_cast(Args.data()) : nullptr; - auto* const* EnvpPtr = envp ? const_cast(Envp.data()) : nullptr; - - FEX::HLE::ExecveAtArgs AtArgs = FEX::HLE::ExecveAtArgs::Empty(); - - return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs); - }); - - REGISTER_SYSCALL_IMPL_X64_FLAGS( - execveat, SyscallFlags::DEFAULT, - ([](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, char* const argv[], char* const envp[], int flags) -> uint64_t { - fextl::vector Args; - fextl::vector Envp; - - if (argv) { - for (int i = 0; argv[i]; i++) { - Args.push_back(argv[i]); - } - - Args.push_back(nullptr); + if (argv) { + for (int i = 0; argv[i]; i++) { + Args.push_back(argv[i]); } - if (envp) { - for (int i = 0; envp[i]; i++) { - Envp.push_back(envp[i]); - } + Args.push_back(nullptr); + } - Envp.push_back(nullptr); + if (envp) { + for (int i = 0; envp[i]; i++) { + Envp.push_back(envp[i]); } - FEX::HLE::ExecveAtArgs AtArgs { - .dirfd = dirfd, - .flags = flags, - }; + Envp.push_back(nullptr); + } - auto* const* ArgsPtr = argv ? const_cast(Args.data()) : nullptr; - auto* const* EnvpPtr = envp ? const_cast(Envp.data()) : nullptr; - return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs); - })); + auto* const* ArgsPtr = argv ? const_cast(Args.data()) : nullptr; + auto* const* EnvpPtr = envp ? const_cast(Envp.data()) : nullptr; + + FEX::HLE::ExecveAtArgs AtArgs = FEX::HLE::ExecveAtArgs::Empty(); + + return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs); + }); + + REGISTER_SYSCALL_IMPL_X64(execveat, ([](FEXCore::Core::CpuStateFrame* Frame, int dirfd, const char* pathname, char* const argv[], + char* const envp[], int flags) -> uint64_t { + fextl::vector Args; + fextl::vector Envp; + + if (argv) { + for (int i = 0; argv[i]; i++) { + Args.push_back(argv[i]); + } + + Args.push_back(nullptr); + } + + if (envp) { + for (int i = 0; envp[i]; i++) { + Envp.push_back(envp[i]); + } + + Envp.push_back(nullptr); + } + + FEX::HLE::ExecveAtArgs AtArgs { + .dirfd = dirfd, + .flags = flags, + }; + + auto* const* ArgsPtr = argv ? const_cast(Args.data()) : nullptr; + auto* const* EnvpPtr = envp ? const_cast(Envp.data()) : nullptr; + return FEX::HLE::ExecveHandler(Frame, pathname, ArgsPtr, EnvpPtr, AtArgs); + })); } } // namespace FEX::HLE::x64 diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Time.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Time.cpp index 63c862d31..785987256 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Time.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Time.cpp @@ -22,12 +22,11 @@ $end_info$ namespace FEX::HLE::x64 { void RegisterTime(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; - REGISTER_SYSCALL_IMPL_X64_FLAGS(time, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, - [](FEXCore::Core::CpuStateFrame* Frame, time_t* tloc) -> uint64_t { - FaultSafeUserMemAccess::VerifyIsWritableOrNull(tloc, sizeof(time_t)); - uint64_t Result = ::time(tloc); - SYSCALL_ERRNO(); - }); + REGISTER_SYSCALL_IMPL_X64(time, [](FEXCore::Core::CpuStateFrame* Frame, time_t* tloc) -> uint64_t { + FaultSafeUserMemAccess::VerifyIsWritableOrNull(tloc, sizeof(time_t)); + uint64_t Result = ::time(tloc); + SYSCALL_ERRNO(); + }); REGISTER_SYSCALL_IMPL_X64(utime, [](FEXCore::Core::CpuStateFrame* Frame, const char* filename, const struct utimbuf* times) -> uint64_t { FaultSafeUserMemAccess::VerifyIsStringReadable(filename); diff --git a/Source/Windows/ARM64EC/Module.cpp b/Source/Windows/ARM64EC/Module.cpp index cc1332432..b191128a4 100644 --- a/Source/Windows/ARM64EC/Module.cpp +++ b/Source/Windows/ARM64EC/Module.cpp @@ -581,10 +581,6 @@ public: JumpSetStack(KiUserExceptionDispatcher, reinterpret_cast(&DispatchArgs)); } - FEXCore::HLE::SyscallABI GetSyscallABI(uint64_t Syscall) override { - return {.NumArgs = 0, .HasReturn = false, .HostSyscallNumber = -1}; - } - std::optional LookupExecutableFileSection(FEXCore::Core::InternalThreadState&, uint64_t) override { return std::nullopt; } diff --git a/Source/Windows/WOW64/Module.cpp b/Source/Windows/WOW64/Module.cpp index ce3a7458c..9226c208f 100644 --- a/Source/Windows/WOW64/Module.cpp +++ b/Source/Windows/WOW64/Module.cpp @@ -473,10 +473,6 @@ public: return Ret; } - FEXCore::HLE::SyscallABI GetSyscallABI(uint64_t Syscall) override { - return {.NumArgs = 0, .HasReturn = false, .HostSyscallNumber = -1}; - } - std::optional LookupExecutableFileSection(FEXCore::Core::InternalThreadState&, uint64_t) override { return std::nullopt; }