src/debugger/debugger.c (view raw)
1#include "debugger.h"
2
3#include "arm.h"
4
5#include "memory-debugger.h"
6
7#include <stdlib.h>
8
9static void _checkBreakpoints(struct ARMDebugger* debugger) {
10 struct DebugBreakpoint* breakpoint;
11 int instructionLength;
12 enum ExecutionMode mode = debugger->cpu->cpsr.t;
13 if (mode == MODE_ARM) {
14 instructionLength = WORD_SIZE_ARM;
15 } else {
16 instructionLength = WORD_SIZE_THUMB;
17 }
18 for (breakpoint = debugger->breakpoints; breakpoint; breakpoint = breakpoint->next) {
19 if (breakpoint->address + instructionLength == debugger->cpu->gprs[ARM_PC]) {
20 ARMDebuggerEnter(debugger, DEBUGGER_ENTER_BREAKPOINT);
21 break;
22 }
23 }
24}
25
26void ARMDebuggerInit(struct ARMDebugger* debugger, struct ARMCore* cpu) {
27 debugger->cpu = cpu;
28 debugger->state = DEBUGGER_PAUSED;
29 debugger->breakpoints = 0;
30 debugger->memoryShim.p = debugger;
31 debugger->memoryShim.watchpoints = 0;
32 debugger->init(debugger);
33}
34
35void ARMDebuggerDeinit(struct ARMDebugger* debugger) {
36 // TODO: actually call this
37 debugger->deinit(debugger);
38}
39
40void ARMDebuggerRun(struct ARMDebugger* debugger) {
41 if (debugger->state == DEBUGGER_EXITING) {
42 debugger->state = DEBUGGER_RUNNING;
43 }
44 while (debugger->state < DEBUGGER_EXITING) {
45 if (!debugger->breakpoints) {
46 while (debugger->state == DEBUGGER_RUNNING) {
47 ARMRun(debugger->cpu);
48 }
49 } else {
50 while (debugger->state == DEBUGGER_RUNNING) {
51 ARMRun(debugger->cpu);
52 _checkBreakpoints(debugger);
53 }
54 }
55 switch (debugger->state) {
56 case DEBUGGER_RUNNING:
57 break;
58 case DEBUGGER_PAUSED:
59 debugger->paused(debugger);
60 break;
61 case DEBUGGER_EXITING:
62 case DEBUGGER_SHUTDOWN:
63 return;
64 }
65 }
66}
67
68void ARMDebuggerEnter(struct ARMDebugger* debugger, enum DebuggerEntryReason reason) {
69 debugger->state = DEBUGGER_PAUSED;
70 if (debugger->entered) {
71 debugger->entered(debugger, reason);
72 }
73}
74
75void ARMDebuggerSetBreakpoint(struct ARMDebugger* debugger, uint32_t address) {
76 struct DebugBreakpoint* breakpoint = malloc(sizeof(struct DebugBreakpoint));
77 breakpoint->address = address;
78 breakpoint->next = debugger->breakpoints;
79 debugger->breakpoints = breakpoint;
80}
81
82void ARMDebuggerSetWatchpoint(struct ARMDebugger* debugger, uint32_t address) {
83 if (debugger->cpu->memory != &debugger->memoryShim.d) {
84 ARMDebuggerInstallMemoryShim(debugger);
85 }
86 struct DebugBreakpoint* watchpoint = malloc(sizeof(struct DebugBreakpoint));
87 watchpoint->address = address;
88 watchpoint->next = debugger->memoryShim.watchpoints;
89 debugger->memoryShim.watchpoints = watchpoint;
90}