Unit testing framework and devicetree framework refactoring (#50)
[lunaix-os.git] / lunaix-os / arch / x86 / gdbstub.c
1 #include <sys/gdbstub.h>
2 #include <sdbg/gdbstub.h>
3
4 void
5 arch_gdbstub_setup_state(struct gdb_state* state, struct hart_state* hstate)
6 {
7     /* Translate vector to signal */
8     switch (hstate->execp->vector) {
9         case 1:
10             state->signum = 5;
11             break;
12         case 3:
13             state->signum = 5;
14             break;
15         default:
16             state->signum = 7;
17     }
18 }
19
20 void
21 arch_gdbstub_save_regs(struct gdb_state* state, struct hart_state* hstate)
22 {
23     /* Load Registers */
24 #ifndef CONFIG_ARCH_X86_64
25     state->registers[GDB_CPU_I386_REG_EAX] = hstate->registers.eax;
26     state->registers[GDB_CPU_I386_REG_ECX] = hstate->registers.ecx;
27     state->registers[GDB_CPU_I386_REG_EDX] = hstate->registers.edx;
28     state->registers[GDB_CPU_I386_REG_EBX] = hstate->registers.ebx;
29     state->registers[GDB_CPU_I386_REG_ESP] = hstate->sp;
30     state->registers[GDB_CPU_I386_REG_EBP] = hstate->registers.ebp;
31     state->registers[GDB_CPU_I386_REG_ESI] = hstate->registers.esi;
32     state->registers[GDB_CPU_I386_REG_EDI] = hstate->registers.edi;
33     state->registers[GDB_CPU_I386_REG_PC] = hstate->execp->eip;
34     state->registers[GDB_CPU_I386_REG_CS] = hstate->execp->cs;
35     state->registers[GDB_CPU_I386_REG_PS] = hstate->execp->eflags;
36     state->registers[GDB_CPU_I386_REG_SS] = hstate->execp->ss;
37     state->registers[GDB_CPU_I386_REG_DS] = hstate->registers.ds;
38     state->registers[GDB_CPU_I386_REG_ES] = hstate->registers.es;
39     state->registers[GDB_CPU_I386_REG_FS] = hstate->registers.fs;
40     state->registers[GDB_CPU_I386_REG_GS] = hstate->registers.gs;
41 #else
42     // TODO
43 #endif
44 }
45
46 void
47 arch_gdbstub_restore_regs(struct gdb_state* state, struct hart_state* hstate)
48 {
49     /* Restore Registers */
50 #ifndef CONFIG_ARCH_X86_64
51     hstate->registers.eax = state->registers[GDB_CPU_I386_REG_EAX];
52     hstate->registers.ecx = state->registers[GDB_CPU_I386_REG_ECX];
53     hstate->registers.edx = state->registers[GDB_CPU_I386_REG_EDX];
54     hstate->registers.ebx = state->registers[GDB_CPU_I386_REG_EBX];
55     hstate->sp = state->registers[GDB_CPU_I386_REG_ESP];
56     hstate->registers.ebp = state->registers[GDB_CPU_I386_REG_EBP];
57     hstate->registers.esi = state->registers[GDB_CPU_I386_REG_ESI];
58     hstate->registers.edi = state->registers[GDB_CPU_I386_REG_EDI];
59     hstate->execp->eip = state->registers[GDB_CPU_I386_REG_PC];
60     hstate->execp->cs = state->registers[GDB_CPU_I386_REG_CS];
61     hstate->execp->eflags = state->registers[GDB_CPU_I386_REG_PS];
62     hstate->execp->ss = state->registers[GDB_CPU_I386_REG_SS];
63     hstate->registers.ds = state->registers[GDB_CPU_I386_REG_DS];
64     hstate->registers.es = state->registers[GDB_CPU_I386_REG_ES];
65     hstate->registers.fs = state->registers[GDB_CPU_I386_REG_FS];
66     hstate->registers.gs = state->registers[GDB_CPU_I386_REG_GS];
67 #else
68     // TODO
69 #endif
70 }
71
72
73 int
74 gdb_sys_continue(struct gdb_state* state)
75 {
76     state->registers[GDB_CPU_I386_REG_PS] &= ~(1 << 8);
77     return 0;
78 }
79
80 int
81 gdb_sys_step(struct gdb_state* state)
82 {
83     state->registers[GDB_CPU_I386_REG_PS] |= 1 << 8;
84     return 0;
85 }