summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2025-06-14 17:12:24 -0500
committerGitHub <noreply@github.com>2025-06-14 17:12:24 -0500
commit2fb66e97087119715ada71c015f63c2decc97b2d (patch)
tree6f701064efa03222a8dd3a59c204e8817490b8ed /Source/Core
parent2047eaf1d86839b53bb92cf79cfae8be2a568ed6 (diff)
parent6591fa37517e8157b1263bf1f866c7627dc4eb2a (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.cpp43
-rw-r--r--Source/Core/Core/PowerPC/MMU.h3
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,