diff --git a/External/FEXCore/Source/CMakeLists.txt b/External/FEXCore/Source/CMakeLists.txt index 7556a1d34..e856ef6b8 100644 --- a/External/FEXCore/Source/CMakeLists.txt +++ b/External/FEXCore/Source/CMakeLists.txt @@ -86,8 +86,10 @@ set (SRCS Interface/HLE/Syscalls/Ioctl.cpp Interface/HLE/Syscalls/Memory.cpp Interface/HLE/Syscalls/Numa.cpp - Interface/HLE/Syscalls/SHM.cpp Interface/HLE/Syscalls/Sched.cpp + Interface/HLE/Syscalls/Semaphore.cpp + Interface/HLE/Syscalls/SHM.cpp + Interface/HLE/Syscalls/Signals.cpp Interface/HLE/Syscalls/Socket.cpp Interface/HLE/Syscalls/Thread.cpp Interface/HLE/Syscalls/Time.cpp diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.cpp b/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.cpp index 0fc457011..4c71f088d 100644 --- a/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.cpp +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.cpp @@ -13,6 +13,11 @@ namespace FEXCore::HLE { SYSCALL_ERRNO(); } + uint64_t EPoll_Wait(FEXCore::Core::InternalThreadState *Thread, int epfd, void *events, int maxevents, int timeout) { + uint64_t Result = epoll_wait(epfd, reinterpret_cast(events), maxevents, timeout); + SYSCALL_ERRNO(); + } + uint64_t EPoll_Ctl(FEXCore::Core::InternalThreadState *Thread, int epfd, int op, int fd, void *event) { uint64_t Result = epoll_ctl(epfd, op, fd, reinterpret_cast(event)); SYSCALL_ERRNO(); diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.h b/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.h index 2ce1c4822..c7012e036 100644 --- a/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.h +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/EPoll.h @@ -7,6 +7,7 @@ struct InternalThreadState; namespace FEXCore::HLE { uint64_t EPoll_Create(FEXCore::Core::InternalThreadState *Thread, int flags); + uint64_t EPoll_Wait(FEXCore::Core::InternalThreadState *Thread, int epfd, void *events, int maxevents, int timeout); uint64_t EPoll_Ctl(FEXCore::Core::InternalThreadState *Thread, int epfd, int op, int fd, void *event); uint64_t EPoll_Pwait(FEXCore::Core::InternalThreadState *Thread, int epfd, void *events, int maxevent, int timeout, const void* sigmask); uint64_t EPoll_Create1(FEXCore::Core::InternalThreadState *Thread, int flags); diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.cpp b/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.cpp index 7ed280741..cdce7d473 100644 --- a/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.cpp +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.cpp @@ -25,6 +25,41 @@ namespace FEXCore::HLE { SYSCALL_ERRNO(); } + uint64_t Sched_Setparam(FEXCore::Core::InternalThreadState *Thread, pid_t pid, const struct sched_param *param) { + uint64_t Result = ::sched_setparam(pid, param); + SYSCALL_ERRNO(); + } + + uint64_t Sched_Getparam(FEXCore::Core::InternalThreadState *Thread, pid_t pid, struct sched_param *param) { + uint64_t Result = ::sched_getparam(pid, param); + SYSCALL_ERRNO(); + } + + uint64_t Sched_Setscheduler(FEXCore::Core::InternalThreadState *Thread, pid_t pid, int policy, const struct sched_param *param) { + uint64_t Result = ::sched_setscheduler(pid, policy, param); + SYSCALL_ERRNO(); + } + + uint64_t Sched_Getscheduler(FEXCore::Core::InternalThreadState *Thread, pid_t pid) { + uint64_t Result = ::sched_getscheduler(pid); + SYSCALL_ERRNO(); + } + + uint64_t Sched_Get_priority_max(FEXCore::Core::InternalThreadState *Thread, int policy) { + uint64_t Result = ::sched_get_priority_max(policy); + SYSCALL_ERRNO(); + } + + uint64_t Sched_Get_priority_min(FEXCore::Core::InternalThreadState *Thread, int policy) { + uint64_t Result = ::sched_get_priority_min(policy); + SYSCALL_ERRNO(); + } + + uint64_t Sched_rr_get_interval(FEXCore::Core::InternalThreadState *Thread, pid_t pid, struct timespec *tp) { + uint64_t Result = ::sched_rr_get_interval(pid, tp); + SYSCALL_ERRNO(); + } + uint64_t Sched_Setaffinity(FEXCore::Core::InternalThreadState *Thread, pid_t pid, size_t cpusetsize, const unsigned long *mask) { return 0; } diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.h b/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.h index 86a8790c9..ecf8e3928 100644 --- a/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.h +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/Sched.h @@ -10,6 +10,13 @@ namespace FEXCore::HLE { uint64_t Sched_Yield(FEXCore::Core::InternalThreadState *Thread); uint64_t Getpriority(FEXCore::Core::InternalThreadState *Thread, int which, int who); uint64_t Setpriority(FEXCore::Core::InternalThreadState *Thread, int which, int who, int prio); + uint64_t Sched_Setparam(FEXCore::Core::InternalThreadState *Thread, pid_t pid, const struct sched_param *param); + uint64_t Sched_Getparam(FEXCore::Core::InternalThreadState *Thread, pid_t pid, struct sched_param *param); + uint64_t Sched_Setscheduler(FEXCore::Core::InternalThreadState *Thread, pid_t pid, int policy, const struct sched_param *param); + uint64_t Sched_Getscheduler(FEXCore::Core::InternalThreadState *Thread, pid_t pid); + uint64_t Sched_Get_priority_max(FEXCore::Core::InternalThreadState *Thread, int policy); + uint64_t Sched_Get_priority_min(FEXCore::Core::InternalThreadState *Thread, int policy); + uint64_t Sched_rr_get_interval(FEXCore::Core::InternalThreadState *Thread, pid_t pid, struct timespec *tp); uint64_t Sched_Setaffinity(FEXCore::Core::InternalThreadState *Thread, pid_t pid, size_t cpusetsize, const unsigned long *mask); uint64_t Sched_Getaffinity(FEXCore::Core::InternalThreadState *Thread, pid_t pid, size_t cpusetsize, unsigned long *mask); } diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/Semaphore.cpp b/External/FEXCore/Source/Interface/HLE/Syscalls/Semaphore.cpp new file mode 100644 index 000000000..ede90cdf1 --- /dev/null +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/Semaphore.cpp @@ -0,0 +1,33 @@ +#include "Interface/HLE/Syscalls.h" +#include "Interface/Context/Context.h" +#include "Interface/Core/InternalThreadState.h" + +#include +#include +#include + +namespace FEXCore::Core { +struct InternalThreadState; +} + +namespace FEXCore::HLE { + uint64_t Semget(FEXCore::Core::InternalThreadState *Thread, key_t key, int nsems, int semflg) { + uint64_t Result = ::semget(key, nsems, semflg); + SYSCALL_ERRNO(); + } + + uint64_t Semop(FEXCore::Core::InternalThreadState *Thread, int semid, struct sembuf *sops, size_t nsops) { + uint64_t Result = ::semop(semid, sops, nsops); + SYSCALL_ERRNO(); + } + + uint64_t Semctl(FEXCore::Core::InternalThreadState *Thread, int semid, int semnum, int cmd, void* semun) { + uint64_t Result = ::semctl(semid, semnum, cmd, semun); + SYSCALL_ERRNO(); + } + + uint64_t Semtimedop(FEXCore::Core::InternalThreadState *Thread, int semid, struct sembuf *sops, size_t nsops, const struct timespec *timeout) { + uint64_t Result = ::semtimedop(semid, sops, nsops, timeout); + SYSCALL_ERRNO(); + } +} diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/Semaphore.h b/External/FEXCore/Source/Interface/HLE/Syscalls/Semaphore.h new file mode 100644 index 000000000..aef962855 --- /dev/null +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/Semaphore.h @@ -0,0 +1,16 @@ +#pragma once +#include +#include +#include +#include + +namespace FEXCore::Core { +struct InternalThreadState; +} + +namespace FEXCore::HLE { + uint64_t Semget(FEXCore::Core::InternalThreadState *Thread, key_t key, int nsems, int semflg); + uint64_t Semop(FEXCore::Core::InternalThreadState *Thread, int semid, struct sembuf *sops, size_t nsops); + uint64_t Semctl(FEXCore::Core::InternalThreadState *Thread, int semid, int semnum, int cmd, void* semun); + uint64_t Semtimedop(FEXCore::Core::InternalThreadState *Thread, int semid, struct sembuf *sops, size_t nsops, const struct timespec *timeout); +} diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/Signals.cpp b/External/FEXCore/Source/Interface/HLE/Syscalls/Signals.cpp new file mode 100644 index 000000000..db6cd1708 --- /dev/null +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/Signals.cpp @@ -0,0 +1,24 @@ +#include "Interface/Context/Context.h" +#include "Interface/Core/InternalThreadState.h" +#include "Interface/HLE/Syscalls.h" + +#include + +#include + +namespace FEXCore::HLE { + uint64_t RT_Sigaction(FEXCore::Core::InternalThreadState *Thread, int signum, const struct sigaction *act, struct sigaction *oldact) { + uint64_t Result = ::sigaction(signum, act, oldact); + SYSCALL_ERRNO(); + } + + uint64_t RT_Sigprocmask(FEXCore::Core::InternalThreadState *Thread, int how, const sigset_t *set, sigset_t *oldset) { + uint64_t Result = ::sigprocmask(how, set, oldset); + SYSCALL_ERRNO(); + } + + uint64_t Sigaltstack(FEXCore::Core::InternalThreadState *Thread, const stack_t *ss, stack_t *old_ss) { + uint64_t Result = ::sigaltstack(ss, old_ss); + SYSCALL_ERRNO(); + } +} diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/Signals.h b/External/FEXCore/Source/Interface/HLE/Syscalls/Signals.h new file mode 100644 index 000000000..2f4c66e64 --- /dev/null +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/Signals.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include + +namespace FEXCore::Core { +struct InternalThreadState; +} + +namespace FEXCore::HLE { + uint64_t RT_Sigaction(FEXCore::Core::InternalThreadState *Thread, int signum, const struct sigaction *act, struct sigaction *oldact); + uint64_t RT_Sigprocmask(FEXCore::Core::InternalThreadState *Thread, int how, const sigset_t *set, sigset_t *oldset); + uint64_t Sigaltstack(FEXCore::Core::InternalThreadState *Thread, const stack_t *ss, stack_t *old_ss); +} diff --git a/External/FEXCore/Source/Interface/HLE/x64/Syscalls.cpp b/External/FEXCore/Source/Interface/HLE/x64/Syscalls.cpp index 9d22add6a..fbd0d820a 100644 --- a/External/FEXCore/Source/Interface/HLE/x64/Syscalls.cpp +++ b/External/FEXCore/Source/Interface/HLE/x64/Syscalls.cpp @@ -9,7 +9,9 @@ #include "Interface/HLE/Syscalls/Memory.h" #include "Interface/HLE/Syscalls/Numa.h" #include "Interface/HLE/Syscalls/Sched.h" +#include "Interface/HLE/Syscalls/Semaphore.h" #include "Interface/HLE/Syscalls/SHM.h" +#include "Interface/HLE/Syscalls/Signals.h" #include "Interface/HLE/Syscalls/Socket.h" #include "Interface/HLE/Syscalls/Thread.h" #include "Interface/HLE/Syscalls/Time.h" @@ -234,6 +236,28 @@ void x64SyscallHandler::Strace(FEXCore::HLE::SyscallArguments *Args, uint64_t Re case SYSCALL_UNAME: LogMan::Msg::D("uname ({...}) = %ld", Ret); break; + case SYSCALL_SEMGET: + LogMan::Msg::D("semget(0x%lx, %d, 0x%lx) = %ld", + Args->Argument[1], + Args->Argument[2], + Args->Argument[3], + Ret); + break; + case SYSCALL_SEMOP: + LogMan::Msg::D("semop(%ld, %p, %ld) = %ld", + Args->Argument[1], + Args->Argument[2], + Args->Argument[3], + Ret); + break; + case SYSCALL_SEMCTL: + LogMan::Msg::D("semctl(%ld, %ld, %ld, %p) = %ld", + Args->Argument[1], + Args->Argument[2], + Args->Argument[3], + Args->Argument[4], + Ret); + break; case SYSCALL_SHMDT: LogMan::Msg::D("shmdt(%p)= %ld", Args->Argument[1], Ret); break; @@ -337,6 +361,14 @@ void x64SyscallHandler::Strace(FEXCore::HLE::SyscallArguments *Args, uint64_t Re case SYSCALL_SET_TID_ADDRESS: LogMan::Msg::D("set_tid_address(%p) = %ld", Args->Argument[1], Ret); break; + case SYSCALL_SEMTIMEDOP: + LogMan::Msg::D("semtimedop(%d, %p, %d, %p) = %ld", + Args->Argument[1], + Args->Argument[2], + Args->Argument[3], + Args->Argument[4], + Ret); + break; case SYSCALL_PPOLL: LogMan::Msg::D("ppoll(%p, %d, %p, %p, %d) = %ld", Args->Argument[1], @@ -648,153 +680,165 @@ void x64SyscallHandler::RegisterSyscallHandlers() { } const std::vector> Syscalls = { - {SYSCALL_READ, cvt(&FEXCore::HLE::Read), 3}, - {SYSCALL_WRITE, cvt(&FEXCore::HLE::Write), 3}, - {SYSCALL_OPEN, cvt(&FEXCore::HLE::Open), 3}, - {SYSCALL_CLOSE, cvt(&FEXCore::HLE::Close), 1}, - {SYSCALL_STAT, cvt(&FEXCore::HLE::Stat), 2}, - {SYSCALL_FSTAT, cvt(&FEXCore::HLE::Fstat), 2}, - {SYSCALL_LSTAT, cvt(&FEXCore::HLE::Lstat), 2}, - {SYSCALL_POLL, cvt(&FEXCore::HLE::Poll), 3}, - {SYSCALL_LSEEK, cvt(&FEXCore::HLE::Lseek), 3}, - {SYSCALL_MMAP, cvt(&FEXCore::HLE::Mmap), 6}, - {SYSCALL_MPROTECT, cvt(&FEXCore::HLE::Mprotect), 3}, - {SYSCALL_MUNMAP, cvt(&FEXCore::HLE::Munmap), 2}, - {SYSCALL_BRK, cvt(&FEXCore::HLE::Brk), 1}, - {SYSCALL_RT_SIGACTION, cvt(&NopSuccess), 0}, - {SYSCALL_RT_SIGPROCMASK, cvt(&NopSuccess), 0}, - {SYSCALL_IOCTL, cvt(&FEXCore::HLE::Ioctl), 3}, - {SYSCALL_PREAD64, cvt(&FEXCore::HLE::PRead64), 4}, - {SYSCALL_PWRITE64, cvt(&FEXCore::HLE::PWrite64), 4}, - {SYSCALL_READV, cvt(&FEXCore::HLE::Readv), 3}, - {SYSCALL_WRITEV, cvt(&FEXCore::HLE::Writev), 3}, - {SYSCALL_ACCESS, cvt(&FEXCore::HLE::Access), 2}, - {SYSCALL_PIPE, cvt(&FEXCore::HLE::Pipe), 1}, - {SYSCALL_SELECT, cvt(&FEXCore::HLE::Select), 5}, - {SYSCALL_SCHED_YIELD, cvt(&FEXCore::HLE::Sched_Yield), 0}, - {SYSCALL_MREMAP, cvt(&FEXCore::HLE::Mremap), 5}, - {SYSCALL_MINCORE, cvt(&FEXCore::HLE::Mincore), 3}, - {SYSCALL_MADVISE, cvt(&FEXCore::HLE::Madvise), 3}, - {SYSCALL_SHMGET, cvt(&FEXCore::HLE::Shmget), 3}, - {SYSCALL_SHMAT, cvt(&FEXCore::HLE::Shmat), 3}, - {SYSCALL_SHMCTL, cvt(&FEXCore::HLE::Shmctl), 3}, - {SYSCALL_DUP, cvt(&FEXCore::HLE::Dup), 1}, - {SYSCALL_DUP2, cvt(&FEXCore::HLE::Dup2), 2}, - {SYSCALL_PAUSE, cvt(&NopFail), 0}, - {SYSCALL_NANOSLEEP, cvt(&FEXCore::HLE::Nanosleep), 2}, - {SYSCALL_GETITIMER, cvt(&NopSuccess), 2}, - {SYSCALL_ALARM, cvt(&NopSuccess), 1}, - {SYSCALL_SETITIMER, cvt(&NopSuccess), 3}, - {SYSCALL_GETPID, cvt(&FEXCore::HLE::Getpid), 0}, - {SYSCALL_SOCKET, cvt(&FEXCore::HLE::Socket), 3}, - {SYSCALL_CONNECT, cvt(&FEXCore::HLE::Connect), 3}, - {SYSCALL_SENDTO, cvt(&FEXCore::HLE::Sendto), 6}, - {SYSCALL_RECVFROM, cvt(&FEXCore::HLE::Recvfrom), 6}, - {SYSCALL_SENDMSG, cvt(&FEXCore::HLE::Sendmsg), 3}, - {SYSCALL_RECVMSG, cvt(&FEXCore::HLE::Recvmsg), 3}, - {SYSCALL_SHUTDOWN, cvt(&FEXCore::HLE::Shutdown), 2}, - {SYSCALL_BIND, cvt(&FEXCore::HLE::Bind), 3}, - {SYSCALL_LISTEN, cvt(&FEXCore::HLE::Listen), 2}, - {SYSCALL_GETSOCKNAME, cvt(&FEXCore::HLE::GetSockName), 3}, - {SYSCALL_GETPEERNAME, cvt(&FEXCore::HLE::GetPeerName), 3}, - {SYSCALL_SETSOCKOPT, cvt(&FEXCore::HLE::SetSockOpt), 5}, - {SYSCALL_GETSOCKOPT, cvt(&FEXCore::HLE::GetSockOpt), 5}, - {SYSCALL_CLONE, cvt(&FEXCore::HLE::Clone), 5}, - {SYSCALL_EXECVE, cvt(&FEXCore::HLE::Execve), 3}, - {SYSCALL_EXIT, cvt(&FEXCore::HLE::Exit), 1}, - {SYSCALL_WAIT4, cvt(&FEXCore::HLE::Wait4), 4}, - {SYSCALL_KILL, cvt(&FEXCore::HLE::Kill), 2}, - {SYSCALL_UNAME, cvt(&FEXCore::HLE::Uname), 1}, - {SYSCALL_SHMDT, cvt(&FEXCore::HLE::Shmdt), 1}, - {SYSCALL_FCNTL, cvt(&FEXCore::HLE::Fcntl), 3}, - {SYSCALL_FLOCK, cvt(&FEXCore::HLE::Flock), 2}, - {SYSCALL_FSYNC, cvt(&FEXCore::HLE::Fsync), 1}, - {SYSCALL_FDATASYNC, cvt(&FEXCore::HLE::Fdatasync), 1}, - {SYSCALL_FTRUNCATE, cvt(&FEXCore::HLE::Ftruncate), 2}, - {SYSCALL_GETCWD, cvt(&FEXCore::HLE::Getcwd), 2}, - {SYSCALL_CHDIR, cvt(&FEXCore::HLE::Chdir), 1}, - {SYSCALL_RENAME, cvt(&FEXCore::HLE::Rename), 2}, - {SYSCALL_MKDIR, cvt(&FEXCore::HLE::Mkdir), 2}, - {SYSCALL_RMDIR, cvt(&FEXCore::HLE::Rmdir), 1}, - {SYSCALL_LINK, cvt(&FEXCore::HLE::Link), 2}, - {SYSCALL_UNLINK, cvt(&FEXCore::HLE::Unlink), 1}, - {SYSCALL_READLINK, cvt(&FEXCore::HLE::Readlink), 3}, - {SYSCALL_CHMOD, cvt(&FEXCore::HLE::Chmod), 2}, - {SYSCALL_FCHMOD, cvt(&FEXCore::HLE::Fchmod), 2}, - {SYSCALL_UMASK, cvt(&FEXCore::HLE::Umask), 1}, - {SYSCALL_GETTIMEOFDAY, cvt(&FEXCore::HLE::Gettimeofday), 2}, - {SYSCALL_SYSINFO, cvt(&FEXCore::HLE::Sysinfo), 1}, - {SYSCALL_GETUID, cvt(&FEXCore::HLE::Getuid), 0}, - {SYSCALL_SYSLOG, cvt(&FEXCore::HLE::Syslog), 6}, // XXX: Verify ABI on vaarg - {SYSCALL_GETGID, cvt(&FEXCore::HLE::Getgid), 0}, - {SYSCALL_SETUID, cvt(&FEXCore::HLE::Setuid), 1}, - {SYSCALL_GETEUID, cvt(&FEXCore::HLE::Geteuid), 0}, - {SYSCALL_GETEGID, cvt(&FEXCore::HLE::Getegid), 0}, - {SYSCALL_GETPPID, cvt(&FEXCore::HLE::Getppid), 0}, - {SYSCALL_SETREGID, cvt(&FEXCore::HLE::Setregid), 2}, - {SYSCALL_SETRESUID, cvt(&FEXCore::HLE::Setresuid), 3}, - {SYSCALL_GETRESUID, cvt(&FEXCore::HLE::Getresuid), 3}, - {SYSCALL_SETRESGID, cvt(&FEXCore::HLE::Setresgid), 3}, - {SYSCALL_GETRESGID, cvt(&FEXCore::HLE::Getresgid), 3}, - {SYSCALL_SIGALTSTACK, cvt(&NopSuccess), 2}, - {SYSCALL_MKNOD, cvt(&FEXCore::HLE::Mknod), 3}, - {SYSCALL_PERSONALITY, cvt(&FEXCore::HLE::Personality), 1}, - {SYSCALL_STATFS, cvt(&FEXCore::HLE::Statfs), 2}, - {SYSCALL_FSTATFS, cvt(&FEXCore::HLE::FStatfs), 2}, - {SYSCALL_GETPRIORITY, cvt(&FEXCore::HLE::Getpriority), 2}, - {SYSCALL_SETPRIORITY, cvt(&FEXCore::HLE::Setpriority), 3}, - {SYSCALL_SCHED_SETSCHEDULER, cvt(&NopSuccess), 3}, - {SYSCALL_MLOCK, cvt(&FEXCore::HLE::Mlock), 2}, - {SYSCALL_MUNLOCK, cvt(&FEXCore::HLE::Munlock), 2}, - {SYSCALL_MLOCKALL, cvt(&FEXCore::HLE::Mlockall), 1}, - {SYSCALL_MUNLOCKALL, cvt(&FEXCore::HLE::Mlockall), 0}, - {SYSCALL_PRCTL, cvt(&FEXCore::HLE::Prctl), 5}, - {SYSCALL_ARCH_PRCTL, cvt(&FEXCore::HLE::Arch_Prctl), 2}, - {SYSCALL_GETTID, cvt(&FEXCore::HLE::Gettid), 0}, - {SYSCALL_TIME, cvt(&FEXCore::HLE::Time), 1}, - {SYSCALL_FUTEX, cvt(&FEXCore::HLE::Futex), 6}, - {SYSCALL_SCHED_SETAFFINITY, cvt(&FEXCore::HLE::Sched_Setaffinity), 3}, - {SYSCALL_SCHED_GETAFFINITY, cvt(&FEXCore::HLE::Sched_Getaffinity), 3}, - {SYSCALL_EPOLL_CREATE, cvt(&FEXCore::HLE::EPoll_Create), 1}, - {SYSCALL_GETDENTS64, cvt(&FEXCore::HLE::Getdents64), 3}, - {SYSCALL_FADVISE64, cvt(&FEXCore::HLE::Fadvise64), 4}, - {SYSCALL_TIMER_CREATE, cvt(&FEXCore::HLE::Timer_Create), 3}, - {SYSCALL_TIMER_SETTIME, cvt(&FEXCore::HLE::Timer_Settime), 4}, - {SYSCALL_TIMER_GETTIME, cvt(&FEXCore::HLE::Timer_Gettime), 2}, - {SYSCALL_TIMER_GETOVERRUN, cvt(&FEXCore::HLE::Timer_Getoverrun), 1}, - {SYSCALL_TIMER_DELETE, cvt(&FEXCore::HLE::Timer_Delete), 1}, - {SYSCALL_SET_TID_ADDRESS, cvt(&FEXCore::HLE::Set_tid_address), 1}, - {SYSCALL_CLOCK_GETTIME, cvt(&FEXCore::HLE::Clock_gettime), 2}, - {SYSCALL_CLOCK_GETRES, cvt(&FEXCore::HLE::Clock_getres), 2}, - {SYSCALL_EXIT_GROUP, cvt(&FEXCore::HLE::Exit_group), 1}, - {SYSCALL_EPOLL_CTL, cvt(&FEXCore::HLE::EPoll_Ctl), 4}, - {SYSCALL_TGKILL, cvt(&NopSuccess), 3}, - {SYSCALL_GET_MEMPOLICY, cvt(&FEXCore::HLE::Get_mempolicy), 5}, - {SYSCALL_INOTIFY_INIT, cvt(&FEXCore::HLE::Inotify_init), 0}, - {SYSCALL_INOTIFY_ADD_WATCH, cvt(&FEXCore::HLE::Inotify_add_watch), 3}, - {SYSCALL_INOTIFY_RM_WATCH, cvt(&FEXCore::HLE::Inotify_rm_watch), 2}, - {SYSCALL_OPENAT, cvt(&FEXCore::HLE::Openat), 4}, - {SYSCALL_NEWFSTATAT, cvt(&FEXCore::HLE::NewFStatat), 4}, - {SYSCALL_READLINKAT, cvt(&FEXCore::HLE::Readlinkat), 4}, - {SYSCALL_FACCESSAT, cvt(&FEXCore::HLE::FAccessat), 4}, - {SYSCALL_PPOLL, cvt(&FEXCore::HLE::Ppoll), 5}, - {SYSCALL_SET_ROBUST_LIST, cvt(&FEXCore::HLE::Set_robust_list), 2}, - {SYSCALL_EPOLL_PWAIT, cvt(&FEXCore::HLE::EPoll_Pwait), 5}, - {SYSCALL_TIMERFD_CREATE, cvt(&FEXCore::HLE::Timerfd_Create), 2}, - {SYSCALL_EVENTFD, cvt(&FEXCore::HLE::Eventfd), 2}, - {SYSCALL_EPOLL_CREATE1, cvt(&FEXCore::HLE::EPoll_Create1), 1}, - {SYSCALL_PIPE2, cvt(&FEXCore::HLE::Pipe2), 2}, - {SYSCALL_PRLIMIT64, cvt(&FEXCore::HLE::Prlimit64), 4}, - {SYSCALL_SENDMMSG, cvt(&FEXCore::HLE::Sendmmsg), 4}, - {SYSCALL_GETRANDOM, cvt(&FEXCore::HLE::Getrandom), 3}, - {SYSCALL_MEMFD_CREATE, cvt(&FEXCore::HLE::Memfd_Create), 2}, - {SYSCALL_MLOCK2, cvt(&FEXCore::HLE::Mlock2), 3}, - {SYSCALL_STATX, cvt(&FEXCore::HLE::Statx), 5}, + {SYSCALL_READ, cvt(&FEXCore::HLE::Read), 3}, + {SYSCALL_WRITE, cvt(&FEXCore::HLE::Write), 3}, + {SYSCALL_OPEN, cvt(&FEXCore::HLE::Open), 3}, + {SYSCALL_CLOSE, cvt(&FEXCore::HLE::Close), 1}, + {SYSCALL_STAT, cvt(&FEXCore::HLE::Stat), 2}, + {SYSCALL_FSTAT, cvt(&FEXCore::HLE::Fstat), 2}, + {SYSCALL_LSTAT, cvt(&FEXCore::HLE::Lstat), 2}, + {SYSCALL_POLL, cvt(&FEXCore::HLE::Poll), 3}, + {SYSCALL_LSEEK, cvt(&FEXCore::HLE::Lseek), 3}, + {SYSCALL_MMAP, cvt(&FEXCore::HLE::Mmap), 6}, + {SYSCALL_MPROTECT, cvt(&FEXCore::HLE::Mprotect), 3}, + {SYSCALL_MUNMAP, cvt(&FEXCore::HLE::Munmap), 2}, + {SYSCALL_BRK, cvt(&FEXCore::HLE::Brk), 1}, + {SYSCALL_RT_SIGACTION, cvt(&FEXCore::HLE::RT_Sigaction), 3}, + {SYSCALL_RT_SIGPROCMASK, cvt(&FEXCore::HLE::RT_Sigprocmask), 3}, + {SYSCALL_IOCTL, cvt(&FEXCore::HLE::Ioctl), 3}, + {SYSCALL_PREAD64, cvt(&FEXCore::HLE::PRead64), 4}, + {SYSCALL_PWRITE64, cvt(&FEXCore::HLE::PWrite64), 4}, + {SYSCALL_READV, cvt(&FEXCore::HLE::Readv), 3}, + {SYSCALL_WRITEV, cvt(&FEXCore::HLE::Writev), 3}, + {SYSCALL_ACCESS, cvt(&FEXCore::HLE::Access), 2}, + {SYSCALL_PIPE, cvt(&FEXCore::HLE::Pipe), 1}, + {SYSCALL_SELECT, cvt(&FEXCore::HLE::Select), 5}, + {SYSCALL_SCHED_YIELD, cvt(&FEXCore::HLE::Sched_Yield), 0}, + {SYSCALL_MREMAP, cvt(&FEXCore::HLE::Mremap), 5}, + {SYSCALL_MINCORE, cvt(&FEXCore::HLE::Mincore), 3}, + {SYSCALL_MADVISE, cvt(&FEXCore::HLE::Madvise), 3}, + {SYSCALL_SHMGET, cvt(&FEXCore::HLE::Shmget), 3}, + {SYSCALL_SHMAT, cvt(&FEXCore::HLE::Shmat), 3}, + {SYSCALL_SHMCTL, cvt(&FEXCore::HLE::Shmctl), 3}, + {SYSCALL_DUP, cvt(&FEXCore::HLE::Dup), 1}, + {SYSCALL_DUP2, cvt(&FEXCore::HLE::Dup2), 2}, + {SYSCALL_PAUSE, cvt(&NopFail), 0}, + {SYSCALL_NANOSLEEP, cvt(&FEXCore::HLE::Nanosleep), 2}, + {SYSCALL_GETITIMER, cvt(&NopSuccess), 2}, + {SYSCALL_ALARM, cvt(&NopSuccess), 1}, + {SYSCALL_SETITIMER, cvt(&NopSuccess), 3}, + {SYSCALL_GETPID, cvt(&FEXCore::HLE::Getpid), 0}, + {SYSCALL_SOCKET, cvt(&FEXCore::HLE::Socket), 3}, + {SYSCALL_CONNECT, cvt(&FEXCore::HLE::Connect), 3}, + {SYSCALL_SENDTO, cvt(&FEXCore::HLE::Sendto), 6}, + {SYSCALL_RECVFROM, cvt(&FEXCore::HLE::Recvfrom), 6}, + {SYSCALL_SENDMSG, cvt(&FEXCore::HLE::Sendmsg), 3}, + {SYSCALL_RECVMSG, cvt(&FEXCore::HLE::Recvmsg), 3}, + {SYSCALL_SHUTDOWN, cvt(&FEXCore::HLE::Shutdown), 2}, + {SYSCALL_BIND, cvt(&FEXCore::HLE::Bind), 3}, + {SYSCALL_LISTEN, cvt(&FEXCore::HLE::Listen), 2}, + {SYSCALL_GETSOCKNAME, cvt(&FEXCore::HLE::GetSockName), 3}, + {SYSCALL_GETPEERNAME, cvt(&FEXCore::HLE::GetPeerName), 3}, + {SYSCALL_SETSOCKOPT, cvt(&FEXCore::HLE::SetSockOpt), 5}, + {SYSCALL_GETSOCKOPT, cvt(&FEXCore::HLE::GetSockOpt), 5}, + {SYSCALL_CLONE, cvt(&FEXCore::HLE::Clone), 5}, + {SYSCALL_EXECVE, cvt(&FEXCore::HLE::Execve), 3}, + {SYSCALL_EXIT, cvt(&FEXCore::HLE::Exit), 1}, + {SYSCALL_WAIT4, cvt(&FEXCore::HLE::Wait4), 4}, + {SYSCALL_KILL, cvt(&FEXCore::HLE::Kill), 2}, + {SYSCALL_UNAME, cvt(&FEXCore::HLE::Uname), 1}, + {SYSCALL_SEMGET, cvt(&FEXCore::HLE::Semget), 3}, + {SYSCALL_SEMOP, cvt(&FEXCore::HLE::Semop), 3}, + {SYSCALL_SEMCTL, cvt(&FEXCore::HLE::Semctl), 4}, + {SYSCALL_SHMDT, cvt(&FEXCore::HLE::Shmdt), 1}, + {SYSCALL_FCNTL, cvt(&FEXCore::HLE::Fcntl), 3}, + {SYSCALL_FLOCK, cvt(&FEXCore::HLE::Flock), 2}, + {SYSCALL_FSYNC, cvt(&FEXCore::HLE::Fsync), 1}, + {SYSCALL_FDATASYNC, cvt(&FEXCore::HLE::Fdatasync), 1}, + {SYSCALL_FTRUNCATE, cvt(&FEXCore::HLE::Ftruncate), 2}, + {SYSCALL_GETCWD, cvt(&FEXCore::HLE::Getcwd), 2}, + {SYSCALL_CHDIR, cvt(&FEXCore::HLE::Chdir), 1}, + {SYSCALL_RENAME, cvt(&FEXCore::HLE::Rename), 2}, + {SYSCALL_MKDIR, cvt(&FEXCore::HLE::Mkdir), 2}, + {SYSCALL_RMDIR, cvt(&FEXCore::HLE::Rmdir), 1}, + {SYSCALL_LINK, cvt(&FEXCore::HLE::Link), 2}, + {SYSCALL_UNLINK, cvt(&FEXCore::HLE::Unlink), 1}, + {SYSCALL_READLINK, cvt(&FEXCore::HLE::Readlink), 3}, + {SYSCALL_CHMOD, cvt(&FEXCore::HLE::Chmod), 2}, + {SYSCALL_FCHMOD, cvt(&FEXCore::HLE::Fchmod), 2}, + {SYSCALL_UMASK, cvt(&FEXCore::HLE::Umask), 1}, + {SYSCALL_GETTIMEOFDAY, cvt(&FEXCore::HLE::Gettimeofday), 2}, + {SYSCALL_SYSINFO, cvt(&FEXCore::HLE::Sysinfo), 1}, + {SYSCALL_GETUID, cvt(&FEXCore::HLE::Getuid), 0}, + {SYSCALL_SYSLOG, cvt(&FEXCore::HLE::Syslog), 6}, // XXX: Verify ABI on vaarg + {SYSCALL_GETGID, cvt(&FEXCore::HLE::Getgid), 0}, + {SYSCALL_SETUID, cvt(&FEXCore::HLE::Setuid), 1}, + {SYSCALL_GETEUID, cvt(&FEXCore::HLE::Geteuid), 0}, + {SYSCALL_GETEGID, cvt(&FEXCore::HLE::Getegid), 0}, + {SYSCALL_GETPPID, cvt(&FEXCore::HLE::Getppid), 0}, + {SYSCALL_SETREGID, cvt(&FEXCore::HLE::Setregid), 2}, + {SYSCALL_SETRESUID, cvt(&FEXCore::HLE::Setresuid), 3}, + {SYSCALL_GETRESUID, cvt(&FEXCore::HLE::Getresuid), 3}, + {SYSCALL_SETRESGID, cvt(&FEXCore::HLE::Setresgid), 3}, + {SYSCALL_GETRESGID, cvt(&FEXCore::HLE::Getresgid), 3}, + {SYSCALL_SIGALTSTACK, cvt(&FEXCore::HLE::Sigaltstack), 2}, + {SYSCALL_MKNOD, cvt(&FEXCore::HLE::Mknod), 3}, + {SYSCALL_PERSONALITY, cvt(&FEXCore::HLE::Personality), 1}, + {SYSCALL_STATFS, cvt(&FEXCore::HLE::Statfs), 2}, + {SYSCALL_FSTATFS, cvt(&FEXCore::HLE::FStatfs), 2}, + {SYSCALL_GETPRIORITY, cvt(&FEXCore::HLE::Getpriority), 2}, + {SYSCALL_SETPRIORITY, cvt(&FEXCore::HLE::Setpriority), 3}, + {SYSCALL_SCHED_SETPARAM, cvt(&FEXCore::HLE::Sched_Setparam), 2}, + {SYSCALL_SCHED_GETPARAM, cvt(&FEXCore::HLE::Sched_Getparam), 2}, + {SYSCALL_SCHED_SETSCHEDULER, cvt(&FEXCore::HLE::Sched_Setscheduler), 3}, + {SYSCALL_SCHED_GETSCHEDULER, cvt(&FEXCore::HLE::Sched_Getscheduler), 1}, + {SYSCALL_SCHED_GET_PRIORITY_MAX, cvt(&FEXCore::HLE::Sched_Get_priority_max), 1}, + {SYSCALL_SCHED_GET_PRIORITY_MIN, cvt(&FEXCore::HLE::Sched_Get_priority_min), 1}, + {SYSCALL_SCHED_RR_GET_INTERVAL, cvt(&FEXCore::HLE::Sched_rr_get_interval), 2}, + {SYSCALL_MLOCK, cvt(&FEXCore::HLE::Mlock), 2}, + {SYSCALL_MUNLOCK, cvt(&FEXCore::HLE::Munlock), 2}, + {SYSCALL_MLOCKALL, cvt(&FEXCore::HLE::Mlockall), 1}, + {SYSCALL_MUNLOCKALL, cvt(&FEXCore::HLE::Mlockall), 0}, + {SYSCALL_PRCTL, cvt(&FEXCore::HLE::Prctl), 5}, + {SYSCALL_ARCH_PRCTL, cvt(&FEXCore::HLE::Arch_Prctl), 2}, + {SYSCALL_GETTID, cvt(&FEXCore::HLE::Gettid), 0}, + {SYSCALL_TIME, cvt(&FEXCore::HLE::Time), 1}, + {SYSCALL_FUTEX, cvt(&FEXCore::HLE::Futex), 6}, + {SYSCALL_SCHED_SETAFFINITY, cvt(&FEXCore::HLE::Sched_Setaffinity), 3}, + {SYSCALL_SCHED_GETAFFINITY, cvt(&FEXCore::HLE::Sched_Getaffinity), 3}, + {SYSCALL_EPOLL_CREATE, cvt(&FEXCore::HLE::EPoll_Create), 1}, + {SYSCALL_GETDENTS64, cvt(&FEXCore::HLE::Getdents64), 3}, + {SYSCALL_FADVISE64, cvt(&FEXCore::HLE::Fadvise64), 4}, + {SYSCALL_TIMER_CREATE, cvt(&FEXCore::HLE::Timer_Create), 3}, + {SYSCALL_TIMER_SETTIME, cvt(&FEXCore::HLE::Timer_Settime), 4}, + {SYSCALL_TIMER_GETTIME, cvt(&FEXCore::HLE::Timer_Gettime), 2}, + {SYSCALL_TIMER_GETOVERRUN, cvt(&FEXCore::HLE::Timer_Getoverrun), 1}, + {SYSCALL_TIMER_DELETE, cvt(&FEXCore::HLE::Timer_Delete), 1}, + {SYSCALL_SET_TID_ADDRESS, cvt(&FEXCore::HLE::Set_tid_address), 1}, + {SYSCALL_SEMTIMEDOP, cvt(&FEXCore::HLE::Semtimedop), 4}, + {SYSCALL_CLOCK_GETTIME, cvt(&FEXCore::HLE::Clock_gettime), 2}, + {SYSCALL_CLOCK_GETRES, cvt(&FEXCore::HLE::Clock_getres), 2}, + {SYSCALL_EXIT_GROUP, cvt(&FEXCore::HLE::Exit_group), 1}, + {SYSCALL_EPOLL_WAIT, cvt(&FEXCore::HLE::EPoll_Wait), 4}, + {SYSCALL_EPOLL_CTL, cvt(&FEXCore::HLE::EPoll_Ctl), 4}, + {SYSCALL_TGKILL, cvt(&NopSuccess), 3}, + {SYSCALL_GET_MEMPOLICY, cvt(&FEXCore::HLE::Get_mempolicy), 5}, + {SYSCALL_INOTIFY_INIT, cvt(&FEXCore::HLE::Inotify_init), 0}, + {SYSCALL_INOTIFY_ADD_WATCH, cvt(&FEXCore::HLE::Inotify_add_watch), 3}, + {SYSCALL_INOTIFY_RM_WATCH, cvt(&FEXCore::HLE::Inotify_rm_watch), 2}, + {SYSCALL_OPENAT, cvt(&FEXCore::HLE::Openat), 4}, + {SYSCALL_NEWFSTATAT, cvt(&FEXCore::HLE::NewFStatat), 4}, + {SYSCALL_READLINKAT, cvt(&FEXCore::HLE::Readlinkat), 4}, + {SYSCALL_FACCESSAT, cvt(&FEXCore::HLE::FAccessat), 4}, + {SYSCALL_PPOLL, cvt(&FEXCore::HLE::Ppoll), 5}, + {SYSCALL_SET_ROBUST_LIST, cvt(&FEXCore::HLE::Set_robust_list), 2}, + {SYSCALL_EPOLL_PWAIT, cvt(&FEXCore::HLE::EPoll_Pwait), 5}, + {SYSCALL_TIMERFD_CREATE, cvt(&FEXCore::HLE::Timerfd_Create), 2}, + {SYSCALL_EVENTFD, cvt(&FEXCore::HLE::Eventfd), 2}, + {SYSCALL_EPOLL_CREATE1, cvt(&FEXCore::HLE::EPoll_Create1), 1}, + {SYSCALL_PIPE2, cvt(&FEXCore::HLE::Pipe2), 2}, + {SYSCALL_PRLIMIT64, cvt(&FEXCore::HLE::Prlimit64), 4}, + {SYSCALL_SENDMMSG, cvt(&FEXCore::HLE::Sendmmsg), 4}, + {SYSCALL_GETRANDOM, cvt(&FEXCore::HLE::Getrandom), 3}, + {SYSCALL_MEMFD_CREATE, cvt(&FEXCore::HLE::Memfd_Create), 2}, + {SYSCALL_MLOCK2, cvt(&FEXCore::HLE::Mlock2), 3}, + {SYSCALL_STATX, cvt(&FEXCore::HLE::Statx), 5}, }; // Set all the new definitions for (auto &Syscall : Syscalls) { auto &Def = Definitions.at(std::get<0>(Syscall)); + LogMan::Throw::A(Def.Ptr == cvt(&Unimplemented), "Oops overwriting sysall problem"); Def.Ptr = std::get<1>(Syscall); Def.NumArgs = std::get<2>(Syscall); } diff --git a/External/FEXCore/Source/Interface/HLE/x64/Syscalls.h b/External/FEXCore/Source/Interface/HLE/x64/Syscalls.h index 40336c15d..b373d9aed 100644 --- a/External/FEXCore/Source/Interface/HLE/x64/Syscalls.h +++ b/External/FEXCore/Source/Interface/HLE/x64/Syscalls.h @@ -78,6 +78,9 @@ enum Syscalls { SYSCALL_WAIT4 = 61, ///< __NR_wait4 SYSCALL_KILL = 62, ///< __NR_kill SYSCALL_UNAME = 63, ///< __NR_uname + SYSCALL_SEMGET = 64, ///< __NR_semget + SYSCALL_SEMOP = 65, ///< __NR_semop + SYSCALL_SEMCTL = 66, ///< __NR_semctl SYSCALL_SHMDT = 67, ///< __NR_shmdt SYSCALL_FCNTL = 72, ///< __NR_fcntl SYSCALL_FLOCK = 73, ///< __NR_flock @@ -116,7 +119,13 @@ enum Syscalls { SYSCALL_FSTATFS = 138, ///< __NR_fstatfs SYSCALL_GETPRIORITY = 140, ///< __NR_getpriority SYSCALL_SETPRIORITY = 141, ///< __NR_getpriority + SYSCALL_SCHED_SETPARAM = 142, ///< __NR_sched_setparam + SYSCALL_SCHED_GETPARAM = 143, ///< __NR_sched_getparam SYSCALL_SCHED_SETSCHEDULER = 144, ///< __NR_sched_setscheduler + SYSCALL_SCHED_GETSCHEDULER = 145, ///< __NR_sched_getscheduler + SYSCALL_SCHED_GET_PRIORITY_MAX = 146, ///< __NR_sched_get_priority_max + SYSCALL_SCHED_GET_PRIORITY_MIN = 147, ///< __NR_sched_get_priority_min + SYSCALL_SCHED_RR_GET_INTERVAL = 148, ///< __NR_sched_rr_get_interval SYSCALL_MLOCK = 149, ///< __NR_mlock SYSCALL_MUNLOCK = 150, ///< __NR_munlock SYSCALL_MLOCKALL = 151, ///< __NR_mlockall @@ -129,6 +138,8 @@ enum Syscalls { SYSCALL_SCHED_SETAFFINITY = 203, ///< __NR_sched_setaffinity SYSCALL_SCHED_GETAFFINITY = 204, ///< __NR_sched_getaffinity SYSCALL_EPOLL_CREATE = 213, ///< __NR_epoll_create + SYSCALL_EPOLL_CTL_OLD = 214, ///< __NR_epoll_ctl_old + SYSCALL_EPOLL_WAIT_OLD = 215, ///< __NR_epoll_wait_old SYSCALL_GETDENTS64 = 217, ///< __NR_getdents64 SYSCALL_FADVISE64 = 221, ///< __NR_fadvise64 SYSCALL_TIMER_CREATE = 222, ///< __NR_timer_create @@ -137,9 +148,11 @@ enum Syscalls { SYSCALL_TIMER_GETOVERRUN= 225, ///< __NR_timer_getoverrun SYSCALL_TIMER_DELETE = 226, ///< __NR_timer_delete SYSCALL_SET_TID_ADDRESS = 218, ///< __NR_set_tid_address + SYSCALL_SEMTIMEDOP = 220, ///< __NR_semtimedop SYSCALL_CLOCK_GETTIME = 228, ///< __NR_clock_gettime SYSCALL_CLOCK_GETRES = 229, ///< __NR_clock_getres SYSCALL_EXIT_GROUP = 231, ///< __NR_exit_group + SYSCALL_EPOLL_WAIT = 232, ///< __NR_epoll_wait SYSCALL_EPOLL_CTL = 233, ///< __NR_epoll_ctl SYSCALL_TGKILL = 234, ///< __NR_tgkill SYSCALL_GET_MEMPOLICY = 239, ///< __NR_get_mempolicy