diff --git a/Source/Core/Core/Debugger/PPCDebugInterface.cpp b/Source/Core/Core/Debugger/PPCDebugInterface.cpp index b9a4a2f03d..1d7fd7343e 100644 --- a/Source/Core/Core/Debugger/PPCDebugInterface.cpp +++ b/Source/Core/Core/Debugger/PPCDebugInterface.cpp @@ -137,12 +137,12 @@ void PPCDebugInterface::ClearAllMemChecks() bool PPCDebugInterface::IsMemCheck(unsigned int address) { - return (Memory::AreMemoryBreakpointsActivated() && PowerPC::memchecks.GetMemCheck(address)); + return (PowerPC::memchecks.HasAny() && PowerPC::memchecks.GetMemCheck(address)); } void PPCDebugInterface::ToggleMemCheck(unsigned int address) { - if (Memory::AreMemoryBreakpointsActivated() && !PowerPC::memchecks.GetMemCheck(address)) + if (PowerPC::memchecks.HasAny() && !PowerPC::memchecks.GetMemCheck(address)) { // Add Memory Check TMemCheck MemCheck; diff --git a/Source/Core/Core/HW/CPU.cpp b/Source/Core/Core/HW/CPU.cpp index 5a17e5b01e..5d2833efdc 100644 --- a/Source/Core/Core/HW/CPU.cpp +++ b/Source/Core/Core/HW/CPU.cpp @@ -88,9 +88,7 @@ void Run() // If watchpoints are enabled, any instruction could be a breakpoint. if (PowerPC::GetMode() != PowerPC::MODE_INTERPRETER) { -#ifndef ENABLE_MEM_CHECK - if (PowerPC::breakpoints.IsAddressBreakPoint(PC)) -#endif + if (PowerPC::breakpoints.IsAddressBreakPoint(PC) || PowerPC::memchecks.HasAny()) { PowerPC::CoreMode old_mode = PowerPC::GetMode(); PowerPC::SetMode(PowerPC::MODE_INTERPRETER); diff --git a/Source/Core/Core/HW/Memmap.cpp b/Source/Core/Core/HW/Memmap.cpp index a08df2e6bb..05d731efcc 100644 --- a/Source/Core/Core/HW/Memmap.cpp +++ b/Source/Core/Core/HW/Memmap.cpp @@ -316,15 +316,6 @@ void Clear() memset(m_pEXRAM, 0, EXRAM_SIZE); } -bool AreMemoryBreakpointsActivated() -{ -#ifdef ENABLE_MEM_CHECK - return true; -#else - return false; -#endif -} - static inline u8* GetPointerForRange(u32 address, size_t size) { // Make sure we don't have a range spanning 2 separate banks diff --git a/Source/Core/Core/HW/Memmap.h b/Source/Core/Core/HW/Memmap.h index a14054076e..02c0650818 100644 --- a/Source/Core/Core/HW/Memmap.h +++ b/Source/Core/Core/HW/Memmap.h @@ -11,11 +11,6 @@ #include "Common/CommonTypes.h" #include "Core/PowerPC/PowerPC.h" -// Enable memory checks in the Debug/DebugFast builds, but NOT in release -#if defined(_DEBUG) || defined(DEBUGFAST) -#define ENABLE_MEM_CHECK -#endif - // Global declarations class PointerWrap; namespace MMIO @@ -72,7 +67,6 @@ void DoState(PointerWrap& p); void UpdateLogicalMemory(const PowerPC::BatTable& dbat_table); void Clear(); -bool AreMemoryBreakpointsActivated(); // Routines to access physically addressed memory, designed for use by // emulated hardware outside the CPU. Use "Device_" prefix. diff --git a/Source/Core/Core/PowerPC/MMU.cpp b/Source/Core/Core/PowerPC/MMU.cpp index 2853c94280..e5b669eaee 100644 --- a/Source/Core/Core/PowerPC/MMU.cpp +++ b/Source/Core/Core/PowerPC/MMU.cpp @@ -412,31 +412,32 @@ u32 HostRead_Instruction(const u32 address) static __forceinline void Memcheck(u32 address, u32 var, bool write, int size) { -#ifdef ENABLE_MEM_CHECK - TMemCheck* mc = PowerPC::memchecks.GetMemCheck(address); - if (mc) + if (PowerPC::memchecks.HasAny()) { - if (CPU::IsStepping()) + TMemCheck* mc = PowerPC::memchecks.GetMemCheck(address); + if (mc) { - // Disable when stepping so that resume works. - return; - } - mc->numHits++; - bool pause = mc->Action(&PowerPC::debug_interface, var, address, write, size, PC); - if (pause) - { - CPU::Break(); - // Fake a DSI so that all the code that tests for it in order to skip - // the rest of the instruction will apply. (This means that - // watchpoints will stop the emulator before the offending load/store, - // not after like GDB does, but that's better anyway. Just need to - // make sure resuming after that works.) - // It doesn't matter if ReadFromHardware triggers its own DSI because - // we'll take it after resuming. - PowerPC::ppcState.Exceptions |= EXCEPTION_DSI | EXCEPTION_FAKE_MEMCHECK_HIT; + if (CPU::IsStepping()) + { + // Disable when stepping so that resume works. + return; + } + mc->numHits++; + bool pause = mc->Action(&PowerPC::debug_interface, var, address, write, size, PC); + if (pause) + { + CPU::Break(); + // Fake a DSI so that all the code that tests for it in order to skip + // the rest of the instruction will apply. (This means that + // watchpoints will stop the emulator before the offending load/store, + // not after like GDB does, but that's better anyway. Just need to + // make sure resuming after that works.) + // It doesn't matter if ReadFromHardware triggers its own DSI because + // we'll take it after resuming. + PowerPC::ppcState.Exceptions |= EXCEPTION_DSI | EXCEPTION_FAKE_MEMCHECK_HIT; + } } } -#endif } u8 Read_U8(const u32 address) @@ -604,9 +605,8 @@ std::string HostGetString(u32 address, size_t size) bool IsOptimizableRAMAddress(const u32 address) { -#ifdef ENABLE_MEM_CHECK - return false; -#endif + if (PowerPC::memchecks.HasAny()) + return false; if (!UReg_MSR(MSR).DR) return false; @@ -745,9 +745,8 @@ void ClearCacheLine(u32 address) u32 IsOptimizableMMIOAccess(u32 address, u32 accessSize) { -#ifdef ENABLE_MEM_CHECK - return 0; -#endif + if (PowerPC::memchecks.HasAny()) + return 0; if (!UReg_MSR(MSR).DR) return 0; @@ -768,9 +767,8 @@ u32 IsOptimizableMMIOAccess(u32 address, u32 accessSize) bool IsOptimizableGatherPipeWrite(u32 address) { -#ifdef ENABLE_MEM_CHECK - return 0; -#endif + if (PowerPC::memchecks.HasAny()) + return 0; if (!UReg_MSR(MSR).DR) return 0; diff --git a/Source/Core/Core/PowerPC/PowerPC.cpp b/Source/Core/Core/PowerPC/PowerPC.cpp index e7d9e8617d..cb83f8b6aa 100644 --- a/Source/Core/Core/PowerPC/PowerPC.cpp +++ b/Source/Core/Core/PowerPC/PowerPC.cpp @@ -402,12 +402,10 @@ void CheckExceptions() INFO_LOG(POWERPC, "EXCEPTION_FPU_UNAVAILABLE"); ppcState.Exceptions &= ~EXCEPTION_FPU_UNAVAILABLE; } -#ifdef ENABLE_MEM_CHECK else if (exceptions & EXCEPTION_FAKE_MEMCHECK_HIT) { ppcState.Exceptions &= ~EXCEPTION_DSI & ~EXCEPTION_FAKE_MEMCHECK_HIT; } -#endif else if (exceptions & EXCEPTION_DSI) { SRR0 = PC; diff --git a/Source/Core/DolphinWX/Debugger/BreakpointWindow.cpp b/Source/Core/DolphinWX/Debugger/BreakpointWindow.cpp index dd2936a904..133e563fea 100644 --- a/Source/Core/DolphinWX/Debugger/BreakpointWindow.cpp +++ b/Source/Core/DolphinWX/Debugger/BreakpointWindow.cpp @@ -47,12 +47,8 @@ public: AddTool(ID_ADDBP, "+BP", m_Bitmaps[Toolbar_Add_BP]); Bind(wxEVT_TOOL, &CBreakPointWindow::OnAddBreakPoint, parent, ID_ADDBP); - // Add memory breakpoints if you can use them - if (Memory::AreMemoryBreakpointsActivated()) - { - AddTool(ID_ADDMC, "+MC", m_Bitmaps[Toolbar_Add_MC]); - Bind(wxEVT_TOOL, &CBreakPointWindow::OnAddMemoryCheck, parent, ID_ADDMC); - } + AddTool(ID_ADDMC, "+MC", m_Bitmaps[Toolbar_Add_MC]); + Bind(wxEVT_TOOL, &CBreakPointWindow::OnAddMemoryCheck, parent, ID_ADDMC); AddTool(ID_LOAD, _("Load"), m_Bitmaps[Toolbar_Delete]); Bind(wxEVT_TOOL, &CBreakPointWindow::Event_LoadAll, parent, ID_LOAD); diff --git a/Source/Core/DolphinWX/Debugger/WatchView.cpp b/Source/Core/DolphinWX/Debugger/WatchView.cpp index 72c4a37332..ec3227b33d 100644 --- a/Source/Core/DolphinWX/Debugger/WatchView.cpp +++ b/Source/Core/DolphinWX/Debugger/WatchView.cpp @@ -261,9 +261,7 @@ void CWatchView::OnMouseDownR(wxGridEvent& event) if (row != 0 && row != (int)(PowerPC::watches.GetWatches().size() + 1) && (col == 1 || col == 2)) { -#ifdef ENABLE_MEM_CHECK menu.Append(IDM_ADDMEMCHECK, _("Add memory &breakpoint")); -#endif menu.Append(IDM_VIEWMEMORY, _("View &memory")); } PopupMenu(&menu);