// SPDX-License-Identifier: MIT /* $info$ meta: LinuxSyscalls|syscalls-shared ~ Syscall implementations shared between x86 and x86-64 tags: LinuxSyscalls|syscalls-shared $end_info$ */ #include "LinuxSyscalls/Syscalls.h" #include "LinuxSyscalls/x64/Syscalls.h" #include "LinuxSyscalls/x32/Syscalls.h" #include #include #include namespace FEX::HLE { #ifdef ARCHITECTURE_arm64 template requires (syscall_num != -1) uint64_t SyscallPassthrough0(FEXCore::Core::CpuStateFrame* Frame) { register uint64_t x0 asm("x0"); register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8) : "memory"); return x0; } template requires (syscall_num != -1) uint64_t SyscallPassthrough1(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1) { register uint64_t x0 asm("x0") = arg1; register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8), "r"(x0) : "memory"); return x0; } template requires (syscall_num != -1) uint64_t SyscallPassthrough2(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2) { register uint64_t x0 asm("x0") = arg1; register uint64_t x1 asm("x1") = arg2; register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8), "r"(x0), "r"(x1) : "memory"); return x0; } template requires (syscall_num != -1) uint64_t SyscallPassthrough3(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3) { register uint64_t x0 asm("x0") = arg1; register uint64_t x1 asm("x1") = arg2; register uint64_t x2 asm("x2") = arg3; register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8), "r"(x0), "r"(x1), "r"(x2) : "memory"); return x0; } template requires (syscall_num != -1) uint64_t SyscallPassthrough4(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4) { register uint64_t x0 asm("x0") = arg1; register uint64_t x1 asm("x1") = arg2; register uint64_t x2 asm("x2") = arg3; register uint64_t x3 asm("x3") = arg4; register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3) : "memory"); return x0; } template requires (syscall_num != -1) uint64_t SyscallPassthrough5(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5) { register uint64_t x0 asm("x0") = arg1; register uint64_t x1 asm("x1") = arg2; register uint64_t x2 asm("x2") = arg3; register uint64_t x3 asm("x3") = arg4; register uint64_t x4 asm("x4") = arg5; register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4) : "memory"); return x0; } template requires (syscall_num != -1) uint64_t SyscallPassthrough6(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6) { register uint64_t x0 asm("x0") = arg1; register uint64_t x1 asm("x1") = arg2; register uint64_t x2 asm("x2") = arg3; register uint64_t x3 asm("x3") = arg4; register uint64_t x4 asm("x4") = arg5; register uint64_t x5 asm("x5") = arg6; register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5) : "memory"); return x0; } template requires (syscall_num != -1) uint64_t SyscallPassthrough7(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { register uint64_t x0 asm("x0") = arg1; register uint64_t x1 asm("x1") = arg2; register uint64_t x2 asm("x2") = arg3; register uint64_t x3 asm("x3") = arg4; register uint64_t x4 asm("x4") = arg5; register uint64_t x5 asm("x5") = arg6; register uint64_t x6 asm("x6") = arg7; register int x8 asm("x8") = syscall_num; __asm volatile(R"( svc #0; )" : "=r"(x0) : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5), "r"(x6) : "memory"); return x0; } #else template requires (syscall_num != -1) uint64_t SyscallPassthrough0(FEXCore::Core::CpuStateFrame* Frame) { uint64_t Result = ::syscall(syscall_num); SYSCALL_ERRNO(); } template requires (syscall_num != -1) uint64_t SyscallPassthrough1(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1) { uint64_t Result = ::syscall(syscall_num, arg1); SYSCALL_ERRNO(); } template requires (syscall_num != -1) uint64_t SyscallPassthrough2(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2) { uint64_t Result = ::syscall(syscall_num, arg1, arg2); SYSCALL_ERRNO(); } template requires (syscall_num != -1) uint64_t SyscallPassthrough3(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3) { uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3); SYSCALL_ERRNO(); } template requires (syscall_num != -1) uint64_t SyscallPassthrough4(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4) { uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4); SYSCALL_ERRNO(); } template requires (syscall_num != -1) uint64_t SyscallPassthrough5(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5) { uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4, arg5); SYSCALL_ERRNO(); } template requires (syscall_num != -1) uint64_t SyscallPassthrough6(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6) { uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4, arg5, arg6); SYSCALL_ERRNO(); } template requires (syscall_num != -1) uint64_t SyscallPassthrough7(FEXCore::Core::CpuStateFrame* Frame, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t Result = ::syscall(syscall_num, arg1, arg2, arg3, arg4, arg5, arg6, arg7); SYSCALL_ERRNO(); } #endif void RegisterCommon(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; 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); // io_uring can't be emulated as it can pass `epoll_event` objects around. // These are 12-byte packed structs on x86/x86-64, but on other architectures are 16-byte. // This means the `data` member is at offset 4 on x86, but offset 8 on other architectures, corrupting the data. // The queue data is entirely user-controlled, so we can't rewrite data in any sane fashion. // This is visible with `node.js` as a hang. REGISTER_SYSCALL_IMPL(io_uring_setup, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(io_uring_enter, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(io_uring_register, UnimplementedSyscallSafe); 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(futex_waitv, SyscallPassthrough5); } else { REGISTER_SYSCALL_IMPL(futex_waitv, UnimplementedSyscallSafe); } if (Handler->IsHostKernelVersionAtLeast(5, 17, 0)) { 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(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); REGISTER_SYSCALL_IMPL(futex_requeue, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(statmount, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(listmount, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(lsm_get_self_attr, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(lsm_set_self_attr, UnimplementedSyscallSafe); REGISTER_SYSCALL_IMPL(lsm_list_modules, UnimplementedSyscallSafe); } if (Handler->IsHostKernelVersionAtLeast(6, 10, 0)) { REGISTER_SYSCALL_IMPL(mseal, SyscallPassthrough3); } else { REGISTER_SYSCALL_IMPL(mseal, UnimplementedSyscallSafe); } } namespace x64 { void RegisterPassthrough(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; RegisterCommon(Handler); 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(cachestat, SyscallPassthrough4); } else { REGISTER_SYSCALL_IMPL_X64(cachestat, UnimplementedSyscallSafe); } if (Handler->IsHostKernelVersionAtLeast(6, 6, 0)) { REGISTER_SYSCALL_IMPL_X64(fchmodat2, SyscallPassthrough4); } else { REGISTER_SYSCALL_IMPL_X64(fchmodat2, UnimplementedSyscallSafe); } } } // namespace x64 namespace x32 { void RegisterPassthrough(FEX::HLE::SyscallHandler* Handler) { using namespace FEXCore::IR; RegisterCommon(Handler); 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