diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-03-26 16:24:17 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-03-26 16:24:17 +0100 |
| commit | d191b8c090b4dfab83ea1d1cf177f7e6ced34302 (patch) | |
| tree | 6a8669e3e549d02240dd67f3478bb494599ae2b4 | |
| parent | d53ff127edc928074d5a8df82ba793cd43a88bcd (diff) | |
| download | box64-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.c | 11 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 2 |
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; |