From 09df343247d7c7af4527689d8332b86ff3b10e7c Mon Sep 17 00:00:00 2001 From: aldelaro5 Date: Fri, 9 Sep 2016 14:10:48 -0400 Subject: [PATCH] Move Memchecks support out of debug only builds It wouldn't impact performance until at least one memcheck is enabled. Because of this, it can be used in release builds without much impact, the only thing that woudl change is the use of HasAny method instead of preprocessor conditionals. Since the perforamnce decrease comes right when the first memcheck is added and restored when the last is removed, it basically is all beneficial and works the same way. --- .../Core/Core/Debugger/PPCDebugInterface.cpp | 4 +- Source/Core/Core/HW/CPU.cpp | 4 +- Source/Core/Core/HW/Memmap.cpp | 9 --- Source/Core/Core/HW/Memmap.h | 6 -- Source/Core/Core/PowerPC/MMU.cpp | 58 +++++++++---------- Source/Core/Core/PowerPC/PowerPC.cpp | 2 - .../DolphinWX/Debugger/BreakpointWindow.cpp | 8 +-- Source/Core/DolphinWX/Debugger/WatchView.cpp | 2 - 8 files changed, 33 insertions(+), 60 deletions(-) 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);