diff options
-rw-r--r-- | src/core/arm/dyncom/arm_dyncom_interpreter.cpp | 6 | ||||
-rw-r--r-- | src/core/gdbstub/gdbstub.cpp | 13 | ||||
-rw-r--r-- | src/core/gdbstub/gdbstub.h | 7 |
3 files changed, 18 insertions, 8 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index 8293f4c60..88be27ab2 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp @@ -3583,7 +3583,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { Common::Profiling::ScopeTimer timer_execute(profile_execute); MICROPROFILE_SCOPE(DynCom_Execute); - int breakpoint_offset = -1; + GDBStub::BreakpointAddress breakpoint_data; #undef RM #undef RS @@ -3613,7 +3613,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { cpu->Cpsr &= ~(1 << 5); \ cpu->Cpsr |= cpu->TFlag << 5; \ if (GDBStub::g_server_enabled) { \ - if (GDBStub::IsMemoryBreak() || PC == breakpoint_offset) { \ + if (GDBStub::IsMemoryBreak() || (breakpoint_data.type != GDBStub::BreakpointType::None && PC == breakpoint_data.address)) { \ GDBStub::Break(); \ goto END; \ } \ @@ -3923,7 +3923,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { // Find breakpoint if one exists within the block if (GDBStub::g_server_enabled && GDBStub::IsConnected()) { - breakpoint_offset = GDBStub::GetNextBreakpointFromAddress(cpu->Reg[15], GDBStub::BreakpointType::Execute); + breakpoint_data = GDBStub::GetNextBreakpointFromAddress(cpu->Reg[15], GDBStub::BreakpointType::Execute); } inst_base = (arm_inst *)&inst_buf[ptr]; diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index ced1c54f5..25ce63b29 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -231,13 +231,18 @@ static void RemoveBreakpoint(BreakpointType type, PAddr addr) { } } -PAddr GetNextBreakpointFromAddress(PAddr addr, BreakpointType type) { +BreakpointAddress GetNextBreakpointFromAddress(PAddr addr, BreakpointType type) { std::map<u32, Breakpoint>& p = GetBreakpointList(type); auto next_breakpoint = p.lower_bound(addr); - u32 breakpoint = -1; + BreakpointAddress breakpoint; - if (next_breakpoint != p.end()) - breakpoint = next_breakpoint->first; + if (next_breakpoint != p.end()) { + breakpoint.address = next_breakpoint->first; + breakpoint.type = type; + } else { + breakpoint.address = 0; + breakpoint.type = BreakpointType::None; + } return breakpoint; } diff --git a/src/core/gdbstub/gdbstub.h b/src/core/gdbstub/gdbstub.h index 11ff823c3..da238f349 100644 --- a/src/core/gdbstub/gdbstub.h +++ b/src/core/gdbstub/gdbstub.h @@ -18,6 +18,11 @@ enum class BreakpointType { Access ///< Access (R/W) Breakpoint }; +struct BreakpointAddress { + PAddr address; + BreakpointType type; +}; + /// If set to false, the server will never be started and no gdbstub-related functions will be executed. extern std::atomic<bool> g_server_enabled; @@ -63,7 +68,7 @@ void HandlePacket(); * @param addr Address to search from. * @param type Type of breakpoint. */ -PAddr GetNextBreakpointFromAddress(u32 addr, GDBStub::BreakpointType type); +BreakpointAddress GetNextBreakpointFromAddress(u32 addr, GDBStub::BreakpointType type); /** * Check if a breakpoint of the specified type exists at the given address. |