Merge pull request #4203 from aldelaro5/free-memChecks-debug-builds

Move Memchecks support out of debug only builds
This commit is contained in:
Markus Wick 2016-09-10 23:24:24 +02:00 committed by GitHub
commit a15b3fda6e
8 changed files with 33 additions and 60 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);