about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-08 15:20:52 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-05-08 15:20:52 +0200
commit7db5b33284eb1611ec1ae15b030ef146f6b46c1c (patch)
tree66f5359a63d7dcd991d04c835f6c7c54ad85d00a /src/emu
parent6607ddb15daeec7f54504a907e5db5013d3da618 (diff)
downloadbox64-7db5b33284eb1611ec1ae15b030ef146f6b46c1c.tar.gz
box64-7db5b33284eb1611ec1ae15b030ef146f6b46c1c.zip
Some small changes to thread and fork and cloning x64emu_t struct
Diffstat (limited to 'src/emu')
-rwxr-xr-xsrc/emu/x64emu.c12
-rwxr-xr-xsrc/emu/x64run_private.c4
-rwxr-xr-xsrc/emu/x64syscall.c9
3 files changed, 19 insertions, 6 deletions
diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c
index de4dd50e..d48b4912 100755
--- a/src/emu/x64emu.c
+++ b/src/emu/x64emu.c
@@ -117,10 +117,18 @@ x64emu_t *NewX64EmuFromStack(x64emu_t* emu, box64context_t *context, uintptr_t s
 }
 
 EXPORTDYN
-void SetupX64Emu(x64emu_t *emu)
+void SetupX64Emu(x64emu_t *emu, x64emu_t *ref)
 {
     printf_log(LOG_DEBUG, "Setup X86_64 Emu\n");
-    (void)emu;  // Not doing much here...
+    if(ref) {
+        // save RIP and RSP
+        uintptr_t old_rip = R_RIP;
+        uintptr_t old_rsp = R_RSP;
+        CloneEmu(emu, ref);
+        // restore RIP and RSP
+        R_RIP = old_rip;
+        R_RSP = old_rsp;
+    }
 }
 
 #ifdef HAVE_TRACE
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 9f8457c2..dfd9a40b 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -33,6 +33,8 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
     (void)argc; (void)ubp_av; (void)fini; (void)rtld_fini; (void)stack_end;
 
     if(init) {
+        uintptr_t old_rsp = GetRSP(emu);
+        uintptr_t old_rbp = GetRBP(emu); // should not be needed, but seems to be without dynarec
         Push64(emu, GetRBP(emu));   // set frame pointer
         SetRBP(emu, GetRSP(emu));   // save RSP
         SetRSP(emu, GetRSP(emu)&~0xFLL);    // Align RSP
@@ -47,6 +49,8 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
             return 0;
         SetRSP(emu, GetRBP(emu));   // restore RSP
         SetRBP(emu, Pop64(emu));    // restore RBP
+        SetRSP(emu, old_rsp);
+        SetRBP(emu, old_rbp);
         emu->quit = 0;
     } else {
         RunElfInit(my_context->elfs[0], emu);
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index 4a82f9a1..c426cd32 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -198,6 +198,7 @@ scwrap_t syscallwrap[] = {
     { 208, __NR_io_getevents, 4},
     { 209, __NR_io_submit, 3},
     { 210, __NR_io_cancel, 3},
+    { 212, __NR_lookup_dcookie, 3},
     #ifdef __NR_epoll_create
     { 213, __NR_epoll_create, 1},
     #endif
@@ -557,8 +558,8 @@ void EXPORT x64Syscall(x64emu_t *emu)
                         }
                     }
                     x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack_base, stack_size, (R_RSI)?0:1);
-                    SetupX64Emu(newemu);
-                    CloneEmu(newemu, emu);
+                    SetupX64Emu(newemu, emu);
+                    //CloneEmu(newemu, emu);
                     Push64(newemu, 0);
                     PushExit(newemu);
                     void* mystack = NULL;
@@ -858,8 +859,8 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
                     }
                 }
                 x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack_base, stack_size, (R_RDX)?0:1);
-                SetupX64Emu(newemu);
-                CloneEmu(newemu, emu);
+                SetupX64Emu(newemu, emu);
+                //CloneEmu(newemu, emu);
                 Push64(newemu, 0);
                 PushExit(newemu);
                 void* mystack = NULL;