src/debugger/debugger.h (view raw)
1#ifndef DEBUGGER_H
2#define DEBUGGER_H
3
4#include "arm.h"
5
6enum DebuggerState {
7 DEBUGGER_PAUSED,
8 DEBUGGER_RUNNING,
9 DEBUGGER_EXITING,
10 DEBUGGER_SHUTDOWN
11};
12
13struct DebugBreakpoint {
14 struct DebugBreakpoint* next;
15 uint32_t address;
16};
17
18struct DebugMemoryShim {
19 struct ARMMemory d;
20 struct ARMMemory* original;
21
22 struct ARMDebugger* p;
23 struct DebugBreakpoint* watchpoints;
24};
25
26enum DebuggerEntryReason {
27 DEBUGGER_ENTER_MANUAL,
28 DEBUGGER_ENTER_ATTACHED,
29 DEBUGGER_ENTER_BREAKPOINT,
30 DEBUGGER_ENTER_WATCHPOINT,
31 DEBUGGER_ENTER_ILLEGAL_OP
32};
33
34struct ARMDebugger {
35 enum DebuggerState state;
36 struct ARMCore* cpu;
37
38 struct DebugBreakpoint* breakpoints;
39 struct DebugMemoryShim memoryShim;
40
41 void (*init)(struct ARMDebugger*);
42 void (*deinit)(struct ARMDebugger*);
43 void (*paused)(struct ARMDebugger*);
44 void (*entered)(struct ARMDebugger*, enum DebuggerEntryReason);
45};
46
47void ARMDebuggerInit(struct ARMDebugger*, struct ARMCore*);
48void ARMDebuggerDeinit(struct ARMDebugger*);
49void ARMDebuggerRun(struct ARMDebugger*);
50void ARMDebuggerEnter(struct ARMDebugger*, enum DebuggerEntryReason);
51void ARMDebuggerSetBreakpoint(struct ARMDebugger* debugger, uint32_t address);
52void ARMDebuggerClearBreakpoint(struct ARMDebugger* debugger, uint32_t address);
53void ARMDebuggerSetWatchpoint(struct ARMDebugger* debugger, uint32_t address);
54
55#endif