diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-01-24 22:19:18 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-24 15:19:18 +0100 |
| commit | cec62dad4419ac9369c7ceb40311f27e834dfa34 (patch) | |
| tree | 04134cc2ef3be336a4685824805336bccccd57b3 /src | |
| parent | 89eca28d3a32291852bb4400e0fbabffbbe259b3 (diff) | |
| download | box64-cec62dad4419ac9369c7ceb40311f27e834dfa34.tar.gz box64-cec62dad4419ac9369c7ceb40311f27e834dfa34.zip | |
[RV64_DYNAREC] Force priv opcode flags to be at least defered if safeflags=2 ([LA64_DYNREC] too) (#2293)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_00.c | 18 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_0f.c | 20 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_1.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 14 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 20 |
5 files changed, 64 insertions, 20 deletions
diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c index 347d0778..ba30e983 100644 --- a/src/dynarec/la64/dynarec_la64_00.c +++ b/src/dynarec/la64/dynarec_la64_00.c @@ -664,7 +664,11 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x6C: case 0x6D: INST_NAME(opcode == 0x6C ? "INSB" : "INSD"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(); CALL(native_priv, -1); @@ -676,7 +680,11 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x6E: case 0x6F: INST_NAME(opcode == 0x6C ? "OUTSB" : "OUTSD"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(); CALL(native_priv, -1); @@ -2325,7 +2333,11 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xF4: INST_NAME("HLT"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(); CALL(native_priv, -1); diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c index a899a365..73ce14e5 100644 --- a/src/dynarec/la64/dynarec_la64_0f.c +++ b/src/dynarec/la64/dynarec_la64_0f.c @@ -102,7 +102,11 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x0B: INST_NAME("UD2"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(); CALL(native_ud, -1); @@ -776,12 +780,14 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LDxw(x1, x3, fixedaddress); ed = x1; } - ANDI(x2, gd, rex.w ? 0x3f : 0x1f); - SRLxw(x4, ed, x2); - if (la64_lbt) - X64_SET_EFLAGS(x4, X_CF); - else - BSTRINS_D(xFlags, x4, F_CF, F_CF); + if (X_CF) { + ANDI(x2, gd, rex.w ? 0x3f : 0x1f); + SRLxw(x4, ed, x2); + if (la64_lbt) + X64_SET_EFLAGS(x4, X_CF); + else + BSTRINS_D(xFlags, x4, F_CF, F_CF); + } break; case 0xA4: nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_00_1.c b/src/dynarec/rv64/dynarec_rv64_00_1.c index 85c56ba2..f532218e 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_1.c +++ b/src/dynarec/rv64/dynarec_rv64_00_1.c @@ -285,7 +285,11 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x6C: case 0x6D: INST_NAME(opcode == 0x6C ? "INSB" : "INSD"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_priv, -1, 0, 0); @@ -297,7 +301,11 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x6E: case 0x6F: INST_NAME(opcode == 0x6C ? "OUTSB" : "OUTSD"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_priv, -1, 0, 0); diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 1a5d4fd7..19d5d2b9 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -524,7 +524,11 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int jump_to_epilog(dyn, 0, xRIP, ninst); } else if (u8 == 0x03) { INST_NAME("INT 3"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(addr); STORE_XEMU_CALL(x3); CALL(native_int3, -1, 0, 0); @@ -534,8 +538,12 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int *ok = 0; } else { INST_NAME("INT n"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state - GETIP(ip); // priviledged instruction, IP not updated + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } + GETIP(ip); // priviledged instruction, IP not updated STORE_XEMU_CALL(x3); CALL(native_priv, -1, 0, 0); LOAD_XEMU_CALL(); diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index d594a718..8d760708 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -131,7 +131,11 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x09: INST_NAME("WBINVD"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_ud, -1, 0, 0); @@ -143,7 +147,11 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x0B: INST_NAME("UD2"); - SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + if (BOX64DRENV(dynarec_safeflags) > 1) { + READFLAGS(X_PEND); + } else { + SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags in "don't care" state + } GETIP(ip); STORE_XEMU_CALL(x3); CALL(native_ud, -1, 0, 0); @@ -1822,9 +1830,11 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LDxw(x1, x3, fixedaddress); ed = x1; } - BEXT(x4, ed, gd, x2); - ANDI(xFlags, xFlags, ~1); // F_CF is 1 - OR(xFlags, xFlags, x4); + if (X_CF) { + BEXT(x4, ed, gd, x2); + ANDI(xFlags, xFlags, ~1); // F_CF is 1 + OR(xFlags, xFlags, x4); + } break; case 0xA4: nextop = F8; |