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 | |
| 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')
| -rwxr-xr-x | src/dynarec/dynarec.c | 4 | ||||
| -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 | ||||
| -rwxr-xr-x | src/include/x64emu.h | 2 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 4 | ||||
| -rwxr-xr-x | src/libtools/threads.c | 6 | ||||
| -rwxr-xr-x | src/main.c | 11 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 10 |
9 files changed, 43 insertions, 19 deletions
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index fffc508a..5e5a5b7c 100755 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -133,7 +133,7 @@ void DynaCall(x64emu_t* emu, uintptr_t addr) emu->test.clean = 0; Run(emu, 1); } else { - dynarec_log(LOG_DEBUG, "%04d|Calling DynaRec Block @%p (%p) of %d x64 instructions emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize ,emu); + dynarec_log(LOG_DEBUG, "%04d|Calling DynaRec Block @%p (%p) of %d x64 instructions (hash=0x%x) emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize ,block->hash, emu); CHECK_FLAGS(emu); // block is here, let's run it! native_prolog(emu, block->block); @@ -221,7 +221,7 @@ int DynaRun(x64emu_t* emu) emu->test.clean = 0; Run(emu, 1); } else { - dynarec_log(LOG_DEBUG, "%04d|Running DynaRec Block @%p (%p) of %d x64 insts emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize, emu); + dynarec_log(LOG_DEBUG, "%04d|Running DynaRec Block @%p (%p) of %d x64 insts (hash=0x%x) emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize, block->hash, emu); // block is here, let's run it! native_prolog(emu, block->block); } 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; diff --git a/src/include/x64emu.h b/src/include/x64emu.h index c7f2e20e..d242925a 100755 --- a/src/include/x64emu.h +++ b/src/include/x64emu.h @@ -6,7 +6,7 @@ typedef struct box64context_s box64context_t; x64emu_t *NewX64Emu(box64context_t *context, uintptr_t start, uintptr_t stack, int stacksize, int ownstack); x64emu_t *NewX64EmuFromStack(x64emu_t* emu, box64context_t *context, uintptr_t start, uintptr_t stack, int stacksize, int ownstack); -void SetupX64Emu(x64emu_t *emu); +void SetupX64Emu(x64emu_t *emu, x64emu_t *ref); void FreeX64Emu(x64emu_t **x64emu); void FreeX64EmuFromStack(x64emu_t **emu); void CloneEmu(x64emu_t *newemu, const x64emu_t* emu); diff --git a/src/libtools/signals.c b/src/libtools/signals.c index e9ed2eec..1ea5489a 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -753,9 +753,9 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void if(sig!=SIGSEGV && !(Locks&is_dyndump_locked)) dynarec = 1; #endif - if (simple) + /*if (simple) ret = RunFunctionHandler(&exits, dynarec, sigcontext, my_context->signals[sig], 1, sig); - else + else*/ ret = RunFunctionHandler(&exits, dynarec, sigcontext, my_context->signals[sig], 3, sig, info2, sigcontext); // restore old value from emu if(used_stack) // release stack diff --git a/src/libtools/threads.c b/src/libtools/threads.c index ebf3d669..707d3833 100755 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -215,7 +215,7 @@ x64emu_t* thread_get_emu() } void* stack = my_mmap(NULL, NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); x64emu_t *emu = NewX64Emu(my_context, 0, (uintptr_t)stack, stacksize, 1); - SetupX64Emu(emu); + SetupX64Emu(emu, NULL); thread_set_emu(emu); return emu; } @@ -490,7 +490,7 @@ EXPORT int my_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_rou emuthread_t *et = (emuthread_t*)box_calloc(1, sizeof(emuthread_t)); x64emu_t *emuthread = NewX64Emu(my_context, (uintptr_t)start_routine, (uintptr_t)stack, stacksize, own); - SetupX64Emu(emuthread); + SetupX64Emu(emuthread, emu); //SetFS(emuthread, GetFS(emu)); et->emu = emuthread; et->fnc = (uintptr_t)start_routine; @@ -512,7 +512,7 @@ void* my_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** pet void* stack = my_mmap(NULL, NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); emuthread_t *et = (emuthread_t*)box_calloc(1, sizeof(emuthread_t)); x64emu_t *emuthread = NewX64Emu(emu->context, (uintptr_t)f, (uintptr_t)stack, stacksize, 1); - SetupX64Emu(emuthread); + SetupX64Emu(emuthread, emu ); //SetFS(emuthread, GetFS(emu)); et->emu = emuthread; et->fnc = (uintptr_t)f; diff --git a/src/main.c b/src/main.c index aebe557a..77e2274c 100755 --- a/src/main.c +++ b/src/main.c @@ -1366,8 +1366,13 @@ int main(int argc, const char **argv, char **env) { wine_prereserve(prereserve); // special case for winedbg, doesn't work anyway if(argv[nextarg+1] && strstr(argv[nextarg+1], "winedbg")==argv[nextarg+1]) { - printf_log(LOG_NONE, "winedbg detected, not launching it!\n"); - exit(0); // exiting, it doesn't work anyway + if(getenv("BOX64_WINEDBG")) { + box64_nobanner = 1; + box64_log = 0; + } else { + printf_log(LOG_NONE, "winedbg detected, not launching it!\n"); + exit(0); // exiting, it doesn't work anyway + } } box64_wine = 1; } else @@ -1692,7 +1697,7 @@ int main(int argc, const char **argv, char **env) { x64emu_t *emu = NewX64Emu(my_context, my_context->ep, (uintptr_t)my_context->stack, my_context->stacksz, 0); // stack setup is much more complicated then just that! SetupInitialStack(emu); // starting here, the argv[] don't need free anymore - SetupX64Emu(emu); + SetupX64Emu(emu, NULL); SetRSI(emu, my_context->argc); SetRDX(emu, (uint64_t)my_context->argv); SetRCX(emu, (uint64_t)my_context->envv); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index cb4ae59d..0c0c0238 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -482,6 +482,11 @@ int my_dl_iterate_phdr(x64emu_t *emu, void* F, void *data); pid_t EXPORT my_fork(x64emu_t* emu) { + #if 1 + emu->quit = 1; + emu->fork = 3; // use regular fork... + return 0; + #else // execute atforks prepare functions, in reverse order for (int i=my_context->atfork_sz-1; i>=0; --i) if(my_context->atforks[i].prepare) @@ -507,6 +512,7 @@ pid_t EXPORT my_fork(x64emu_t* emu) RunFunctionWithEmu(emu, 0, my_context->atforks[i].child, 0); } return v; + #endif } pid_t EXPORT my___fork(x64emu_t* emu) __attribute__((alias("my_fork"))); pid_t EXPORT my_vfork(x64emu_t* emu) @@ -3138,8 +3144,8 @@ EXPORT int my_clone(x64emu_t* emu, void* fn, void* stack, int flags, void* args, void* mystack = NULL; clone_arg_t* arg = (clone_arg_t*)box_calloc(1, sizeof(clone_arg_t)); x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack, 0, 0); - SetupX64Emu(newemu); - CloneEmu(newemu, emu); + SetupX64Emu(newemu, emu); + //CloneEmu(newemu, emu); if(my_context->stack_clone_used) { printf_log(LOG_DEBUG, " no free stack_clone "); mystack = box_malloc(1024*1024); // stack for own process... memory leak, but no practical way to remove it |