about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-04 09:39:25 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-04 09:39:25 +0100
commit1e971dde996e48ceeac556430dcf14e329895e2f (patch)
tree2dbb56b6c8c56a634c129950330854411c5b6820 /src
parentb34a91959037c6e3b50d3c2cfd9f69385cc0a729 (diff)
downloadbox64-1e971dde996e48ceeac556430dcf14e329895e2f.tar.gz
box64-1e971dde996e48ceeac556430dcf14e329895e2f.zip
A bit more work on syscall, to avoid old deprecated ones
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64syscall.c40
-rwxr-xr-xsrc/wrapped/wrappedlibc.c65
2 files changed, 40 insertions, 65 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index 5359939c..2b26e17f 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -29,16 +29,16 @@
 #include "x64trace.h"
 //#include "myalign.h"
 #include "box64context.h"
-//#include "callback.h"
+#include "callback.h"
 //#include "signals.h"
-//#include "x64tls.h"
+#include "x64tls.h"
 
 typedef struct x64_sigaction_s x64_sigaction_t;
 
 
 //int32_t my_getrandom(x64emu_t* emu, void* buf, uint32_t buflen, uint32_t flags);
-//int of_convert(int flag);
-//int32_t my_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode);
+int of_convert(int flag);
+int32_t my_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode);
 
 //int my_sigaction(x64emu_t* emu, int signum, const x86_sigaction_t *act, x86_sigaction_t *oldact);
 //int32_t my_execve(x64emu_t* emu, const char* path, char* const argv[], char* const envp[]);
@@ -62,11 +62,11 @@ typedef struct scwrap_s {
 } scwrap_t;
 
 scwrap_t syscallwrap[] = {
-    { 0, __NR_read, 3 },  // wrapped so SA_RESTART can be handled by libc
-    { 1, __NR_write, 3 }, // same
-    { 2, __NR_open, 3 },  // flags need transformation
-    { 3, __NR_close, 1 },   // wrapped so SA_RESTART can be handled by libc
-    { 4, __NR_stat, 2 },
+    //{ 0, __NR_read, 3 },  // wrapped so SA_RESTART can be handled by libc
+    //{ 1, __NR_write, 3 }, // same
+    //{ 2, __NR_open, 3 },  // flags need transformation
+    //{ 3, __NR_close, 1 },   // wrapped so SA_RESTART can be handled by libc
+
     { 5, __NR_fstat, 2},
 };
 
@@ -137,6 +137,20 @@ void EXPORT x64Syscall(x64emu_t *emu)
         }
     }
     switch (s) {
+        case 0:  // sys_read
+            R_EAX = (uint32_t)read((int)R_EDI, (void*)R_RSI, (size_t)R_RDX);
+            break;
+        case 1:  // sys_write
+            R_EAX = (uint32_t)write((int)R_EDI, (void*)R_RSI, (size_t)R_RDX);
+            break;
+        case 2: // sys_open
+            if(s==5) {printf_log(LOG_DEBUG, " => sys_open(\"%s\", %d, %d)", (char*)R_RDI, of_convert(R_ESI), R_EDX);}; 
+            //R_EAX = (uint32_t)open((void*)R_EDI, of_convert(R_ESI), R_EDX);
+            R_EAX = (uint32_t)my_open(emu, (void*)R_RDI, of_convert(R_ESI), R_EDX);
+            break;
+        case 3:  // sys_close
+            R_EAX = (uint32_t)close((int)R_EDI);
+            break;
         default:
             printf_log(LOG_INFO, "Error: Unsupported Syscall 0x%02Xh (%d)\n", s, s);
             emu->quit = 1;
@@ -177,6 +191,14 @@ uint32_t EXPORT my_syscall(x64emu_t *emu)
         }
     }
     switch (s) {
+        case 0:  // sys_read
+            return (uint32_t)read(R_ESI, (void*)R_RDX, R_ECX);
+        case 1:  // sys_write
+            return (uint32_t)write(R_ESI, (void*)R_RDX, R_ECX);
+        case 2: // sys_open
+            return my_open(emu, (char*)R_RSI, of_convert(R_EDX), R_ECX);
+        case 3:  // sys_close
+            return (uint32_t)close(R_ESI);
         default:
             printf_log(LOG_INFO, "Error: Unsupported libc Syscall 0x%02X (%d)\n", s, s);
             emu->quit = 1;
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index e22e84ce..4c2fd048 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -469,12 +469,12 @@ pid_t EXPORT my_vfork(x64emu_t* emu)
     return 0;
     #endif
 }
-
+#endif
 int EXPORT my_uname(struct utsname *buf)
 {
-    // sizeof(struct utsname)==390 on i686, and also on ARM, so this seem safe
+    //TODO: check sizeof(struct utsname)
     int ret = uname(buf);
-    strcpy(buf->machine, /*(box64_steam)?"x86_64":*/"i686");
+    strcpy(buf->machine, "x86_64");
     return ret;
 }
 
@@ -553,7 +553,6 @@ int of_unconvert(int a)
 }
 #undef SUPER
 
-
 EXPORT void* my__ZGTtnaX (size_t a) { printf("warning _ZGTtnaX called\n"); return NULL; }
 EXPORT void my__ZGTtdlPv (void* a) { printf("warning _ZGTtdlPv called\n"); }
 EXPORT uint8_t my__ITM_RU1(const uint8_t * a) { printf("warning _ITM_RU1 called\n"); return 0; }
@@ -561,7 +560,7 @@ EXPORT uint32_t my__ITM_RU4(const uint32_t * a) { printf("warning _ITM_RU4 calle
 EXPORT uint64_t my__ITM_RU8(const uint64_t * a) { printf("warning _ITM_RU8 called\n"); return 0; }
 EXPORT void my__ITM_memcpyRtWn(void * a, const void * b, size_t c) {printf("warning _ITM_memcpyRtWn called\n");  }
 EXPORT void my__ITM_memcpyRnWt(void * a, const void * b, size_t c) {printf("warning _ITM_memcpyRtWn called\n"); }
-
+#if 0
 EXPORT void my_longjmp(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/void *p, int32_t __val);
 EXPORT void my__longjmp(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/void *p, int32_t __val) __attribute__((alias("my_longjmp")));
 EXPORT void my_siglongjmp(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/void *p, int32_t __val) __attribute__((alias("my_longjmp")));
@@ -570,15 +569,7 @@ EXPORT void my___longjmp_chk(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/voi
 EXPORT int32_t my_setjmp(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/void *p);
 EXPORT int32_t my__setjmp(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/void *p) __attribute__((alias("my_setjmp")));
 EXPORT int32_t my___sigsetjmp(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/void *p) __attribute__((alias("my_setjmp")));
-#if 0
-EXPORT void my_exit(x64emu_t *emu, int32_t status)
-{
-    R_EAX = (uint32_t)status;
-    emu->quit = 1;
-}
-EXPORT void my__exit(x64emu_t *emu, int32_t status) __attribute__((alias("my_exit")));
-EXPORT void my__Exit(x64emu_t *emu, int32_t status) __attribute__((alias("my_exit")));
-#endif
+
 void myStackAlign(const char* fmt, uint32_t* st, uint32_t* mystack); // align st into mystack according to fmt (for v(f)printf(...))
 typedef int (*iFpp_t)(void*, void*);
 typedef int (*iFppp_t)(void*, void*, void*);
@@ -1300,6 +1291,7 @@ EXPORT int32_t my_readdir_r(x64emu_t* emu, void* dirp, void* entry, void** resul
         return f(dirp, entry, result);
     }
 }
+#endif
 
 static int isProcSelf(const char *path, const char* w)
 {
@@ -1326,6 +1318,7 @@ EXPORT int32_t my_readlink(x64emu_t* emu, void* path, void* buf, uint32_t sz)
     }
     return readlink((const char*)path, (char*)buf, sz);
 }
+
 #ifndef NOALIGN
 
 static int nCPU = 0;
@@ -1397,7 +1390,7 @@ void CreateCPUInfoFile(int fd)
         P;
         sprintf(buff, "bogomips\t: %g\n", bogoMips);
         P;
-        sprintf(buff, "flags\t\t: fpu cx8 sep cmov clflush mmx sse sse2 rdtscp ssse3 fma fxsr cx16 movbe pni\n");
+        sprintf(buff, "flags\t\t: fpu cx8 sep cmov clflush mmx sse sse2 syscall rdtscp ssse3 fma fxsr cx16 movbe pni\n");
         P;
         sprintf(buff, "\n");
         P;
@@ -1405,35 +1398,6 @@ void CreateCPUInfoFile(int fd)
     (void)dummy;
     #undef P
 }
-static int isCpuTopology(const char* p) {
-    if(strstr(p, "/sys/devices/system/cpu/cpu")!=p)
-        return -1;  //nope
-    if( FileExist(p, -1))
-        return -1;  //no need to fake it
-    char buf[512];
-    const char* p2 = p + strlen("/sys/devices/system/cpu/cpu");
-    int n = 0;
-    while(*p2>='0' && *p2<='9') {
-        n = n*10+ *p2 - '0';
-        ++p2;
-    }
-    if(!nCPU)
-        grabNCpu();
-    if(n>=nCPU) // filter for non existing cpu
-        return -1;
-    snprintf(buf, 512, "/sys/devices/system/cpu/cpu%d/topology/core_id", n);
-    if(!strcmp(p, buf))
-        return n;
-    return -1;
-}
-static void CreateCPUTopologyCoreID(int fd, int cpu)
-{
-    char buf[512];
-    snprintf(buf, 512, "%d\n", cpu);
-    size_t dummy = write(fd, buf, strlen(buf));
-    (void)dummy;
-}
-
 
 #define TMP_CPUINFO "box64_tmpcpuinfo"
 #define TMP_CPUTOPO "box64_tmpcputopo%d"
@@ -1480,23 +1444,12 @@ EXPORT int32_t my_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mo
         lseek(tmp, 0, SEEK_SET);
         return tmp;
     }
-    if(isCpuTopology((const char*)pathname)!=-1) {
-        int n = isCpuTopology((const char*)pathname);
-        char buf[512];
-        snprintf(buf, 512, TMP_CPUTOPO, n);
-        int tmp = shm_open(buf, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return open(pathname, flags, mode); // error fallback
-        shm_unlink(buf);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUTopologyCoreID(tmp, n);
-        lseek(tmp, 0, SEEK_SET);
-        return tmp;
-    }
     #endif
     int ret = open(pathname, flags, mode);
     return ret;
 }
 EXPORT int32_t my___open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode) __attribute__((alias("my_open")));
-
+#if 0
 #ifdef DYNAREC
 static int hasDBFromAddress(uintptr_t addr)
 {