From 960d957f4fe5430eece3d99fc0d4d5649e848f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Tue, 6 Apr 2021 01:35:56 +0200 Subject: [PATCH] MMU: Fix SDR updates being silently dropped in some cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While 6xx_pem.pdf §7.6.1.1 mentions that the number of trailing zeros in HTABORG must be equal to the number of trailing ones in the mask (i.e. HTABORG must be properly aligned), this is actually not a hard requirement. Real hardware will just OR the base address anyway. Ignoring SDR changes would lead to incorrect emulation. Logging a warning instead of dropping the SDR update silently is a saner behaviour. --- Source/Core/Core/PowerPC/MMU.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Source/Core/Core/PowerPC/MMU.cpp b/Source/Core/Core/PowerPC/MMU.cpp index 9714af5bc7..a8ed456de7 100644 --- a/Source/Core/Core/PowerPC/MMU.cpp +++ b/Source/Core/Core/PowerPC/MMU.cpp @@ -980,14 +980,16 @@ void SDRUpdated() { u32 htabmask = SDR1_HTABMASK(PowerPC::ppcState.spr[SPR_SDR]); if (!Common::IsValidLowMask(htabmask)) - { - return; - } + WARN_LOG_FMT(POWERPC, "Invalid HTABMASK: 0b{:032b}", htabmask); + + // While 6xx_pem.pdf §7.6.1.1 mentions that the number of trailing zeros in HTABORG + // must be equal to the number of trailing ones in the mask (i.e. HTABORG must be + // properly aligned), this is actually not a hard requirement. Real hardware will just OR + // the base address anyway. Ignoring SDR changes would lead to incorrect emulation. u32 htaborg = SDR1_HTABORG(PowerPC::ppcState.spr[SPR_SDR]); if (htaborg & htabmask) - { - return; - } + WARN_LOG_FMT(POWERPC, "Invalid HTABORG: htaborg=0x{:08x} htabmask=0x{:08x}", htaborg, htabmask); + PowerPC::ppcState.pagetable_base = htaborg << 16; PowerPC::ppcState.pagetable_hashmask = ((htabmask << 10) | 0x3ff); }