From 3bc4df7295a5c11865be78337c4add04941a7fbe Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 23 Apr 2022 11:56:06 -0700 Subject: [PATCH 1/6] Updates drm headers to v5.17 --- External/drm-headers | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/External/drm-headers b/External/drm-headers index 4d7eed48e..3d2396668 160000 --- a/External/drm-headers +++ b/External/drm-headers @@ -1 +1 @@ -Subproject commit 4d7eed48e834dd3df1e398f6f347e572b007ba0d +Subproject commit 3d23966687114b8cdc8f6560973e7feab1a961ce From 82319c9debe1eceac9901bb258bee31b8086bc65 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 23 Apr 2022 11:56:33 -0700 Subject: [PATCH 2/6] Scripts: Updates generate syscall numbers to support renaming Instead of manually renaming the three syscalls each time, let the script do it automatically. --- Scripts/GenerateSyscallNumbers.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Scripts/GenerateSyscallNumbers.py b/Scripts/GenerateSyscallNumbers.py index fe69987ec..466eada1f 100755 --- a/Scripts/GenerateSyscallNumbers.py +++ b/Scripts/GenerateSyscallNumbers.py @@ -6,6 +6,16 @@ import logging logger = logging.getLogger() logger.setLevel(logging.WARNING) +# Usage of this script is `Scripts/GenerateSyscallNumbers.py ` +# This will then parse the syscall headers and format them in an enum +# Then this will be output in stdout +# This output should then be checked and copied to the following headers, splitting up the enums: +# - Source/Tests/LinuxSyscalls/x32/SyscallsEnum.h +# - Source/Tests/LinuxSyscalls/x64/SyscallsEnum.h +# - Source/Tests/LinuxSyscalls/Arm64/SyscallsEnum.h +# `FEX_Syscalls_Common` is provided in the output as just an indicator for which syscalls are using the common +# syscall interface. + @dataclass class SyscallDefinition: arch: str @@ -44,6 +54,14 @@ Syscallx64File = "/arch/x86/entry/syscalls/syscall_64.tbl" Syscallx86File = "/arch/x86/entry/syscalls/syscall_32.tbl" SyscallArm64File = "/include/uapi/asm-generic/unistd.h" +# Syscall names that had naming conflict with some global definitions +# Renamed to work around that issue +DefinitionRenameDict = { + "pread64": "pread_64", + "pwrite64": "pwrite_64", + "prlimit64": "prlimit_64" +} + Definitions_x64 = [] Definitions_x64_dict = {} Definitions_x86 = [] @@ -86,6 +104,9 @@ def ParseArchSyscalls(Defs, DefsDict, Arch, FilePath, IgnoreArch): else: EntryName = split_text[3] + if Name in DefinitionRenameDict: + Name = DefinitionRenameDict[Name] + Def = SyscallDefinition(Arch, Num, ABI, Name, EntryName) Defs.append(Def) @@ -154,6 +175,9 @@ def ParseCommonArchSyscalls(Defs, DefsDict, Arch, FilePath): ABI = Arch EntryName = split_text[1].strip().split(")")[0] + if Name in DefinitionRenameDict: + Name = DefinitionRenameDict[Name] + Def = SyscallDefinition(Arch, Num, ABI, Name, EntryName) Defs.append(Def) From 458bbf4ef704c53b601d0a3827d8d16585f622e5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 23 Apr 2022 11:57:37 -0700 Subject: [PATCH 3/6] Linux: Updates syscalls for v5.17 --- Source/Tests/LinuxSyscalls/Arm64/SyscallsEnum.h | 1 + Source/Tests/LinuxSyscalls/x32/SyscallsEnum.h | 1 + Source/Tests/LinuxSyscalls/x64/SyscallsEnum.h | 1 + 3 files changed, 3 insertions(+) diff --git a/Source/Tests/LinuxSyscalls/Arm64/SyscallsEnum.h b/Source/Tests/LinuxSyscalls/Arm64/SyscallsEnum.h index abbb3c92c..e54ba14cb 100644 --- a/Source/Tests/LinuxSyscalls/Arm64/SyscallsEnum.h +++ b/Source/Tests/LinuxSyscalls/Arm64/SyscallsEnum.h @@ -335,6 +335,7 @@ enum Syscalls_Arm64 { SYSCALL_Arm64_memfd_secret = 447, SYSCALL_Arm64_process_mrelease = 448, SYSCALL_Arm64_futex_waitv = 449, + SYSCALL_Arm64_set_mempolicy_home_node = 450, SYSCALL_Arm64_MAX = 512, // Unsupported syscalls on this host diff --git a/Source/Tests/LinuxSyscalls/x32/SyscallsEnum.h b/Source/Tests/LinuxSyscalls/x32/SyscallsEnum.h index 341678a22..4925e085d 100644 --- a/Source/Tests/LinuxSyscalls/x32/SyscallsEnum.h +++ b/Source/Tests/LinuxSyscalls/x32/SyscallsEnum.h @@ -464,6 +464,7 @@ enum Syscalls_x86 { SYSCALL_x86_memfd_secret = 447, SYSCALL_x86_process_mrelease = 448, SYSCALL_x86_futex_waitv = 449, + SYSCALL_x86_set_mempolicy_home_node = 450, SYSCALL_x86_MAX = 512, }; diff --git a/Source/Tests/LinuxSyscalls/x64/SyscallsEnum.h b/Source/Tests/LinuxSyscalls/x64/SyscallsEnum.h index 53c05c03d..d7edfbab6 100644 --- a/Source/Tests/LinuxSyscalls/x64/SyscallsEnum.h +++ b/Source/Tests/LinuxSyscalls/x64/SyscallsEnum.h @@ -383,6 +383,7 @@ enum Syscalls_x64 { SYSCALL_x64_memfd_secret = 447, SYSCALL_x64_process_mrelease = 448, SYSCALL_x64_futex_waitv = 449, + SYSCALL_x64_set_mempolicy_home_node = 450, SYSCALL_x64_MAX = 512, // Unsupported syscalls on this host From df5e0e5df988465366a93b0fc4ad86463b19d710 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 23 Apr 2022 11:58:38 -0700 Subject: [PATCH 4/6] Linux: Adds support for new v5.17 syscall --- Source/Tests/LinuxSyscalls/Syscalls.h | 2 +- Source/Tests/LinuxSyscalls/Syscalls/Memory.cpp | 13 ++++++++++++- Source/Tests/LinuxSyscalls/x32/Syscalls.cpp | 2 +- Source/Tests/LinuxSyscalls/x64/Syscalls.cpp | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Source/Tests/LinuxSyscalls/Syscalls.h b/Source/Tests/LinuxSyscalls/Syscalls.h index 00c17c081..ef3be0ff0 100644 --- a/Source/Tests/LinuxSyscalls/Syscalls.h +++ b/Source/Tests/LinuxSyscalls/Syscalls.h @@ -54,7 +54,7 @@ class SignalDelegator; void RegisterIO(); void RegisterIOUring(FEX::HLE::SyscallHandler *const Handler); void RegisterKey(); - void RegisterMemory(); + void RegisterMemory(FEX::HLE::SyscallHandler *const Handler); void RegisterMsg(); void RegisterNamespace(FEX::HLE::SyscallHandler *const Handler); void RegisterNuma(); diff --git a/Source/Tests/LinuxSyscalls/Syscalls/Memory.cpp b/Source/Tests/LinuxSyscalls/Syscalls/Memory.cpp index e9ae51e4c..7b5bb037b 100644 --- a/Source/Tests/LinuxSyscalls/Syscalls/Memory.cpp +++ b/Source/Tests/LinuxSyscalls/Syscalls/Memory.cpp @@ -17,7 +17,7 @@ $end_info$ #include namespace FEX::HLE { - void RegisterMemory() { + void RegisterMemory(FEX::HLE::SyscallHandler *const Handler) { using namespace FEXCore::IR; REGISTER_SYSCALL_IMPL_FLAGS(brk, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, @@ -104,5 +104,16 @@ namespace FEX::HLE { uint64_t Result = syscall(SYSCALL_DEF(membarrier), cmd, flags); SYSCALL_ERRNO(); }); + + if (Handler->IsHostKernelVersionAtLeast(5, 17, 0)) { + REGISTER_SYSCALL_IMPL_PASS_FLAGS(set_mempolicy_home_node, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY, + [](FEXCore::Core::CpuStateFrame *Frame, uint64_t start, uint64_t len, uint64_t home_node, uint64_t flags) -> uint64_t { + uint64_t Result = ::syscall(SYSCALL_DEF(set_mempolicy_home_node), start, len, home_node, flags); + SYSCALL_ERRNO(); + }); + } + else { + REGISTER_SYSCALL_IMPL(set_mempolicy_home_node, UnimplementedSyscallSafe); + } } } diff --git a/Source/Tests/LinuxSyscalls/x32/Syscalls.cpp b/Source/Tests/LinuxSyscalls/x32/Syscalls.cpp index 9fb0ae5a4..87d1eeb76 100644 --- a/Source/Tests/LinuxSyscalls/x32/Syscalls.cpp +++ b/Source/Tests/LinuxSyscalls/x32/Syscalls.cpp @@ -121,7 +121,7 @@ namespace FEX::HLE::x32 { FEX::HLE::RegisterIO(); FEX::HLE::RegisterIOUring(this); FEX::HLE::RegisterKey(); - FEX::HLE::RegisterMemory(); + FEX::HLE::RegisterMemory(this); FEX::HLE::RegisterMsg(); FEX::HLE::RegisterNamespace(this); FEX::HLE::RegisterSched(); diff --git a/Source/Tests/LinuxSyscalls/x64/Syscalls.cpp b/Source/Tests/LinuxSyscalls/x64/Syscalls.cpp index 4c8aa54fd..b9f2125fd 100644 --- a/Source/Tests/LinuxSyscalls/x64/Syscalls.cpp +++ b/Source/Tests/LinuxSyscalls/x64/Syscalls.cpp @@ -113,7 +113,7 @@ namespace FEX::HLE::x64 { FEX::HLE::RegisterIO(); FEX::HLE::RegisterIOUring(this); FEX::HLE::RegisterKey(); - FEX::HLE::RegisterMemory(); + FEX::HLE::RegisterMemory(this); FEX::HLE::RegisterMsg(); FEX::HLE::RegisterNamespace(this); FEX::HLE::RegisterSched(); From cd94a8f0ac3fb8e06958f16ccfdcffe1378198ac Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 23 Apr 2022 11:58:56 -0700 Subject: [PATCH 5/6] Linux: Adds support for new v5.17 virtio IOCTL --- Source/Tests/LinuxSyscalls/x32/Ioctl/virtio_drm.inl | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Tests/LinuxSyscalls/x32/Ioctl/virtio_drm.inl b/Source/Tests/LinuxSyscalls/x32/Ioctl/virtio_drm.inl index 1db95eae9..1e9525e3a 100644 --- a/Source/Tests/LinuxSyscalls/x32/Ioctl/virtio_drm.inl +++ b/Source/Tests/LinuxSyscalls/x32/Ioctl/virtio_drm.inl @@ -8,3 +8,4 @@ _BASIC_META(DRM_IOCTL_VIRTGPU_TRANSFER_TO_HOST) _BASIC_META(DRM_IOCTL_VIRTGPU_WAIT) _BASIC_META(DRM_IOCTL_VIRTGPU_GET_CAPS) _BASIC_META(DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB) +_BASIC_META(DRM_IOCTL_VIRTGPU_CONTEXT_INIT) From 128a24d699c5324d4677eaf3e964b1e211a8e909 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 23 Apr 2022 11:59:18 -0700 Subject: [PATCH 6/6] Linux: Updates supported guest Linux version to v5.17 --- Source/Tests/LinuxSyscalls/Syscalls.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Tests/LinuxSyscalls/Syscalls.cpp b/Source/Tests/LinuxSyscalls/Syscalls.cpp index 7f8aab120..c1c34f395 100644 --- a/Source/Tests/LinuxSyscalls/Syscalls.cpp +++ b/Source/Tests/LinuxSyscalls/Syscalls.cpp @@ -619,8 +619,8 @@ uint32_t SyscallHandler::CalculateHostKernelVersion() { } uint32_t SyscallHandler::CalculateGuestKernelVersion() { - // We currently only emulate a kernel between the ranges of Kernel 5.0.0 and 5.16.0 - return std::max(KernelVersion(5, 0), std::min(KernelVersion(5, 16), GetHostKernelVersion())); + // We currently only emulate a kernel between the ranges of Kernel 5.0.0 and 5.17.0 + return std::max(KernelVersion(5, 0), std::min(KernelVersion(5, 17), GetHostKernelVersion())); } uint64_t SyscallHandler::HandleSyscall(FEXCore::Core::CpuStateFrame *Frame, FEXCore::HLE::SyscallArguments *Args) {