Adds a bunch more syscalls

Some of these are just there to get us farther in some cases. They can
result in behaviour the app isn't expecting like when signals are setup
but not handled correctly.
Is fine for the cases that the app doesn't actually use them.
This commit is contained in:
Ryan Houdek committed 2020-04-17 15:19:09 -07:00
1 parent 46692d72c0
commit 2cac41ee1c
11 files changed
+336 -143

No files matched your search

+3 -1
View File
@@ -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
@@ -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<struct epoll_event*>(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<struct epoll_event*>(event));
SYSCALL_ERRNO();
@@ -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);
@@ -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;
}
@@ -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);
}
@@ -0,0 +1,33 @@
#include "Interface/HLE/Syscalls.h"
#include "Interface/Context/Context.h"
#include "Interface/Core/InternalThreadState.h"
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
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();
}
}
@@ -0,0 +1,16 @@
#pragma once
#include <stdint.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
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);
}
@@ -0,0 +1,24 @@
#include "Interface/Context/Context.h"
#include "Interface/Core/InternalThreadState.h"
#include "Interface/HLE/Syscalls.h"
#include <FEXCore/Core/X86Enums.h>
#include <signal.h>
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();
}
}
@@ -0,0 +1,13 @@
#pragma once
#include <stdint.h>
#include <signal.h>
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);
}
+186 -142
View File
@@ -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<std::tuple<uint16_t, void*, uint8_t>> 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);
}
+13
View File
@@ -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