diff options
author | Liam <byteslice@airmail.cc> | 2023-11-22 05:23:48 +0100 |
---|---|---|
committer | t895 <clombardo169@gmail.com> | 2023-11-25 06:47:36 +0100 |
commit | cf534f514989e0d2e52df208818a39aa5eead7c0 (patch) | |
tree | 3677e07133815a84c8b894f7e3047e58dd7461fd /src/core/arm/nce | |
parent | android: show current backend in fps overlay (diff) | |
download | yuzu-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/arm/nce')
-rw-r--r-- | src/core/arm/nce/arm_nce.cpp | 14 |
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: |