about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-06-02 14:41:22 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-06-02 14:41:22 +0200
commit543af50ff80af8f041e2b53568659b30043e8613 (patch)
treeba67ddcef827d23d0b266f65abefe531fc2f11b0 /src
parentf6444c8d45c187b7d028e2c79471a0498fde9edb (diff)
downloadbox64-543af50ff80af8f041e2b53568659b30043e8613.tar.gz
box64-543af50ff80af8f041e2b53568659b30043e8613.zip
Added some more syscalls
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64syscall.c65
-rwxr-xr-xsrc/wrapped/wrappedlibc.c9
2 files changed, 74 insertions, 0 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index ce85ee3f..c8009513 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -36,10 +36,13 @@
 typedef struct x64_sigaction_s x64_sigaction_t;
 typedef struct x64_stack_s x64_stack_t;
 
+int mkdir(const char *path, mode_t mode);
 
 //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);
+ssize_t my_readlink(x64emu_t* emu, void* path, void* buf, size_t sz);
+int my_stat(x64emu_t *emu, void* filename, void* buf);
 
 int my_sigaction(x64emu_t* emu, int signum, const x64_sigaction_t *act, x64_sigaction_t *oldact);
 int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss);
@@ -68,14 +71,22 @@ scwrap_t syscallwrap[] = {
     //{ 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 },     // Need to align struct stat
     //{ 9, __NR_mmap, 6},       // wrapped to track mmap
     //{ 10, __NR_mprotect, 3},  // same
     //{ 11, __NR_munmap, 2},    // same
     { 5, __NR_fstat, 2},
     //{ 13, __NR_rt_sigaction, 4}   // wrapped to use my_ version
+    { 16, __NR_ioctl, 3},
+    #ifdef __NR_access
+    { 21, __NR_access, 2},
+    #endif
     #ifdef __NR_pipe
     { 22, __NR_pipe, 1},
     #endif
+    #ifdef __NR_select
+    { 23, __NR_select, 5},
+    #endif
     //{ 25, __NR_mremap, 5},    // wrapped to track protection
     { 46, __NR_sendmsg, 3},
     { 47, __NR_recvmsg, 3},
@@ -87,11 +98,19 @@ scwrap_t syscallwrap[] = {
     #ifdef __NR_getdents
     { 78, __NR_getdents, 3},
     #endif
+    #ifdef __NR_mkdir
+    { 83, __NR_mkdir, 2},
+    #endif
+    //{ 89, __NR_readlink, 3},  // not always existing, better use the wrapped version anyway
+    { 97, __NR_getrlimit, 2},
     { 101, __NR_ptrace, 4},
     { 126, __NR_capset, 2},
     //{ 131, __NR_sigaltstack, 2},  // wrapped to use my_sigaltstack
     { 157, __NR_prctl, 5 },     // needs wrapping?
     { 186, __NR_gettid, 0 },    //0xBA
+    #ifdef __NR_time
+    { 201, __NR_time, 1},
+    #endif
     { 202, __NR_futex, 6},
     { 217, __NR_getdents64, 3},
     { 234, __NR_tgkill, 3},
@@ -226,6 +245,9 @@ void EXPORT x64Syscall(x64emu_t *emu)
         case 3:  // sys_close
             R_EAX = (uint32_t)close((int)R_EDI);
             break;
+        case 4: // sys_stat
+            R_EAX = (uint32_t)my_stat(emu, (void*)R_RDI, (void*)R_RSI);
+            break;
         case 9: // sys_mmap
             R_RAX = (uintptr_t)my_mmap64(emu, (void*)R_RDI, R_RSI, (int)R_EDX, (int)R_R10d, (int)R_R8d, R_R9);
             break;
@@ -238,11 +260,21 @@ void EXPORT x64Syscall(x64emu_t *emu)
         case 13: // sys_rt_sigaction
             R_EAX = (uint32_t)my_sigaction(emu, (int)R_EDI, (const x64_sigaction_t *)R_RSI, (x64_sigaction_t *)R_RDX/*, (size_t)R_R10*/);
             break;
+        #ifndef __NR_access
+        case 21: // sys_access
+            R_EAX = (uint32_t)access((void*)R_RDI, R_ESI);
+            break;
+        #endif
         #ifndef __NR_pipe
         case 22:
             R_EAX = (uint32_t)pipe((void*)R_RDI);
             break;
         #endif
+        #ifndef __NR_select
+        case 23: // sys_select
+            R_EAX = (uint32_t)select(R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_R10, (void*)R_R8);
+            break;
+        #endif
         case 25: // sys_mremap
             R_RAX = (uintptr_t)my_mremap(emu, (void*)R_RDI, R_RSI, R_RDX, R_R10d, (void*)R_R8);
             break;
@@ -262,9 +294,22 @@ void EXPORT x64Syscall(x64emu_t *emu)
             }
             break;
         #endif
+        #ifndef __NR_mkdir
+        case 83: // sys_mkdir
+            R_EAX = (uint32_t)mkdir((void*)R_RDI, R_ESI);
+            break;
+        #endif
+        case 89: // sys_readlink
+            R_RAX = (ssize_t)my_readlink(emu,(void*)R_RDI, (void*)R_RSI, (size_t)R_RDX);
+            break;
         case 131: // sys_sigaltstack
             R_EAX = (uint32_t)my_sigaltstack(emu, (void*)R_RDI, (void*)R_RSI);
             break;
+        #ifndef __NR_time
+        case 201: // sys_time
+            R_RAX = (uintptr_t)time((void*)R_RDI);
+            break;
+        #endif
         #ifndef __NR_inotify_init
         case 253:
             R_EAX = (int)syscall(__NR_inotify_init1, 0);
@@ -319,6 +364,8 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
             return my_open(emu, (char*)R_RSI, of_convert(R_EDX), R_ECX);
         case 3:  // sys_close
             return (uint32_t)close(R_ESI);
+        case 4: // sys_stat
+            return (uint32_t)my_stat(emu, (void*)R_RSI, (void*)R_RDX);
         case 9: // sys_mmap
             return (uintptr_t)my_mmap64(emu, (void*)R_RSI, R_RDX, (int)R_RCX, (int)R_R8d, (int)R_R9, i64(0));
         case 10: // sys_mprotect
@@ -327,10 +374,18 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
             return (uint32_t)my_munmap(emu, (void*)R_RSI, R_RDX);
         case 13: // sys_rt_sigaction
             return (uint32_t)my_sigaction(emu, (int)R_ESI, (const x64_sigaction_t *)R_RDX, (x64_sigaction_t *)R_RCX/*, (size_t)R_R8*/);
+        #ifndef __NR_access
+        case 21: // sys_access
+            return (uint32_t)access((void*)R_RSI, R_EDX);
+        #endif
         #ifndef __NR_pipe
         case 22:
             return (uint32_t)pipe((void*)R_RSI);
         #endif
+        #ifndef __NR_select
+        case 23: // sys_select
+            return (uint32_t)select(R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9);
+        #endif
         case 25: // sys_mremap
             return (uintptr_t)my_mremap(emu, (void*)R_RSI, R_RDX, R_RCX, R_R8d, (void*)R_R9);
         #ifndef __NR_fork
@@ -347,8 +402,18 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
                 return (uint64_t)ret;
             }
         #endif
+        #ifndef __NR_mkdir
+        case 83: // sys_mkdir
+            return (uint32_t)mkdir((void*)R_RSI, R_EDX);
+        #endif
+        case 89: // sys_readlink
+            return (uintptr_t)my_readlink(emu,(void*)R_RSI, (void*)R_RDX, (size_t)R_RCX);
         case 131: // sys_sigaltstack
             return (uint32_t)my_sigaltstack(emu, (void*)R_RSI, (void*)R_RDX);
+        #ifndef __NR_time
+        case 201: // sys_time
+            return (uintptr_t)time((void*)R_RSI);
+        #endif
         #ifndef __NR_inotify_init
         case 253:
             return (int)syscall(__NR_inotify_init1, 0);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 77558080..5013027c 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -953,6 +953,15 @@ EXPORT int my___fxstatat64(x64emu_t* emu, int v, int d, void* path, void* buf, i
     return r;
 }
 
+EXPORT int my_stat(x64emu_t *emu, void* filename, void* buf)
+{
+    (void)emu;
+    struct stat64 st;
+    int r = stat(filename, &st);
+    UnalignStat64(&st, buf);
+    return r;
+}
+
 EXPORT int my__IO_file_stat(x64emu_t* emu, void* f, void* buf)
 {
     struct stat64 st;