Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linux uprev to v6.6 #3354

Merged
merged 5 commits into from
Jan 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,8 @@ enum Syscalls_Arm64 {
SYSCALL_Arm64_process_mrelease = 448,
SYSCALL_Arm64_futex_waitv = 449,
SYSCALL_Arm64_set_mempolicy_home_node = 450,
SYSCALL_Arm64_cachestat = 451,
SYSCALL_Arm64_fchmodat2 = 452,
SYSCALL_Arm64_MAX = 512,

// Unsupported syscalls on this host
Expand Down Expand Up @@ -464,5 +466,6 @@ enum Syscalls_Arm64 {
SYSCALL_Arm64_epoll_ctl_old = ~0,
SYSCALL_Arm64_epoll_wait_old = ~0,
SYSCALL_Arm64_newfstatat = ~0,
SYSCALL_Arm64_map_shadow_stack = ~0,
};
}
4 changes: 2 additions & 2 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -772,8 +772,8 @@ uint32_t SyscallHandler::CalculateHostKernelVersion() {
}

uint32_t SyscallHandler::CalculateGuestKernelVersion() {
// We currently only emulate a kernel between the ranges of Kernel 5.0.0 and 6.2.0
return std::max(KernelVersion(5, 0), std::min(KernelVersion(6, 2), GetHostKernelVersion()));
// We currently only emulate a kernel between the ranges of Kernel 5.0.0 and 6.6.0
return std::max(KernelVersion(5, 0), std::min(KernelVersion(6, 6), GetHostKernelVersion()));
}

uint64_t SyscallHandler::HandleSyscall(FEXCore::Core::CpuStateFrame *Frame, FEXCore::HLE::SyscallArguments *Args) {
Expand Down
22 changes: 22 additions & 0 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/FD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -411,5 +411,27 @@ namespace FEX::HLE {
else {
REGISTER_SYSCALL_IMPL(process_mrelease, UnimplementedSyscallSafe);
}

if (Handler->IsHostKernelVersionAtLeast(6, 5, 0)) {
REGISTER_SYSCALL_IMPL_PASS_FLAGS(cachestat, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY,
[](FEXCore::Core::CpuStateFrame *Frame, int fd, void* cstat_range, void* cstat, uint32_t flags) -> uint64_t {
uint64_t Result = ::syscall(SYSCALL_DEF(cachestat), fd, cstat_range, cstat, flags);
SYSCALL_ERRNO();
});
}
else {
REGISTER_SYSCALL_IMPL(cachestat, UnimplementedSyscallSafe);
}

if (Handler->IsHostKernelVersionAtLeast(6, 6, 0)) {
REGISTER_SYSCALL_IMPL_PASS_FLAGS(fchmodat2, SyscallFlags::OPTIMIZETHROUGH | SyscallFlags::NOSYNCSTATEONENTRY,
[](FEXCore::Core::CpuStateFrame *Frame, int dirfd, const char *pathname, mode_t mode, uint32_t flags) -> uint64_t {
uint64_t Result = syscall(SYSCALL_DEF(fchmodat2), dirfd, pathname, mode, flags);
SYSCALL_ERRNO();
});
}
else {
REGISTER_SYSCALL_IMPL(fchmodat2, UnimplementedSyscallSafe);
}
}
}
22 changes: 22 additions & 0 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/Syscalls/Thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ tags: LinuxSyscalls|syscalls-shared
#include "LinuxSyscalls/x32/Thread.h"

#include <FEXCore/Core/Context.h>
#include <FEXCore/Core/CodeLoader.h>
#include <FEXCore/Core/X86Enums.h>
#include <FEXCore/Debug/InternalThreadState.h>
#include <FEXCore/IR/IR.h>
Expand Down Expand Up @@ -521,12 +522,33 @@ namespace FEX::HLE {
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{};
#ifndef PR_GET_AUXV
#define PR_GET_AUXV 0x41555856
#endif
switch (option) {
case PR_SET_SECCOMP:
case PR_GET_SECCOMP:
// FEX doesn't support seccomp
return -EINVAL;
break;
case PR_GET_AUXV: {
if (arg4 || arg5) {
return -EINVAL;
}

void* addr = reinterpret_cast<void*>(arg2);
size_t UserSize = reinterpret_cast<size_t>(arg3);

uint64_t auxvBase=0;
uint64_t auxvSize=0;
FEX::HLE::_SyscallHandler->GetCodeLoader()->GetAuxv(auxvBase, auxvSize);
size_t MinSize = std::min(auxvSize, UserSize);

memcpy(addr, reinterpret_cast<void*>(auxvBase), MinSize);

// Returns the size of auxv without truncation.
return auxvSize;
}
default:
Result = ::prctl(option, arg2, arg3, arg4, arg5);
break;
Expand Down
6 changes: 3 additions & 3 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Ioctl/drm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1099,7 +1099,7 @@ FEX_ANNOTATE("fex-match")
FEX_PACKED
fex_drm_msm_wait_fence {
uint32_t fence;
uint32_t pad;
uint32_t flags;
struct fex_drm_msm_timespec timeout;
uint32_t queueid;

Expand All @@ -1108,7 +1108,7 @@ fex_drm_msm_wait_fence {
operator drm_msm_wait_fence() const {
drm_msm_wait_fence val{};
val.fence = fence;
val.pad = pad;
val.flags = flags;
val.timeout = timeout;
val.queueid = queueid;
return val;
Expand All @@ -1117,7 +1117,7 @@ fex_drm_msm_wait_fence {
fex_drm_msm_wait_fence(struct drm_msm_wait_fence val)
: timeout {val.timeout} {
fence = val.fence;
pad = val.pad;
flags = val.flags;
queueid = val.queueid;
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,3 +122,4 @@ _BASIC_META(DRM_IOCTL_SYNCOBJ_TRANSFER)
_BASIC_META(DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL)

_CUSTOM_META(DRM_IOCTL_MODE_GETFB2, DRM_IOWR(0xCE, FEX::HLE::x32::DRM::fex_drm_mode_fb_cmd2))
_BASIC_META(DRM_IOCTL_SYNCOBJ_EVENTFD)
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
_BASIC_META(DRM_IOCTL_NOUVEAU_GETPARAM)
_BASIC_META(DRM_IOCTL_NOUVEAU_CHANNEL_ALLOC)
_BASIC_META(DRM_IOCTL_NOUVEAU_CHANNEL_FREE)
_BASIC_META(DRM_IOCTL_NOUVEAU_SVM_INIT)
_BASIC_META(DRM_IOCTL_NOUVEAU_SVM_BIND)
_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_NEW)
_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_PUSHBUF)
_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_CPU_PREP)
_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_CPU_FINI)
_BASIC_META(DRM_IOCTL_NOUVEAU_GEM_INFO)
_BASIC_META(DRM_IOCTL_NOUVEAU_VM_INIT)
_BASIC_META(DRM_IOCTL_NOUVEAU_VM_BIND)
_BASIC_META(DRM_IOCTL_NOUVEAU_EXEC)
20 changes: 18 additions & 2 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/x32/Socket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,10 @@ namespace FEX::HLE::x32 {
#define SO_DETACH_REUSEPORT_BPF 68
#endif
#ifndef SO_PREFER_BUSY_POLL
#define SO_PREFER_BUSY_POLL 69
#define SO_PREFER_BUSY_POLL 69
#endif
#ifndef SO_BUSY_POLL_BUDGET
#define SO_BUSY_POLL_BUDGET 70
#define SO_BUSY_POLL_BUDGET 70
#endif
#ifndef SO_NETNS_COOKIE
#define SO_NETNS_COOKIE 71
Expand All @@ -97,6 +97,18 @@ namespace FEX::HLE::x32 {
#endif
#ifndef SO_RESERVE_MEM
#define SO_RESERVE_MEM 73
#endif
#ifndef SO_TXREHASH
#define SO_TXREHASH 74
#endif
#ifndef SO_RCVMARK
#define SO_RCVMARK 75
#endif
#ifndef SO_PASSPIDFD
#define SO_PASSPIDFD 76
#endif
#ifndef SO_PEERPIDFD
#define SO_PEERPIDFD 77
#endif

enum SockOp {
Expand Down Expand Up @@ -536,6 +548,10 @@ namespace FEX::HLE::x32 {
case SO_NETNS_COOKIE: // Cookie always returns 64-bit even on 32-bit
case SO_BUF_LOCK:
case SO_RESERVE_MEM:
case SO_TXREHASH:
case SO_RCVMARK:
case SO_PASSPIDFD:
case SO_PEERPIDFD:
default:
Result = ::syscall(SYSCALL_DEF(setsockopt),
sockfd,
Expand Down
2 changes: 2 additions & 0 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/x32/SyscallsEnum.h
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,8 @@ enum Syscalls_x86 {
SYSCALL_x86_process_mrelease = 448,
SYSCALL_x86_futex_waitv = 449,
SYSCALL_x86_set_mempolicy_home_node = 450,
SYSCALL_x86_cachestat = 451,
SYSCALL_x86_fchmodat2 = 452,
SYSCALL_x86_MAX = 512,
};

13 changes: 13 additions & 0 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/x64/Info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ tags: LinuxSyscalls|syscalls-x86-64

namespace FEX::HLE::x64 {
void RegisterInfo(FEX::HLE::SyscallHandler *Handler) {
using namespace FEXCore::IR;

REGISTER_SYSCALL_IMPL_X64_PASS(sysinfo, [](FEXCore::Core::CpuStateFrame *Frame, struct sysinfo *info) -> uint64_t {
uint64_t Result = ::sysinfo(info);
SYSCALL_ERRNO();
Expand All @@ -35,5 +37,16 @@ namespace FEX::HLE::x64 {
uint64_t Result = ::setrlimit(resource, rlim);
SYSCALL_ERRNO();
});

if (Handler->IsHostKernelVersionAtLeast(6, 6, 0)) {
REGISTER_SYSCALL_IMPL_X64_PASS_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;
});
}
else {
REGISTER_SYSCALL_IMPL_X64(map_shadow_stack, UnimplementedSyscallSafe);
}
}
}
3 changes: 3 additions & 0 deletions Source/Tools/LinuxEmulation/LinuxSyscalls/x64/SyscallsEnum.h
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,9 @@ enum Syscalls_x64 {
SYSCALL_x64_process_mrelease = 448,
SYSCALL_x64_futex_waitv = 449,
SYSCALL_x64_set_mempolicy_home_node = 450,
SYSCALL_x64_cachestat = 451,
SYSCALL_x64_fchmodat2 = 452,
SYSCALL_x64_map_shadow_stack = 453,
SYSCALL_x64_MAX = 512,

// Unsupported syscalls on this host
Expand Down
Loading