diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-06-18 16:35:53 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-06-18 16:35:53 +0200 |
| commit | e1825e0ff27d2f663d27aebcbd73dce617e985c6 (patch) | |
| tree | 7d056eb152f47d4c10422b0e28c2ef218e3fd323 /src | |
| parent | a55fc58e241b6c920d97d2fb9bda01493d6150d1 (diff) | |
| download | box64-e1825e0ff27d2f663d27aebcbd73dce617e985c6.tar.gz box64-e1825e0ff27d2f663d27aebcbd73dce617e985c6.zip | |
[32BITS] Some work on signal handling from 32bits code (not enough yet)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/libtools/signals.c | 17 |
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) { |