summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorFiora <fioraaeterna@gmail.com>2014-10-21 05:55:56 -0700
committerFiora <fioraaeterna@gmail.com>2014-10-21 05:55:56 -0700
commitf4fa8d0b832fff4dd0fe2bb208fdfbf82aa79866 (patch)
tree75cde0006044f4a97111af5dcdfe5a2f6ea5d846 /Source/Core
parent080883ad9e5c2d1961ded65042aea544161c2d4a (diff)
MMU: allow page-table loads/stores if MMU is off
Fixes regressions in some games that apparently required this to work, but don't really require full MMU emulation (e.g. with exceptions and all).
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/MemmapFunctions.cpp32
1 files changed, 18 insertions, 14 deletions
diff --git a/Source/Core/Core/HW/MemmapFunctions.cpp b/Source/Core/Core/HW/MemmapFunctions.cpp
index 1287f1e948..93d5e020de 100644
--- a/Source/Core/Core/HW/MemmapFunctions.cpp
+++ b/Source/Core/Core/HW/MemmapFunctions.cpp
@@ -122,7 +122,7 @@ inline void ReadFromHardware(T &_var, const u32 em_address, const u32 effective_
// fake VMEM
_var = bswap((*(const T*)&m_pFakeVMEM[em_address & FAKEVMEM_MASK]));
}
- else if (SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU)
+ else
{
// MMU
// Handle loads that cross page boundaries (ewwww)
@@ -145,7 +145,10 @@ inline void ReadFromHardware(T &_var, const u32 em_address, const u32 effective_
{
if (flag == FLAG_READ)
{
- GenerateDSIException(addr, false);
+ if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU)
+ PanicAlertT("Invalid Read at 0x%08x, PC = 0x%08x ", em_address, PC);
+ else
+ GenerateDSIException(addr, false);
break;
}
}
@@ -171,7 +174,10 @@ inline void ReadFromHardware(T &_var, const u32 em_address, const u32 effective_
{
if (flag == FLAG_READ)
{
- GenerateDSIException(em_address, false);
+ if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU)
+ PanicAlertT("Invalid Read at 0x%08x, PC = 0x%08x ", em_address, PC);
+ else
+ GenerateDSIException(em_address, false);
}
}
else
@@ -187,10 +193,6 @@ inline void ReadFromHardware(T &_var, const u32 em_address, const u32 effective_
}
}
}
- else
- {
- PanicAlertT("Invalid Read at 0x%08x, PC = 0x%08x ", em_address, PC);
- }
}
@@ -260,7 +262,7 @@ inline void WriteToHardware(u32 em_address, const T data, u32 effective_address,
// fake VMEM
*(T*)&m_pFakeVMEM[em_address & FAKEVMEM_MASK] = bswap(data);
}
- else if (SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU)
+ else
{
// MMU
// Handle stores that cross page boundaries (ewwww)
@@ -276,7 +278,10 @@ inline void WriteToHardware(u32 em_address, const T data, u32 effective_address,
{
if (flag == FLAG_WRITE)
{
- GenerateDSIException(addr, true);
+ if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU)
+ PanicAlertT("Invalid Write to 0x%08x, PC = 0x%08x ", em_address, PC);
+ else
+ GenerateDSIException(addr, true);
break;
}
}
@@ -302,7 +307,10 @@ inline void WriteToHardware(u32 em_address, const T data, u32 effective_address,
{
if (flag == FLAG_WRITE)
{
- GenerateDSIException(em_address, true);
+ if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bMMU)
+ PanicAlertT("Invalid Write to 0x%08x, PC = 0x%08x ", em_address, PC);
+ else
+ GenerateDSIException(em_address, true);
}
}
else
@@ -318,10 +326,6 @@ inline void WriteToHardware(u32 em_address, const T data, u32 effective_address,
}
}
}
- else
- {
- PanicAlertT("Invalid Write to 0x%08x, PC = 0x%08x ", em_address, PC);
- }
}
// =====================