diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_00.c | 13 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 12 |
2 files changed, 14 insertions, 11 deletions
diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c index 0aa9a65d..02d2b8dc 100644 --- a/src/dynarec/la64/dynarec_la64_00.c +++ b/src/dynarec/la64/dynarec_la64_00.c @@ -1624,18 +1624,19 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni jump_to_epilog_fast(dyn, 0, xRIP, ninst); } } else { + INST_NAME("INT 3"); if (!box64_ignoreint3) { - INST_NAME("INT 3"); // check if TRAP signal is handled - LD_D(x1, xEmu, offsetof(x64emu_t, context)); - MOV64x(x2, offsetof(box64context_t, signals[SIGTRAP])); - ADD_D(x2, x2, x1); - LD_D(x3, x2, 0); + TABLE64(x1, (uintptr_t)my_context); + MOV32w(x2, offsetof(box64context_t, signals[SIGTRAP])); + LDX_D(x3, x1, x2); CBZ_NEXT(x3); - GETIP(ip); + GETIP(addr); STORE_XEMU_CALL(); CALL(native_int3, -1); LOAD_XEMU_CALL(); + *need_epilog = 0; + *ok = 0; } } break; diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 43ef69d7..62618e42 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -420,18 +420,20 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } } } else { - if(!box64_ignoreint3) { - INST_NAME("INT 3"); + INST_NAME("INT 3"); + if (!box64_ignoreint3) { // check if TRAP signal is handled - LD(x1, xEmu, offsetof(x64emu_t, context)); - MOV64x(x2, offsetof(box64context_t, signals[SIGTRAP])); + TABLE64(x1, (uintptr_t)my_context); + MOV32w(x2, offsetof(box64context_t, signals[SIGTRAP])); ADD(x2, x2, x1); LD(x3, x2, 0); CBZ_NEXT(x3); - GETIP(ip); + GETIP(addr); STORE_XEMU_CALL(x3); CALL(native_int3, -1); LOAD_XEMU_CALL(); + *need_epilog = 0; + *ok = 0; } break; } |