diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-08 15:20:52 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-08 15:20:52 +0200 |
| commit | 7db5b33284eb1611ec1ae15b030ef146f6b46c1c (patch) | |
| tree | 66f5359a63d7dcd991d04c835f6c7c54ad85d00a /src/emu | |
| parent | 6607ddb15daeec7f54504a907e5db5013d3da618 (diff) | |
| download | box64-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-x | src/emu/x64emu.c | 12 | ||||
| -rwxr-xr-x | src/emu/x64run_private.c | 4 | ||||
| -rwxr-xr-x | src/emu/x64syscall.c | 9 |
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; |