diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index 9de8dddab4..a3a36c43bb 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp @@ -923,7 +923,9 @@ MICROPROFILE_DEFINE(DynCom_Execute, "DynCom", "Execute", MP_RGB(255, 0, 0)); unsigned InterpreterMainLoop(ARMul_State* cpu) { MICROPROFILE_SCOPE(DynCom_Execute); + /// Nearest upcoming GDB code execution breakpoint, relative to the last dispatch's address. GDBStub::BreakpointAddress breakpoint_data; + breakpoint_data.type = GDBStub::BreakpointType::None; #undef RM #undef RS @@ -955,8 +957,10 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { cpu->Cpsr &= ~(1 << 5); \ cpu->Cpsr |= cpu->TFlag << 5; \ if (GDBStub::IsServerEnabled()) { \ - if (GDBStub::IsMemoryBreak() || (breakpoint_data.type != GDBStub::BreakpointType::None && \ - PC == breakpoint_data.address)) { \ + if (GDBStub::IsMemoryBreak()) { \ + goto END; \ + } else if (breakpoint_data.type != GDBStub::BreakpointType::None && \ + PC == breakpoint_data.address) { \ cpu->RecordBreak(breakpoint_data); \ goto END; \ } \ diff --git a/src/core/arm/skyeye_common/armstate.cpp b/src/core/arm/skyeye_common/armstate.cpp index 3bd4d28f1c..26520da766 100644 --- a/src/core/arm/skyeye_common/armstate.cpp +++ b/src/core/arm/skyeye_common/armstate.cpp @@ -602,13 +602,15 @@ void ARMul_State::ServeBreak() { return; } - if (last_bkpt_hit) { - Reg[15] = last_bkpt.address; + if (last_bkpt_hit && last_bkpt.type == GDBStub::BreakpointType::Execute) { + DEBUG_ASSERT(Reg[15] == last_bkpt.address); } + DEBUG_ASSERT(system != nullptr); Kernel::Thread* thread = system->Kernel().GetThreadManager().GetCurrentThread(); system->CPU().SaveContext(thread->context); - if (last_bkpt_hit || GDBStub::GetCpuStepFlag()) { + + if (last_bkpt_hit || GDBStub::IsMemoryBreak() || GDBStub::GetCpuStepFlag()) { last_bkpt_hit = false; GDBStub::Break(); GDBStub::SendTrap(thread, 5); diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h index eedc68c695..7a04e929ab 100644 --- a/src/core/arm/skyeye_common/armstate.h +++ b/src/core/arm/skyeye_common/armstate.h @@ -268,5 +268,5 @@ private: bool exclusive_state; GDBStub::BreakpointAddress last_bkpt{}; - bool last_bkpt_hit; + bool last_bkpt_hit = false; }; diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index d7649227fb..7f722ab0fb 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -892,7 +892,7 @@ static void Step() { } bool IsMemoryBreak() { - if (IsConnected()) { + if (!IsConnected()) { return false; }