about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-08 18:02:52 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-08 18:03:03 +0100
commitf292be40b24a449238ca1fc0e3e0f6a6cf7b46a1 (patch)
treed713845ba8f3ba8b625f40dc9b69020a97f9e274 /src
parent0166330c736ccfa0f38880713e025f342c67514d (diff)
downloadbox64-f292be40b24a449238ca1fc0e3e0f6a6cf7b46a1.tar.gz
box64-f292be40b24a449238ca1fc0e3e0f6a6cf7b46a1.zip
Improved syscall 56
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64emu.c4
-rw-r--r--src/emu/x64syscall.c24
2 files changed, 14 insertions, 14 deletions
diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c
index 4ec5b1fd..760ba170 100644
--- a/src/emu/x64emu.c
+++ b/src/emu/x64emu.c
@@ -263,10 +263,6 @@ void CloneEmu(x64emu_t *newemu, const x64emu_t* emu)
     newemu->quit = emu->quit;
     newemu->error = emu->error;
     newemu->x64emu_parity_tab = emu->x64emu_parity_tab;
-    // adapt R_RSP to new stack frame
-    uintptr_t oldst = (uintptr_t)((emu->init_stack)?emu->init_stack:emu->context->stack);
-    uintptr_t newst = (uintptr_t)((newemu->init_stack)?newemu->init_stack:newemu->context->stack);
-    newemu->regs[_SP].q[0] = emu->regs[_SP].q[0] + (intptr_t)(newst - oldst);
 }
 
 void CopyEmu(x64emu_t *newemu, const x64emu_t* emu)
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index ce2b2b50..6109583f 100644
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -587,6 +587,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
                 {
                     void* stack_base = (void*)R_RSI;
                     int stack_size = 0;
+                    uintptr_t sp = R_RSI;
                     if(!R_RSI) {
                         // allocate a new stack...
                         int currstack = 0;
@@ -595,18 +596,19 @@ void EXPORT x64Syscall(x64emu_t *emu)
                         stack_size = (currstack && emu->size_stack)?emu->size_stack:(1024*1024);
                         stack_base = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
                         // copy value from old stack to new stack
-                        if(currstack)
+                        if(currstack) {
                             memcpy(stack_base, emu->init_stack, stack_size);
-                        else {
+                            sp = (uintptr_t)emu->init_stack + R_RSP - (uintptr_t)stack_base;
+                        } else {
                             int size_to_copy = (uintptr_t)emu->init_stack + emu->size_stack - (R_RSP);
                             memcpy(stack_base+stack_size-size_to_copy, (void*)R_RSP, size_to_copy);
+                            sp = (uintptr_t)stack_base+stack_size-size_to_copy;
                         }
                     }
                     x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack_base, stack_size, (R_RSI)?0:1);
                     SetupX64Emu(newemu, emu);
-                    //CloneEmu(newemu, emu);
-                    Push64(newemu, 0);
-                    PushExit(newemu);
+                    CloneEmu(newemu, emu);
+                    newemu->regs[_SP].q[0] = sp;  // setup new stack pointer
                     void* mystack = NULL;
                     if(my_context->stack_clone_used) {
                         mystack = box_malloc(1024*1024);  // stack for own process... memory leak, but no practical way to remove it
@@ -944,6 +946,7 @@ long EXPORT my_syscall(x64emu_t *emu)
             {
                 void* stack_base = (void*)R_RDX;
                 int stack_size = 0;
+                uintptr_t sp = R_RDX;
                 if(!stack_base) {
                     // allocate a new stack...
                     int currstack = 0;
@@ -952,18 +955,19 @@ long EXPORT my_syscall(x64emu_t *emu)
                     stack_size = (currstack)?emu->size_stack:(1024*1024);
                     stack_base = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
                     // copy value from old stack to new stack
-                    if(currstack)
+                    if(currstack) {
                         memcpy(stack_base, emu->init_stack, stack_size);
-                    else {
+                        sp = (uintptr_t)emu->init_stack + R_RSP - (uintptr_t)stack_base;
+                    } else {
                         int size_to_copy = (uintptr_t)emu->init_stack + emu->size_stack - (R_RSP);
                         memcpy(stack_base+stack_size-size_to_copy, (void*)R_RSP, size_to_copy);
+                        sp = (uintptr_t)stack_base+stack_size-size_to_copy;
                     }
                 }
                 x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack_base, stack_size, (R_RDX)?0:1);
                 SetupX64Emu(newemu, emu);
-                //CloneEmu(newemu, emu);
-                Push64(newemu, 0);
-                PushExit(newemu);
+                CloneEmu(newemu, emu);
+                newemu->regs[_SP].q[0] = sp;  // setup new stack pointer
                 void* mystack = NULL;
                 if(my_context->stack_clone_used) {
                     mystack = box_malloc(1024*1024);  // stack for own process... memory leak, but no practical way to remove it