diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2025-06-14 17:12:24 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-14 17:12:24 -0500 |
| commit | 2fb66e97087119715ada71c015f63c2decc97b2d (patch) | |
| tree | 6f701064efa03222a8dd3a59c204e8817490b8ed /Source/Core | |
| parent | 2047eaf1d86839b53bb92cf79cfae8be2a568ed6 (diff) | |
| parent | 6591fa37517e8157b1263bf1f866c7627dc4eb2a (diff) | |
Merge pull request #12938 from tygyh/Split-IsTranslatedRAMAddress
Core/PowerPC: Split 'IsRAMAddress' method into 'IsEffectiveRAMAddress' and 'IsPhysicalRAMAddress' methods
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/PowerPC/MMU.cpp | 43 | ||||
| -rw-r--r-- | Source/Core/Core/PowerPC/MMU.h | 3 |
2 files changed, 23 insertions, 23 deletions
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 <XCheckTLBFlag flag> -bool MMU::IsRAMAddress(u32 address, bool translate) +bool MMU::IsPhysicalRAMAddress(const u32 address) const { - if (translate) - { - auto translate_address = TranslateAddress<flag>(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 <XCheckTLBFlag flag> +bool MMU::IsEffectiveRAMAddress(const u32 address) +{ + const auto translate_address = TranslateAddress<flag>(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<XCheckTLBFlag::NoException>(address, mmu.m_ppc_state.msr.DR); + return mmu.m_ppc_state.msr.DR ? mmu.IsEffectiveRAMAddress<XCheckTLBFlag::NoException>(address) : + mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Physical: - return mmu.IsRAMAddress<XCheckTLBFlag::NoException>(address, false); + return mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Virtual: if (!mmu.m_ppc_state.msr.DR) return false; - return mmu.IsRAMAddress<XCheckTLBFlag::NoException>(address, true); + return mmu.IsEffectiveRAMAddress<XCheckTLBFlag::NoException>(address); } ASSERT(false); @@ -1001,13 +998,15 @@ bool MMU::HostIsInstructionRAMAddress(const Core::CPUThreadGuard& guard, u32 add switch (space) { case RequestedAddressSpace::Effective: - return mmu.IsRAMAddress<XCheckTLBFlag::OpcodeNoException>(address, mmu.m_ppc_state.msr.IR); + return mmu.m_ppc_state.msr.IR ? + mmu.IsEffectiveRAMAddress<XCheckTLBFlag::OpcodeNoException>(address) : + mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Physical: - return mmu.IsRAMAddress<XCheckTLBFlag::OpcodeNoException>(address, false); + return mmu.IsPhysicalRAMAddress(address); case RequestedAddressSpace::Virtual: if (!mmu.m_ppc_state.msr.IR) return false; - return mmu.IsRAMAddress<XCheckTLBFlag::OpcodeNoException>(address, true); + return mmu.IsEffectiveRAMAddress<XCheckTLBFlag::OpcodeNoException>(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 <XCheckTLBFlag flag, bool never_translate = false> void WriteToHardware(u32 em_address, const u32 data, const u32 size); template <XCheckTLBFlag flag> - bool IsRAMAddress(u32 address, bool translate); + bool IsEffectiveRAMAddress(u32 address); + bool IsPhysicalRAMAddress(u32 address) const; template <typename T> static std::optional<ReadResult<T>> HostTryReadUX(const Core::CPUThreadGuard& guard, |
