diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-03-13 18:08:55 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-03-13 18:08:55 +0100 |
| commit | 8905a31469406fee76588ddf36b42bde8358db63 (patch) | |
| tree | a3d5c4cd61630b43725b65ab9ea1b97228ca9366 /src | |
| parent | e6fd9c05f1675555342bdb1cd73d0d920c7191a7 (diff) | |
| download | box64-8905a31469406fee76588ddf36b42bde8358db63.tar.gz box64-8905a31469406fee76588ddf36b42bde8358db63.zip | |
[SYSCALL] Fixed/Improved a few syscall (help Go programs)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64syscall.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index a4c77aa1..e9821ec5 100644 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -20,6 +20,7 @@ #include <sys/utsname.h> #include <sys/resource.h> #include <poll.h> +#include <sys/epoll.h> #include "debug.h" #include "box64stack.h" @@ -47,6 +48,7 @@ extern int fchmodat (int __fd, const char *__file, mode_t __mode, int __flag); int of_convert(int flag); int32_t my_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode); ssize_t my_readlink(x64emu_t* emu, void* path, void* buf, size_t sz); +int my_readlinkat(x64emu_t* emu, int fd, void* path, void* buf, size_t bufsize); int my_stat(x64emu_t *emu, void* filename, void* buf); int my_lstat(x64emu_t *emu, void* filename, void* buf); int my_fstat(x64emu_t *emu, int fd, void* buf); @@ -142,7 +144,7 @@ static const scwrap_t syscallwrap[] = { #endif //[58] = {__NR_vfork, 0}, //[59] = {__NR_execve, 3}, - [60] = {__NR_exit, 1}, // Nees wrapping? + [60] = {__NR_exit, 1}, // Needs wrapping? [61] = {__NR_wait4, 4}, [62] = {__NR_kill, 2 }, //[63] = {__NR_uname, 1}, // Needs wrapping, use old_utsname @@ -263,7 +265,7 @@ static const scwrap_t syscallwrap[] = { [264] = {__NR_renameat, 4}, #endif [266] = {__NR_symlinkat, 3}, - [267] = {__NR_readlinkat, 4}, + //[267] = {__NR_readlinkat, 4}, [268] = {__NR_fchmodat, 3}, [270] = {__NR_pselect6, 6}, [272] = {__NR_unshare, 1}, @@ -281,7 +283,9 @@ static const scwrap_t syscallwrap[] = { [288] = {__NR_accept4, 4}, [289] = {__NR_signalfd4, 4}, // this one might need some wrapping [290] = {__NR_eventfd2, 2}, + #ifdef NOALIGN [291] = {__NR_epoll_create1, 1}, + #endif [292] = {__NR_dup3, 3}, [293] = {__NR_pipe2, 2}, [294] = {__NR_inotify_init1, 1}, @@ -472,7 +476,7 @@ void EXPORT x64Syscall(x64emu_t *emu) case 1: S_RAX = syscall(sc, R_RDI); break; case 2: if(s==33) {if(log) snprintf(buff2, 127, " [sys_access(\"%s\", %ld)]", (char*)R_RDI, R_RSI);}; S_RAX = syscall(sc, R_RDI, R_RSI); break; case 3: if(s==42) {if(log) snprintf(buff2, 127, " [sys_connect(%d, %p[type=%d], %d)]", R_EDI, (void*)R_RSI, *(unsigned short*)R_RSI, R_EDX);}; if(s==258) {if(log) snprintf(buff2, 127, " [sys_mkdirat(%d, %s, 0x%x]", R_EDI, (char*)R_RSI, R_EDX);}; S_RAX = syscall(sc, R_RDI, R_RSI, R_RDX); break; - case 4: S_RAX = syscall(sc, R_RDI, R_RSI, R_RDX, R_R10); break; + case 4: if(s==267) S_RAX = syscall(sc, R_RDI, R_RSI, R_RDX, R_R10); break; case 5: S_RAX = syscall(sc, R_RDI, R_RSI, R_RDX, R_R10, R_R8); break; case 6: S_RAX = syscall(sc, R_RDI, R_RSI, R_RDX, R_R10, R_R8, R_R9); break; default: @@ -769,8 +773,10 @@ void EXPORT x64Syscall(x64emu_t *emu) #if !defined(__NR_epoll_ctl) || !defined(NOALIGN) case 233: S_RAX = my_epoll_ctl(emu, S_EDI, S_ESI, S_EDX, (void*)R_R10); - if(S_RAX==-1) + if(S_RAX==-1) { S_RAX = -errno; + if(log) snprintf(buff2, 127, "[err=%d/%s]", errno, strerror(errno)); + } break; #endif #ifndef __NR_inotify_init @@ -789,7 +795,8 @@ void EXPORT x64Syscall(x64emu_t *emu) break; #endif case 262: - S_RAX = my_fstatat(emu, S_RDI, (char*)R_RSI, (void*)R_RDX, S_R10d); + S_RAX = my_fstatat(emu, S_EDI, (char*)R_RSI, (void*)R_RDX, S_R10d); + if (log) snprintf(buff2, 127, "[sys_fstatat %d, \"%s\", %p, 0x%x]", S_EDI, (char*)R_RSI, (void*)R_RDX, S_R10d); if(S_RAX==-1) S_RAX = -errno; break; @@ -800,6 +807,12 @@ void EXPORT x64Syscall(x64emu_t *emu) S_RAX = -errno; break; #endif + case 267: // sys_readlinkat + if(log) snprintf(buff2, 127, " [sys_readlinkat(%d, \"%s\"...]", S_EDI, (void*)R_RSI); + S_RAX = my_readlinkat(emu, S_EDI, (void*)R_RSI, (void*)R_RDX, R_R10); + if(S_RAX==-1) + S_RAX = -errno; + break; #ifndef NOALIGN case 281: // sys_epool_pwait S_RAX = my_epoll_pwait(emu, S_EDI, (void*)R_RSI, S_EDX, S_R10d, (void*)R_R8); @@ -827,6 +840,13 @@ void EXPORT x64Syscall(x64emu_t *emu) S_RAX = -errno; break; #endif + #ifndef NOALIGN + case 291: // sys__epoll_create1 + S_RAX = epoll_create1(of_convert(S_EDI)); + if(S_RAX==-1) + S_RAX = -errno; + break; + #endif case 317: // sys_seccomp R_RAX = 0; // ignoring call break; @@ -1103,10 +1123,11 @@ long EXPORT my_syscall(x64emu_t *emu) case 264: return renameat(S_RSI, (const char*)R_RDX, S_ECX, (const char*)R_R8); #endif + case 267: // sys_readlinkat + return my_readlinkat(emu, S_RSI, (void*)R_RDX, (void*)R_RCX, R_R8); #ifndef NOALIGN case 281: // sys_epool_pwait return my_epoll_pwait(emu, S_ESI, (void*)R_RDX, S_ECX, S_R8d, (void*)R_R9); - break; #endif case 282: // sys_signalfd // need to mask SIGSEGV |