about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-06 22:24:52 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-06 22:24:52 +0200
commitd612656978d51dc1cebd1452f0c9845dc25c1a4e (patch)
tree060ee527f9aea8dc6397be14bd2be4d6ffda9abb
parent91787c4dbfdbf1c6b4b284de2bbade03f15ed8d1 (diff)
downloadbox64-d612656978d51dc1cebd1452f0c9845dc25c1a4e.tar.gz
box64-d612656978d51dc1cebd1452f0c9845dc25c1a4e.zip
Added syscall 6 and fixed syscall 5 (for #14)
-rwxr-xr-xsrc/emu/x64syscall.c15
-rwxr-xr-xsrc/wrapped/wrappedlibc.c18
2 files changed, 32 insertions, 1 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index 2b0c03d8..01b27dad 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -43,6 +43,8 @@ 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_lstat(x64emu_t *emu, void* filename, void* buf);
+int my_fstat(x64emu_t *emu, int fd, 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);
@@ -72,10 +74,11 @@ scwrap_t syscallwrap[] = {
     //{ 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
+    //{ 5, __NR_fstat, 2},
+    //{ 6, __NR_lstat, 2},
     //{ 9, __NR_mmap, 6},       // wrapped to track mmap
     //{ 10, __NR_mprotect, 3},  // same
     //{ 11, __NR_munmap, 2},    // same
-    { 5, __NR_fstat, 2},
     { 8, __NR_lseek, 3},
     //{ 13, __NR_rt_sigaction, 4},   // wrapped to use my_ version
     { 14, __NR_rt_sigprocmask, 4},
@@ -276,6 +279,12 @@ void EXPORT x64Syscall(x64emu_t *emu)
         case 4: // sys_stat
             *(int64_t*)&R_RAX = my_stat(emu, (void*)R_RDI, (void*)R_RSI);
             break;
+        case 5: // sys_fstat
+            *(int64_t*)&R_RAX = my_fstat(emu, (int)R_EDI, (void*)R_RSI);
+            break;
+        case 6: // sys_lstat
+            *(int64_t*)&R_RAX = my_lstat(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;
@@ -402,6 +411,10 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
             return (uint64_t)(int64_t)close(R_ESI);
         case 4: // sys_stat
             return (uint64_t)(int64_t)my_stat(emu, (void*)R_RSI, (void*)R_RDX);
+        case 5: // sys_fstat
+            return (uint64_t)(int64_t)my_fstat(emu, (int)R_ESI, (void*)R_RDX);
+        case 6: // sys_lstat
+            return (uint64_t)(int64_t)my_lstat(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
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index f27c15e4..b3552cf7 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -962,6 +962,24 @@ EXPORT int my_stat(x64emu_t *emu, void* filename, void* buf)
     return r;
 }
 
+EXPORT int my_lstat(x64emu_t *emu, void* filename, void* buf)
+{
+    (void)emu;
+    struct stat64 st;
+    int r = lstat(filename, (struct stat*)&st);
+    UnalignStat64(&st, buf);
+    return r;
+}
+
+EXPORT int my_fstat(x64emu_t *emu, int fd, void* buf)
+{
+    (void)emu;
+    struct stat64 st;
+    int r = fstat(fd, (struct stat*)&st);
+    UnalignStat64(&st, buf);
+    return r;
+}
+
 EXPORT int my__IO_file_stat(x64emu_t* emu, void* f, void* buf)
 {
     struct stat64 st;