summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2023-11-22 05:23:48 +0100
committert895 <clombardo169@gmail.com>2023-11-25 06:47:36 +0100
commitcf534f514989e0d2e52df208818a39aa5eead7c0 (patch)
tree3677e07133815a84c8b894f7e3047e58dd7461fd /src/core
parentandroid: show current backend in fps overlay (diff)
downloadyuzu-cf534f514989e0d2e52df208818a39aa5eead7c0.tar
yuzu-cf534f514989e0d2e52df208818a39aa5eead7c0.tar.gz
yuzu-cf534f514989e0d2e52df208818a39aa5eead7c0.tar.bz2
yuzu-cf534f514989e0d2e52df208818a39aa5eead7c0.tar.lz
yuzu-cf534f514989e0d2e52df208818a39aa5eead7c0.tar.xz
yuzu-cf534f514989e0d2e52df208818a39aa5eead7c0.tar.zst
yuzu-cf534f514989e0d2e52df208818a39aa5eead7c0.zip
Diffstat (limited to 'src/core')
-rw-r--r--src/core/arm/nce/arm_nce.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/core/arm/nce/arm_nce.cpp b/src/core/arm/nce/arm_nce.cpp
index bb1f6d2e6..6eb6299cc 100644
--- a/src/core/arm/nce/arm_nce.cpp
+++ b/src/core/arm/nce/arm_nce.cpp
@@ -116,10 +116,18 @@ bool ARM_NCE::HandleGuestFault(GuestContext* guest_ctx, void* raw_info, void* ra
return true;
}
- // We can't handle the access, so trigger an exception.
+ // We can't handle the access, so determine why we crashed.
const bool is_prefetch_abort = host_ctx.pc == reinterpret_cast<u64>(info->si_addr);
- guest_ctx->esr_el1.fetch_or(
- static_cast<u64>(is_prefetch_abort ? HaltReason::PrefetchAbort : HaltReason::DataAbort));
+
+ // For data aborts, skip the instruction and return to guest code.
+ // This will allow games to continue in many scenarios where they would otherwise crash.
+ if (!is_prefetch_abort) {
+ host_ctx.pc += 4;
+ return true;
+ }
+
+ // This is a prefetch abort.
+ guest_ctx->esr_el1.fetch_or(static_cast<u64>(HaltReason::PrefetchAbort));
// Forcibly mark the context as locked. We are still running.
// We may race with SignalInterrupt here: