diff --git a/Source/Core/Core/PowerPC/MMU.cpp b/Source/Core/Core/PowerPC/MMU.cpp index 58f668d006..7cb9b9ac52 100644 --- a/Source/Core/Core/PowerPC/MMU.cpp +++ b/Source/Core/Core/PowerPC/MMU.cpp @@ -937,39 +937,35 @@ bool MMU::IsOptimizableRAMAddress(const u32 address, const u32 access_size) cons return (bat_result_1 & bat_result_2 & BAT_PHYSICAL_BIT) != 0; } -template -bool MMU::IsRAMAddress(u32 address, bool translate) +bool MMU::IsPhysicalRAMAddress(const u32 address) const { - if (translate) - { - auto translate_address = TranslateAddress(address); - if (!translate_address.Success()) - return false; - address = translate_address.address; - } - - u32 segment = address >> 28; + const u32 segment = address >> 28; if (m_memory.GetRAM() && segment == 0x0 && (address & 0x0FFFFFFF) < m_memory.GetRamSizeReal()) { return true; } - else if (m_memory.GetEXRAM() && segment == 0x1 && - (address & 0x0FFFFFFF) < m_memory.GetExRamSizeReal()) + if (m_memory.GetEXRAM() && segment == 0x1 && (address & 0x0FFFFFFF) < m_memory.GetExRamSizeReal()) { return true; } - else if (m_memory.GetFakeVMEM() && ((address & 0xFE000000) == 0x7E000000)) + if (m_memory.GetFakeVMEM() && (address & 0xFE000000) == 0x7E000000) { return true; } - else if (m_memory.GetL1Cache() && segment == 0xE && - (address < (0xE0000000 + m_memory.GetL1CacheSize()))) + if (m_memory.GetL1Cache() && segment == 0xE && address < 0xE0000000 + m_memory.GetL1CacheSize()) { return true; } return false; } +template +bool MMU::IsEffectiveRAMAddress(const u32 address) +{ + const auto translate_address = TranslateAddress(address); + return translate_address.Success() && IsPhysicalRAMAddress(translate_address.address); +} + bool MMU::HostIsRAMAddress(const Core::CPUThreadGuard& guard, u32 address, RequestedAddressSpace space) { @@ -977,13 +973,14 @@ bool MMU::HostIsRAMAddress(const Core::CPUThreadGuard& guard, u32 address, switch (space) { case RequestedAddressSpace::Effective: - return mmu.IsRAMAddress(address, mmu.m_ppc_state.msr.DR); + return mmu.m_ppc_state.msr.DR ? mmu.IsEffectiveRAMAddress(address) : + mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Physical: - return mmu.IsRAMAddress(address, false); + return mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Virtual: if (!mmu.m_ppc_state.msr.DR) return false; - return mmu.IsRAMAddress(address, true); + return mmu.IsEffectiveRAMAddress(address); } ASSERT(false); @@ -1001,13 +998,15 @@ bool MMU::HostIsInstructionRAMAddress(const Core::CPUThreadGuard& guard, u32 add switch (space) { case RequestedAddressSpace::Effective: - return mmu.IsRAMAddress(address, mmu.m_ppc_state.msr.IR); + return mmu.m_ppc_state.msr.IR ? + mmu.IsEffectiveRAMAddress(address) : + mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Physical: - return mmu.IsRAMAddress(address, false); + return mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Virtual: if (!mmu.m_ppc_state.msr.IR) return false; - return mmu.IsRAMAddress(address, true); + return mmu.IsEffectiveRAMAddress(address); } ASSERT(false); diff --git a/Source/Core/Core/PowerPC/MMU.h b/Source/Core/Core/PowerPC/MMU.h index a26fd7f66c..cee7d3213b 100644 --- a/Source/Core/Core/PowerPC/MMU.h +++ b/Source/Core/Core/PowerPC/MMU.h @@ -310,7 +310,8 @@ private: template void WriteToHardware(u32 em_address, const u32 data, const u32 size); template - bool IsRAMAddress(u32 address, bool translate); + bool IsEffectiveRAMAddress(u32 address); + bool IsPhysicalRAMAddress(u32 address) const; template static std::optional> HostTryReadUX(const Core::CPUThreadGuard& guard,