about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-11-22 23:10:43 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-11-22 23:10:43 +0100
commit99e02f978d3d6b9594d4991b8c95f1b8b0e6b833 (patch)
tree698d54b55a8dc2d8a0a849a08afc9330acb2756b /src
parent89112197d4d4bc35c24b573d92481cd4514149cc (diff)
downloadbox64-99e02f978d3d6b9594d4991b8c95f1b8b0e6b833.tar.gz
box64-99e02f978d3d6b9594d4991b8c95f1b8b0e6b833.zip
Added syscall 63 (for #174)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64syscall.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index 6310da9d..476aff59 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -113,6 +113,7 @@ scwrap_t syscallwrap[] = {
     { 57, __NR_fork, 0 },    // should wrap this one, because of the struct pt_regs (the only arg)?
     #endif
     { 61, __NR_wait4, 4},
+    //{ 63, __NR_uname, 1}, // Needs wrapping, use old_utsname
     { 66, __NR_semctl, 4},
     { 73, __NR_flock, 2},
     #ifdef __NR_getdents
@@ -201,6 +202,14 @@ typedef struct nat_linux_dirent64_s {
     char           d_name[];
 } nat_linux_dirent64_t;
 
+typedef struct old_utsname_s {
+    char sysname[65];
+    char nodename[65];
+    char release[65];
+    char version[65];
+    char machine[65];
+} old_utsname_t;
+
 ssize_t DirentFromDirent64(void* dest, void* source, ssize_t count)
 {
     nat_linux_dirent64_t *src = (nat_linux_dirent64_t*)source;
@@ -348,6 +357,15 @@ void EXPORT x64Syscall(x64emu_t *emu)
             R_RAX = fork();
             break;
         #endif
+        case 63:    //uname
+            {
+                old_utsname_t *old = (old_utsname_t*)R_RDI;
+                struct utsname uts;
+                R_RAX = uname(&uts);
+                memcpy(old, &uts, sizeof(*old)); // old_uts is just missing a field from new_uts
+                strcpy(old->machine, "x86_64");
+            }
+            break;
         #ifndef __NR_getdents
         case 78:
             {
@@ -483,6 +501,15 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
         case 57: 
             return fork();
         #endif
+        case 63:    //uname
+            {
+                old_utsname_t *old = (old_utsname_t*)R_RSI;
+                struct utsname uts;
+                int64_t ret = uname(&uts);
+                memcpy(old, &uts, sizeof(*old));
+                strcpy(old->machine, "x86_64");
+                return ret;
+            }
         #ifndef __NR_getdents
         case 78:
             {