about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-03-26 16:24:17 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-03-26 16:24:17 +0100
commitd191b8c090b4dfab83ea1d1cf177f7e6ced34302 (patch)
tree6a8669e3e549d02240dd67f3478bb494599ae2b4
parentd53ff127edc928074d5a8df82ba793cd43a88bcd (diff)
downloadbox64-d191b8c090b4dfab83ea1d1cf177f7e6ced34302.tar.gz
box64-d191b8c090b4dfab83ea1d1cf177f7e6ced34302.zip
[ARM64_DYNAREC] More check to abort a block if x87 stack cache is incoherent
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.c11
-rw-r--r--src/dynarec/dynarec_native_pass.c2
2 files changed, 12 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c
index 27a73238..690daeec 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.c
+++ b/src/dynarec/arm64/dynarec_arm64_helper.c
@@ -959,6 +959,10 @@ int x87_do_push(dynarec_arm_t* dyn, int ninst, int s1, int t)
             dyn->n.neoncache[ret].t = X87_ST0;
         }
     }
+    if(ret==-1) {
+        MESSAGE(LOG_DUMP, "Incoherent x87 stack cache, aborting\n");
+        dyn->abort = 1;
+    }
     return ret;
 }
 void x87_do_push_empty(dynarec_arm_t* dyn, int ninst, int s1)
@@ -975,11 +979,18 @@ void x87_do_push_empty(dynarec_arm_t* dyn, int ninst, int s1)
          ||(dyn->n.neoncache[j].t == NEON_CACHE_ST_F)
          ||(dyn->n.neoncache[j].t == NEON_CACHE_ST_I64))
             ++dyn->n.neoncache[j].n;
+    int ret = -1;
     for(int i=0; i<8; ++i) {
         if(dyn->n.freed[i]!=-1)
             ++dyn->n.freed[i];
         if(dyn->n.x87cache[i]!=-1)
             ++dyn->n.x87cache[i];
+        else if(ret==-1)
+            ret = i;
+    }
+    if(ret==-1) {
+        MESSAGE(LOG_DUMP, "Incoherent x87 stack cache, aborting\n");
+        dyn->abort = 1;
     }
     if(s1)
         x87_stackcount(dyn, ninst, s1);
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index 8c609da1..24ceda70 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -161,7 +161,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
 
         addr = dynarec64_00(dyn, addr, ip, ninst, rex, rep, &ok, &need_epilog);
         if(dyn->abort)
-            return addr;
+            return ip;
         INST_EPILOG;
 
         int next = ninst+1;