diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-15 06:17:31 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-15 00:17:31 +0200 |
| commit | 83e2427bfef1e675018205a21e72c9438e3814ab (patch) | |
| tree | a9678846f8bc5f7b421ee72be356b20afe416243 /src | |
| parent | 3815c28bfed9065efc8f663bf9623c28559f928b (diff) | |
| download | box64-83e2427bfef1e675018205a21e72c9438e3814ab.tar.gz box64-83e2427bfef1e675018205a21e72c9438e3814ab.zip | |
[RV64_DYNAREC] Fixed OF2 handling (#2937)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_2.c | 3 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 3 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 3 |
3 files changed, 4 insertions, 5 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c index ec484941..4c5f3687 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_2.c +++ b/src/dynarec/rv64/dynarec_rv64_00_2.c @@ -579,7 +579,6 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0x9C: INST_NAME("PUSHF"); - NOTEST(x1); READFLAGS(X_ALL); FLAGS_ADJUST_TO11(x3, xFlags, x2); PUSH1z(x3); @@ -589,7 +588,7 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int SETFLAGS(X_ALL, SF_SET, NAT_FLAGS_NOFUSION); POP1z(xFlags); FLAGS_ADJUST_FROM11(xFlags, xFlags, x2); - MOV32w(x1, 0x3F7FD7); + MOV32w(x1, 0x3F7FF7); AND(xFlags, xFlags, x1); ORI(xFlags, xFlags, 0x202); SET_DFNONE(); diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index bb530dba..a9399651 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -768,7 +768,6 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x9C: INST_NAME("PUSHF"); - NOTEST(x1); READFLAGS(X_ALL); FLAGS_ADJUST_TO11(x3, xFlags, x2); PUSH1_16(x3); @@ -781,7 +780,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LUI(x2, 0xffff0); AND(xFlags, xFlags, x2); OR(xFlags, xFlags, x1); - MOV32w(x1, 0x3F7FD7); + MOV32w(x1, 0x3F7FF7); AND(xFlags, xFlags, x1); ORI(xFlags, xFlags, 0x2); SET_DFNONE(); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 0f91036a..6f008865 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -739,11 +739,12 @@ void iret_to_epilog(dynarec_rv64_t* dyn, uintptr_t ip, int ninst, int is64bits) POP1_32(x2); POP1_32(xFlags); } + FLAGS_ADJUST_FROM11(xFlags, xFlags, x2); SH(x2, xEmu, offsetof(x64emu_t, segs[_CS])); SW(xZR, xEmu, offsetof(x64emu_t, segs_serial[_CS])); // clean EFLAGS - MOV32w(x1, 0x3F7FD7); + MOV32w(x1, 0x3F7FF7); AND(xFlags, xFlags, x1); ORI(xFlags, xFlags, 0x2); SET_DFNONE(); |