void ARMDebuggerRun(struct ARMDebugger* debugger) { switch (debugger->state) { case DEBUGGER_RUNNING: if (!DebugBreakpointListSize(&debugger->breakpoints) && !DebugWatchpointListSize(&debugger->watchpoints)) { ARMRunLoop(debugger->cpu); } else { ARMRun(debugger->cpu); _checkBreakpoints(debugger); } break; case DEBUGGER_CUSTOM: ARMRun(debugger->cpu); _checkBreakpoints(debugger); debugger->custom(debugger); break; case DEBUGGER_PAUSED: if (debugger->paused) { debugger->paused(debugger); } else { debugger->state = DEBUGGER_RUNNING; } if (debugger->state != DEBUGGER_PAUSED && debugger->currentBreakpoint) { if (debugger->currentBreakpoint->isSw && debugger->setSoftwareBreakpoint) { debugger->setSoftwareBreakpoint(debugger, debugger->currentBreakpoint->address, debugger->currentBreakpoint->sw.mode, &debugger->currentBreakpoint->sw.opcode); } debugger->currentBreakpoint = 0; } break; case DEBUGGER_SHUTDOWN: return; } }
static void _next(struct CLIDebugger* debugger, struct CLIDebugVector* dv) { UNUSED(dv); if (debugger->d.currentBreakpoint) { if (debugger->d.currentBreakpoint->isSw && debugger->d.setSoftwareBreakpoint) { debugger->d.setSoftwareBreakpoint(&debugger->d, debugger->d.currentBreakpoint->address, debugger->d.currentBreakpoint->sw.mode, &debugger->d.currentBreakpoint->sw.opcode); } debugger->d.currentBreakpoint = 0; } ARMRun(debugger->d.cpu); _printStatus(debugger, 0); }