diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-07 15:21:08 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-07 15:21:08 +0200 |
| commit | 07948ff6a7356c61ee192b40b975db2792b53e1f (patch) | |
| tree | 67906ff6ae598938fa6846462be593f93bd20ac5 /src | |
| parent | 381bccfd6add90a4f5a501beee3d75f9a3a16486 (diff) | |
| download | box64-07948ff6a7356c61ee192b40b975db2792b53e1f.tar.gz box64-07948ff6a7356c61ee192b40b975db2792b53e1f.zip | |
[DYNAREC] Use Dynarec on Signal function when possible
Diffstat (limited to 'src')
| -rwxr-xr-x | src/libtools/signals.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 124cbf4b..e9ed2eec 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -270,7 +270,7 @@ static void sigstack_key_alloc() { //1<<8 is mutex_dyndump #define is_dyndump_locked (1<<8) -uint64_t RunFunctionHandler(int* exit, x64_ucontext_t* sigcontext, uintptr_t fnc, int nargs, ...) +uint64_t RunFunctionHandler(int* exit, int dynarec, x64_ucontext_t* sigcontext, uintptr_t fnc, int nargs, ...) { if(fnc==0 || fnc==1) { va_list va; @@ -324,8 +324,11 @@ uint64_t RunFunctionHandler(int* exit, x64_ucontext_t* sigcontext, uintptr_t fnc int oldquitonlongjmp = emu->quitonlongjmp; emu->quitonlongjmp = 2; - EmuCall(emu, fnc); // avoid DynaCall for now - //DynaCall(emu, fnc); + if(dynarec) + DynaCall(emu, fnc); + else + EmuCall(emu, fnc); + if(nargs>6) R_RSP+=((nargs-6)*sizeof(void*)); @@ -745,10 +748,15 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void int exits = 0; int ret; + int dynarec = 0; + #ifdef DYNAREC + if(sig!=SIGSEGV && !(Locks&is_dyndump_locked)) + dynarec = 1; + #endif if (simple) - ret = RunFunctionHandler(&exits, sigcontext, my_context->signals[sig], 1, sig); + ret = RunFunctionHandler(&exits, dynarec, sigcontext, my_context->signals[sig], 1, sig); else - ret = RunFunctionHandler(&exits, sigcontext, my_context->signals[sig], 3, sig, info2, sigcontext); + ret = RunFunctionHandler(&exits, dynarec, sigcontext, my_context->signals[sig], 3, sig, info2, sigcontext); // restore old value from emu if(used_stack) // release stack new_ss->ss_flags = 0; @@ -855,7 +863,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void exit(ret); } if(restorer) - RunFunctionHandler(&exits, NULL, restorer, 0); + RunFunctionHandler(&exits, 0, NULL, restorer, 0); relockMutex(Locks); } |