about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-08-15 06:17:31 +0800
committerGitHub <noreply@github.com>2025-08-15 00:17:31 +0200
commit83e2427bfef1e675018205a21e72c9438e3814ab (patch)
treea9678846f8bc5f7b421ee72be356b20afe416243 /src
parent3815c28bfed9065efc8f663bf9623c28559f928b (diff)
downloadbox64-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.c3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c3
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();