mirror of https://github.com/mgba-emu/mgba.git
Start separating out debugger logic
This commit is contained in:
parent
6ad2b673b1
commit
6822a0d770
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue