diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-08 18:02:52 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-08 18:03:03 +0100 |
| commit | f292be40b24a449238ca1fc0e3e0f6a6cf7b46a1 (patch) | |
| tree | d713845ba8f3ba8b625f40dc9b69020a97f9e274 /src | |
| parent | 0166330c736ccfa0f38880713e025f342c67514d (diff) | |
| download | box64-f292be40b24a449238ca1fc0e3e0f6a6cf7b46a1.tar.gz box64-f292be40b24a449238ca1fc0e3e0f6a6cf7b46a1.zip | |
Improved syscall 56
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64emu.c | 4 | ||||
| -rw-r--r-- | src/emu/x64syscall.c | 24 |
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 |