about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-07 15:21:08 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-05-07 15:21:08 +0200
commit07948ff6a7356c61ee192b40b975db2792b53e1f (patch)
tree67906ff6ae598938fa6846462be593f93bd20ac5 /src
parent381bccfd6add90a4f5a501beee3d75f9a3a16486 (diff)
downloadbox64-07948ff6a7356c61ee192b40b975db2792b53e1f.tar.gz
box64-07948ff6a7356c61ee192b40b975db2792b53e1f.zip
[DYNAREC] Use Dynarec on Signal function when possible
Diffstat (limited to 'src')
-rwxr-xr-xsrc/libtools/signals.c20
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);
 }