From 03c88c83acb3d9ec411577d846ff8034ee0cdf4c Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 11 Jun 2018 22:07:56 +0200 Subject: [PATCH] CachedInterpreter: Implement breakpoints. There were missed on the initial implementation of the cached interpreter. --- .../CachedInterpreter/CachedInterpreter.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/PowerPC/CachedInterpreter/CachedInterpreter.cpp b/Source/Core/Core/PowerPC/CachedInterpreter/CachedInterpreter.cpp index a11bc851ca..89ce274a46 100644 --- a/Source/Core/Core/PowerPC/CachedInterpreter/CachedInterpreter.cpp +++ b/Source/Core/Core/PowerPC/CachedInterpreter/CachedInterpreter.cpp @@ -109,6 +109,7 @@ void CachedInterpreter::ExecuteOneBlock() void CachedInterpreter::Run() { + const CPU::State* state_ptr = CPU::GetStatePtr(); while (CPU::GetState() == CPU::State::Running) { // Start new timing slice @@ -118,7 +119,7 @@ void CachedInterpreter::Run() do { ExecuteOneBlock(); - } while (PowerPC::ppcState.downcount > 0); + } while (PowerPC::ppcState.downcount > 0 && *state_ptr == CPU::State::Running); } } @@ -169,6 +170,17 @@ static bool CheckDSI(u32 data) return false; } +static bool CheckBreakpoint(u32 data) +{ + PowerPC::CheckBreakPoints(); + if (CPU::GetState() != CPU::State::Running) + { + PowerPC::ppcState.downcount -= data; + return true; + } + return false; +} + bool CachedInterpreter::HandleFunctionHooking(u32 address) { return HLE::ReplaceFunctionIfPossible(address, [&](u32 function, HLE::HookType type) { @@ -225,10 +237,18 @@ void CachedInterpreter::Jit(u32 address) if (!op.skip) { + const bool breakpoint = SConfig::GetInstance().bEnableDebugging && + PowerPC::breakpoints.IsAddressBreakPoint(op.address); const bool check_fpu = (op.opinfo->flags & FL_USE_FPU) && !js.firstFPInstructionFound; const bool endblock = (op.opinfo->flags & FL_ENDBLOCK) != 0; const bool memcheck = (op.opinfo->flags & FL_LOADSTORE) && jo.memcheck; + if (breakpoint) + { + m_code.emplace_back(WritePC, op.address); + m_code.emplace_back(CheckBreakpoint, js.downcountAmount); + } + if (check_fpu) { m_code.emplace_back(WritePC, op.address);