From 21fb6e5385ad67ac5cfa87bd109a85d9abac620e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 21 May 2022 11:39:26 -0700 Subject: [PATCH] Crash: Recover from unaligned CPU access. This catches SIMD accesses that are unaligned, see #15523. --- Core/MemFault.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Core/MemFault.cpp b/Core/MemFault.cpp index bf4021749b..eb10f880ca 100644 --- a/Core/MemFault.cpp +++ b/Core/MemFault.cpp @@ -111,15 +111,17 @@ bool HandleFault(uintptr_t hostAddress, void *ctx) { #endif // Check whether hostAddress is within the PSP memory space, which (likely) means it was a guest executable that did the bad access. + bool invalidHostAddress = hostAddress == (uintptr_t)0xFFFFFFFFFFFFFFFFULL; if (hostAddress < baseAddress || hostAddress >= baseAddress + addressSpaceSize) { // Host address outside - this was a different kind of crash. - return false; + if (!invalidHostAddress) + return false; } // OK, a guest executable did a bad access. Take care of it. - uint32_t guestAddress = (uint32_t)(hostAddress - baseAddress); + uint32_t guestAddress = invalidHostAddress ? 0xFFFFFFFFUL : (uint32_t)(hostAddress - baseAddress); // TODO: Share the struct between the various analyzers, that will allow us to share most of // the implementations here.