about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-06-18 16:35:53 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-06-18 16:35:53 +0200
commite1825e0ff27d2f663d27aebcbd73dce617e985c6 (patch)
tree7d056eb152f47d4c10422b0e28c2ef218e3fd323
parenta55fc58e241b6c920d97d2fb9bda01493d6150d1 (diff)
downloadbox64-e1825e0ff27d2f663d27aebcbd73dce617e985c6.tar.gz
box64-e1825e0ff27d2f663d27aebcbd73dce617e985c6.zip
[32BITS] Some work on signal handling from 32bits code (not enough yet)
-rwxr-xr-xsrc/libtools/signals.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index c38cacbb..a5804b9e 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -323,6 +323,8 @@ uint64_t RunFunctionHandler(int* exit, int dynarec, x64_ucontext_t* sigcontext,
 
     int oldquitonlongjmp = emu->quitonlongjmp;
     emu->quitonlongjmp = 2;
+    int old_cs = R_CS;
+    R_CS = 0x33;
     
     emu->eflags.x64 &= ~(1<<F_TF); // this one needs to cleared
 
@@ -334,6 +336,9 @@ uint64_t RunFunctionHandler(int* exit, int dynarec, x64_ucontext_t* sigcontext,
     if(nargs>6 && !emu->longjmp)
         R_RSP+=((nargs-6)*sizeof(void*));
 
+    if(!emu->longjmp && R_CS==0x33)
+        R_CS = old_cs;
+
     emu->quitonlongjmp = oldquitonlongjmp;
 
     #ifdef DYNAREC
@@ -1264,9 +1269,9 @@ exit(-1);
                     if(!(i%4)) printf_log(log_minimum, "\n");
                     printf_log(log_minimum, "%s:0x%016llx ", reg_name[i], p->uc_mcontext.regs[10+i]);
                 }
-                for (int i=0; i<3; ++i) {
-                    printf_log(log_minimum, "%s:0x%x ", seg_name[i], emu->segs[i]);
-                }
+                printf_log(log_minimum, "\n");
+                for (int i=0; i<6; ++i)
+                    printf_log(log_minimum, "%s:0x%04x ", seg_name[i], emu->segs[i]);
             }
             if(rsp!=addr && getProtection((uintptr_t)rsp-4*8) && getProtection((uintptr_t)rsp+4*8))
                 for (int i=-4; i<4; ++i) {
@@ -1279,9 +1284,9 @@ exit(-1);
                     if(!(i%4)) printf_log(log_minimum, "\n");
                     printf_log(log_minimum, "%s:0x%016llx ", reg_name[i], p->uc_mcontext.__gregs[16+i]);
                 }
-                for (int i=0; i<3; ++i) {
-                    printf_log(log_minimum, "%s:0x%x ", seg_name[i], emu->segs[i]);
-                }
+                printf_log(log_minimum, "\n");
+                for (int i=0; i<6; ++i)
+                    printf_log(log_minimum, "%s:0x%04x ", seg_name[i], emu->segs[i]);
             }
             if(rsp!=addr && getProtection((uintptr_t)rsp-4*8) && getProtection((uintptr_t)rsp+4*8))
                 for (int i=-4; i<4; ++i) {