diff --git a/src/debugger/debugger.c b/src/debugger/debugger.c index 298d6072d..ce67dbd78 100644 --- a/src/debugger/debugger.c +++ b/src/debugger/debugger.c @@ -242,8 +242,7 @@ static void _checkBreakpoints(struct ARMDebugger* debugger) { } for (breakpoint = debugger->breakpoints; breakpoint; breakpoint = breakpoint->next) { if (breakpoint->address + instructionLength == debugger->cpu->gprs[ARM_PC]) { - debugger->state = DEBUGGER_PAUSED; - printf("Hit breakpoint\n"); + ARMDebuggerEnter(debugger, DEBUGGER_ENTER_BREAKPOINT); break; } } @@ -251,7 +250,7 @@ static void _checkBreakpoints(struct ARMDebugger* debugger) { static void _breakIntoDefault(int signal) { (void)(signal); - _activeDebugger->state = DEBUGGER_PAUSED; + ARMDebuggerEnter(_activeDebugger, DEBUGGER_ENTER_MANUAL); } enum _DVParseState { @@ -558,6 +557,23 @@ static void _commandLine(struct ARMDebugger* debugger) { } } +static void _reportEntry(struct ARMDebugger* debugger, enum DebuggerEntryReason reason) { + (void) (debugger); + switch (reason) { + case DEBUGGER_ENTER_MANUAL: + break; + case DEBUGGER_ENTER_BREAKPOINT: + printf("Hit breakpoint\n"); + break; + case DEBUGGER_ENTER_WATCHPOINT: + printf("Hit watchpoint\n"); + break; + case DEBUGGER_ENTER_ILLEGAL_OP: + printf("Hit illegal opcode\n"); + break; + } +} + static unsigned char _tabComplete(EditLine* elstate, int ch) { (void)(ch); const LineInfo* li = el_line(elstate); @@ -603,6 +619,10 @@ void ARMDebuggerInit(struct ARMDebugger* debugger, struct ARMCore* cpu) { debugger->memoryShim.p = debugger; debugger->memoryShim.watchpoints = 0; _activeDebugger = debugger; + debugger->init = 0; + debugger->deinit = 0; + debugger->paused = _commandLine; + debugger->entered = _reportEntry; signal(SIGINT, _breakIntoDefault); } @@ -631,7 +651,7 @@ void ARMDebuggerRun(struct ARMDebugger* debugger) { case DEBUGGER_RUNNING: break; case DEBUGGER_PAUSED: - _commandLine(debugger); + debugger->paused(debugger); break; case DEBUGGER_EXITING: case DEBUGGER_SHUTDOWN: @@ -640,6 +660,9 @@ void ARMDebuggerRun(struct ARMDebugger* debugger) { } } -void ARMDebuggerEnter(struct ARMDebugger* debugger) { +void ARMDebuggerEnter(struct ARMDebugger* debugger, enum DebuggerEntryReason reason) { debugger->state = DEBUGGER_PAUSED; + if (debugger->entered) { + debugger->entered(debugger, reason); + } } diff --git a/src/debugger/debugger.h b/src/debugger/debugger.h index 03b09b6a8..59738d47e 100644 --- a/src/debugger/debugger.h +++ b/src/debugger/debugger.h @@ -29,6 +29,13 @@ struct DebugMemoryShim { struct DebugBreakpoint* watchpoints; }; +enum DebuggerEntryReason { + DEBUGGER_ENTER_MANUAL, + DEBUGGER_ENTER_BREAKPOINT, + DEBUGGER_ENTER_WATCHPOINT, + DEBUGGER_ENTER_ILLEGAL_OP +}; + struct ARMDebugger { enum DebuggerState state; struct ARMCore* cpu; @@ -38,12 +45,17 @@ struct ARMDebugger { struct DebugBreakpoint* breakpoints; struct DebugMemoryShim memoryShim; + + void (*init)(struct ARMDebugger*, struct ARMCore*); + void (*deinit)(struct ARMDebugger*); + void (*paused)(struct ARMDebugger*); + void (*entered)(struct ARMDebugger*, enum DebuggerEntryReason); }; void ARMDebuggerInit(struct ARMDebugger*, struct ARMCore*); void ARMDebuggerDeinit(struct ARMDebugger*); void ARMDebuggerRun(struct ARMDebugger*); -void ARMDebuggerEnter(struct ARMDebugger*); +void ARMDebuggerEnter(struct ARMDebugger*, enum DebuggerEntryReason); #else diff --git a/src/debugger/memory-debugger.c b/src/debugger/memory-debugger.c index 94d75b309..3f9775f70 100644 --- a/src/debugger/memory-debugger.c +++ b/src/debugger/memory-debugger.c @@ -76,7 +76,7 @@ uint8_t ARMDebuggerLoadU8(struct ARMMemory* memory, uint32_t address, int* cycle void ARMDebuggerShim_store32(struct ARMMemory* memory, uint32_t address, int32_t value, int* cycleCounter) { struct DebugMemoryShim* debugMemory = (struct DebugMemoryShim*) memory; if (_checkWatchpoints(debugMemory->watchpoints, address, 4)) { - ARMDebuggerEnter(debugMemory->p); + ARMDebuggerEnter(debugMemory->p, DEBUGGER_ENTER_WATCHPOINT); } debugMemory->original->store32(debugMemory->original, address, value, cycleCounter); } @@ -84,7 +84,7 @@ void ARMDebuggerShim_store32(struct ARMMemory* memory, uint32_t address, int32_t void ARMDebuggerShim_store16(struct ARMMemory* memory, uint32_t address, int16_t value, int* cycleCounter) { struct DebugMemoryShim* debugMemory = (struct DebugMemoryShim*) memory; if (_checkWatchpoints(debugMemory->watchpoints, address, 2)) { - ARMDebuggerEnter(debugMemory->p); + ARMDebuggerEnter(debugMemory->p, DEBUGGER_ENTER_WATCHPOINT); } debugMemory->original->store16(debugMemory->original, address, value, cycleCounter); } @@ -92,7 +92,7 @@ void ARMDebuggerShim_store16(struct ARMMemory* memory, uint32_t address, int16_t void ARMDebuggerShim_store8(struct ARMMemory* memory, uint32_t address, int8_t value, int* cycleCounter) { struct DebugMemoryShim* debugMemory = (struct DebugMemoryShim*) memory; if (_checkWatchpoints(debugMemory->watchpoints, address, 1)) { - ARMDebuggerEnter(debugMemory->p); + ARMDebuggerEnter(debugMemory->p, DEBUGGER_ENTER_WATCHPOINT); } debugMemory->original->store8(debugMemory->original, address, value, cycleCounter); } diff --git a/src/gba/gba.c b/src/gba/gba.c index 5651b69a1..2810eb214 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -542,7 +542,7 @@ void GBAHitStub(struct ARMBoard* board, uint32_t opcode) { #ifdef USE_DEBUGGER if (gbaBoard->p->debugger) { level = GBA_LOG_STUB; - ARMDebuggerEnter(gbaBoard->p->debugger); + ARMDebuggerEnter(gbaBoard->p->debugger, DEBUGGER_ENTER_ILLEGAL_OP); } #endif GBALog(gbaBoard->p, level, "Stub opcode: %08x", opcode); @@ -553,7 +553,7 @@ void GBAIllegal(struct ARMBoard* board, uint32_t opcode) { GBALog(gbaBoard->p, GBA_LOG_WARN, "Illegal opcode: %08x", opcode); #ifdef USE_DEBUGGER if (gbaBoard->p->debugger) { - ARMDebuggerEnter(gbaBoard->p->debugger); + ARMDebuggerEnter(gbaBoard->p->debugger, DEBUGGER_ENTER_ILLEGAL_OP); } #endif } diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c index 261bf3682..96e49e549 100644 --- a/src/platform/sdl/sdl-events.c +++ b/src/platform/sdl/sdl-events.c @@ -62,7 +62,7 @@ static void _GBASDLHandleKeypress(struct GBAThread* context, const struct SDL_Ke #ifdef USE_DEBUGGER case SDLK_F11: if (event->type == SDL_KEYDOWN && context->debugger) { - ARMDebuggerEnter(context->debugger); + ARMDebuggerEnter(context->debugger, DEBUGGER_ENTER_MANUAL); } break; #endif