about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-25 18:52:26 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-25 18:52:26 +0100
commit40e6f460133f758500b070d1ba44f1b70d1e23ab (patch)
treedebf4330e8344c942fe001a61ffc17f1c0d4bd9c /src/emu
parenta701ff87ecb8c74d0a1da2e5b3d00c3ccde91aae (diff)
downloadbox64-40e6f460133f758500b070d1ba44f1b70d1e23ab.tar.gz
box64-40e6f460133f758500b070d1ba44f1b70d1e23ab.zip
Fixed to ElfLoader and TLS, Syscall, mmap & co functions signature and a few libc wrapped functions
Diffstat (limited to 'src/emu')
-rwxr-xr-xsrc/emu/x64syscall.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index bec0562b..a1c23c5b 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -42,10 +42,9 @@ 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[]);
-//void* my_mmap(x64emu_t* emu, void *addr, unsigned long length, int prot, int flags, int fd, int offset);
-//void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot, int flags, int fd, int64_t offset);
-//int my_munmap(x64emu_t* emu, void* addr, unsigned long length);
-//int my_mprotect(x64emu_t* emu, void *addr, unsigned long len, int prot);
+void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot, int flags, int fd, int64_t offset);
+int my_munmap(x64emu_t* emu, void* addr, unsigned long length);
+int my_mprotect(x64emu_t* emu, void *addr, unsigned long len, int prot);
 
 // cannot include <fcntl.h>, it conflict with some asm includes...
 #ifndef O_NONBLOCK
@@ -62,13 +61,16 @@ 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
-
+    //{ 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
+    //{ 9, __NR_mmap, 6},       // wrapped to track mmap
+    //{ 10, __NR_mprotect, 3},  // same
+    //{ 11, __NR_munmap, 2},    // same
     { 5, __NR_fstat, 2},
     { 186, __NR_gettid, 0 },
+    { 202, __NR_futex, 6},
 };
 
 struct mmap_arg_struct {
@@ -152,6 +154,15 @@ void EXPORT x64Syscall(x64emu_t *emu)
         case 3:  // sys_close
             R_EAX = (uint32_t)close((int)R_EDI);
             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;
+        case 10: // sys_mprotect
+            R_EAX = (uint32_t)my_mprotect(emu, (void*)R_RDI, R_RSI, (int)R_EDX);
+            break;
+        case 11: // sys_munmap
+            R_EAX = (uint32_t)my_munmap(emu, (void*)R_RDI, R_RSI);
+            break;
         default:
             printf_log(LOG_INFO, "Error: Unsupported Syscall 0x%02Xh (%d)\n", s, s);
             emu->quit = 1;
@@ -164,10 +175,11 @@ void EXPORT x64Syscall(x64emu_t *emu)
 #define stack(n) (R_RSP+8+n)
 #define i32(n)  *(int32_t*)stack(n)
 #define u32(n)  *(uint32_t*)stack(n)
+#define i64(n)  *(int64_t*)stack(n)
 #define u64(n)  *(uint64_t*)stack(n)
 #define p(n)    *(void**)stack(n)
 
-uint32_t EXPORT my_syscall(x64emu_t *emu)
+uintptr_t EXPORT my_syscall(x64emu_t *emu)
 {
     uint32_t s = R_EDI;;
     printf_log(LOG_DUMP, "%p: Calling libc syscall 0x%02X (%d) %p %p %p %p %p\n", (void*)R_RIP, s, s, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); 
@@ -200,6 +212,12 @@ uint32_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 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
+            return (uint32_t)my_mprotect(emu, (void*)R_RSI, R_RDX, (int)R_ECX);
+        case 11: // sys_munmap
+            return (uint32_t)my_munmap(emu, (void*)R_RSI, R_RDX);
         default:
             printf_log(LOG_INFO, "Error: Unsupported libc Syscall 0x%02X (%d)\n", s, s);
             emu->quit = 1;