diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-24 15:24:54 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-24 15:24:54 +0200 |
| commit | 320459c2c6324c0934b5faa640e3e656a4bf9e1e (patch) | |
| tree | 258a5ad68935243f282e6e796d8eac66cf082872 /src | |
| parent | 8d14c10b8cf773d252dfeb7717d90fc07e3590ee (diff) | |
| download | box64-320459c2c6324c0934b5faa640e3e656a4bf9e1e.tar.gz box64-320459c2c6324c0934b5faa640e3e656a4bf9e1e.zip | |
Make BOX64_IGNOREINT3 also ignore other privilged instructions
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 61 | ||||
| -rw-r--r-- | src/emu/x64run.c | 17 |
2 files changed, 52 insertions, 26 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 5a55e015..e06cd2d6 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -3014,15 +3014,20 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xE6: /* OUT Ib, AL */ case 0xE7: /* OUT Ib, EAX */ INST_NAME(opcode==0xE4?"IN AL, Ib":(opcode==0xE5?"IN EAX, Ib":(opcode==0xE6?"OUT Ib, AL":"OUT Ib, EAX"))); - SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state - u8 = F8; - GETIP(ip); - STORE_XEMU_CALL(xRIP); - CALL(native_priv, -1); - LOAD_XEMU_CALL(xRIP); - jump_to_epilog(dyn, 0, xRIP, ninst); - *need_epilog = 0; - *ok = 0; + if(rex.is32bits && box64_ignoreint3) + { + F8; + } else { + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + u8 = F8; + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL(native_priv, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + } break; case 0xE8: INST_NAME("CALL Id"); @@ -3196,14 +3201,17 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xEE: /* OUT DX, AL */ case 0xEF: /* OUT DX, EAX */ INST_NAME(opcode==0xEC?"IN AL, DX":(opcode==0xED?"IN EAX, DX":(opcode==0xEE?"OUT DX, AL":"OUT DX, EAX"))); - SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state - GETIP(ip); - STORE_XEMU_CALL(xRIP); - CALL(native_priv, -1); - LOAD_XEMU_CALL(xRIP); - jump_to_epilog(dyn, 0, xRIP, ninst); - *need_epilog = 0; - *ok = 0; + if(rex.is32bits && box64_ignoreint3) + {} else { + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL(native_priv, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + } break; case 0xF0: @@ -3561,14 +3569,17 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xFA: /* STI */ case 0xFB: /* CLI */ INST_NAME(opcode==0xFA?"CLI":"STI"); - SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state - GETIP(ip); - STORE_XEMU_CALL(xRIP); - CALL(native_priv, -1); - LOAD_XEMU_CALL(xRIP); - jump_to_epilog(dyn, 0, xRIP, ninst); - *need_epilog = 0; - *ok = 0; + if(rex.is32bits && box64_ignoreint3) + {} else { + SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state + GETIP(ip); + STORE_XEMU_CALL(xRIP); + CALL(native_priv, -1); + LOAD_XEMU_CALL(xRIP); + jump_to_epilog(dyn, 0, xRIP, ninst); + *need_epilog = 0; + *ok = 0; + } break; case 0xFC: INST_NAME("CLD"); diff --git a/src/emu/x64run.c b/src/emu/x64run.c index aa28c070..e0dc0062 100644 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -561,7 +561,13 @@ x64emurun: case 0x6E: /* OUTSB DX */ case 0x6F: /* OUTSD DX */ #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + if(rex.is32bits && box64_ignoreint3) + { + F8; + } else { + F8; + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + } STEP; #endif break; @@ -1804,6 +1810,9 @@ x64emurun: case 0xE7: /* OUT XX, EAX */ // this is a privilege opcode... #ifndef TEST_INTERPRETER + F8; + if(rex.is32bits && box64_ignoreint3) + {} else emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); STEP; #endif @@ -1842,6 +1851,8 @@ x64emurun: case 0xEF: /* OUT DX, EAX */ // this is a privilege opcode... #ifndef TEST_INTERPRETER + if(rex.is32bits && box64_ignoreint3) + {} else emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); STEP; #endif @@ -2003,11 +2014,15 @@ x64emurun: break; case 0xFA: /* CLI */ // this is a privilege opcode + if(rex.is32bits && box64_ignoreint3) + {} else emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); STEP; break; case 0xFB: /* STI */ // this is a privilege opcode + if(rex.is32bits && box64_ignoreint3) + {} else emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); STEP; break; |