diff options
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 18 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 14 |
3 files changed, 27 insertions, 7 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 5a638072..0ad91284 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -2385,7 +2385,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin //LDRx_U12(x3, x1, offsetof(box64context_t, signals[SIGTRAP])); CMPSx_U12(x3, 0); B_NEXT(cEQ); - GETIP(ip); + GETIP(addr); // update RIP STORE_XEMU_CALL(xRIP); CALL(native_int3, -1); LOAD_XEMU_CALL(xRIP); @@ -2401,7 +2401,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("INT 29/2c/2d"); // lets do nothing MESSAGE(LOG_INFO, "INT 29/2c/2d Windows interruption\n"); - GETIP(ip); + GETIP(ip); // priviledged instruction, IP not updated STORE_XEMU_CALL(xRIP); MOV32w(x1, u8); CALL(native_int, -1); @@ -2422,10 +2422,20 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MARK; LOAD_XEMU_REM(); jump_to_epilog(dyn, 0, xRIP, ninst); + } else if(u8==0x03) { + INST_NAME("INT 3"); + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + GETIP(addr); + STORE_XEMU_CALL(xRIP); + CALL(native_int3, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; } else { INST_NAME("INT n"); SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state - GETIP(ip); + GETIP(ip); // priviledged instruction, IP not updated STORE_XEMU_CALL(xRIP); CALL(native_int, -1); LOAD_XEMU_CALL(xRIP); @@ -2440,7 +2450,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { INST_NAME("INTO"); READFLAGS(X_OF); - GETIP(ip); + GETIP(addr); TBZ_NEXT(wFlags, F_OF); STORE_XEMU_CALL(xRIP); CALL(native_int, -1); diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c index 6a118dfa..376541d1 100644 --- a/src/dynarec/dynarec_native_functions.c +++ b/src/dynarec/dynarec_native_functions.c @@ -188,7 +188,7 @@ void native_singlestep(x64emu_t* emu) void native_int3(x64emu_t* emu) { - emit_signal(emu, SIGTRAP, (void*)R_RIP, 128); + emit_signal(emu, SIGTRAP, NULL, 3); } void native_div0(x64emu_t* emu) diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 790d00bb..43ef69d7 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -442,7 +442,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("INT 29/2c/2d"); // lets do nothing MESSAGE(LOG_INFO, "INT 29/2c/2d Windows interruption\n"); - GETIP(ip); + GETIP(ip); // priviledged instruction, IP not updated STORE_XEMU_CALL(x3); MOV32w(x1, u8); CALL(native_int, -1); @@ -462,10 +462,20 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int MARK; LOAD_XEMU_REM(x3); jump_to_epilog(dyn, 0, xRIP, ninst); + } else if (u8==0x03) { + INST_NAME("INT 3"); + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + GETIP(addr); + STORE_XEMU_CALL(x3); + CALL(native_int3, -1); + LOAD_XEMU_CALL(); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; } else { INST_NAME("INT n"); SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state - GETIP(ip); + GETIP(ip); // priviledged instruction, IP not updated STORE_XEMU_CALL(x3); CALL(native_priv, -1); LOAD_XEMU_CALL(); |