about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-03-13 18:08:55 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-03-13 18:08:55 +0100
commit8905a31469406fee76588ddf36b42bde8358db63 (patch)
treea3d5c4cd61630b43725b65ab9ea1b97228ca9366 /src
parente6fd9c05f1675555342bdb1cd73d0d920c7191a7 (diff)
downloadbox64-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.c33
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