Skip to content

Commit

Permalink
Merge pull request #3354 from Sonicadvance1/uprev_kernel_2
Browse files Browse the repository at this point in the history
Linux uprev to v6.6
  • Loading branch information
Sonicadvance1 authored Jan 3, 2024
2 parents db7d7a6 + b8b9b2f commit c333aac
Show file tree
Hide file tree
Showing 12 changed files with 96 additions and 8 deletions.
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 @@ -778,8 +778,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 @@ -530,12 +531,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

0 comments on commit c333aac

Please sign in to comment.