Decoupling Architectural-specific Code (#35)
[lunaix-os.git] / lunaix-os / arch / i386 / gdbstub.c
diff --git a/lunaix-os/arch/i386/gdbstub.c b/lunaix-os/arch/i386/gdbstub.c
new file mode 100644 (file)
index 0000000..78c3165
--- /dev/null
@@ -0,0 +1,77 @@
+#include <sys/gdbstub.h>
+#include <sdbg/gdbstub.h>
+
+void
+arch_gdbstub_setup_state(struct gdb_state* state, struct hart_state* hstate)
+{
+    /* Translate vector to signal */
+    switch (hstate->execp->vector) {
+        case 1:
+            state->signum = 5;
+            break;
+        case 3:
+            state->signum = 5;
+            break;
+        default:
+            state->signum = 7;
+    }
+}
+
+void
+arch_gdbstub_save_regs(struct gdb_state* state, struct hart_state* hstate)
+{
+    /* Load Registers */
+    state->registers[GDB_CPU_I386_REG_EAX] = hstate->registers.eax;
+    state->registers[GDB_CPU_I386_REG_ECX] = hstate->registers.ecx;
+    state->registers[GDB_CPU_I386_REG_EDX] = hstate->registers.edx;
+    state->registers[GDB_CPU_I386_REG_EBX] = hstate->registers.ebx;
+    state->registers[GDB_CPU_I386_REG_ESP] = hstate->esp;
+    state->registers[GDB_CPU_I386_REG_EBP] = hstate->registers.ebp;
+    state->registers[GDB_CPU_I386_REG_ESI] = hstate->registers.esi;
+    state->registers[GDB_CPU_I386_REG_EDI] = hstate->registers.edi;
+    state->registers[GDB_CPU_I386_REG_PC] = hstate->execp->eip;
+    state->registers[GDB_CPU_I386_REG_CS] = hstate->execp->cs;
+    state->registers[GDB_CPU_I386_REG_PS] = hstate->execp->eflags;
+    state->registers[GDB_CPU_I386_REG_SS] = hstate->execp->ss;
+    state->registers[GDB_CPU_I386_REG_DS] = hstate->registers.ds;
+    state->registers[GDB_CPU_I386_REG_ES] = hstate->registers.es;
+    state->registers[GDB_CPU_I386_REG_FS] = hstate->registers.fs;
+    state->registers[GDB_CPU_I386_REG_GS] = hstate->registers.gs;
+}
+
+void
+arch_gdbstub_restore_regs(struct gdb_state* state, struct hart_state* hstate)
+{
+    /* Restore Registers */
+    hstate->registers.eax = state->registers[GDB_CPU_I386_REG_EAX];
+    hstate->registers.ecx = state->registers[GDB_CPU_I386_REG_ECX];
+    hstate->registers.edx = state->registers[GDB_CPU_I386_REG_EDX];
+    hstate->registers.ebx = state->registers[GDB_CPU_I386_REG_EBX];
+    hstate->esp = state->registers[GDB_CPU_I386_REG_ESP];
+    hstate->registers.ebp = state->registers[GDB_CPU_I386_REG_EBP];
+    hstate->registers.esi = state->registers[GDB_CPU_I386_REG_ESI];
+    hstate->registers.edi = state->registers[GDB_CPU_I386_REG_EDI];
+    hstate->execp->eip = state->registers[GDB_CPU_I386_REG_PC];
+    hstate->execp->cs = state->registers[GDB_CPU_I386_REG_CS];
+    hstate->execp->eflags = state->registers[GDB_CPU_I386_REG_PS];
+    hstate->execp->ss = state->registers[GDB_CPU_I386_REG_SS];
+    hstate->registers.ds = state->registers[GDB_CPU_I386_REG_DS];
+    hstate->registers.es = state->registers[GDB_CPU_I386_REG_ES];
+    hstate->registers.fs = state->registers[GDB_CPU_I386_REG_FS];
+    hstate->registers.gs = state->registers[GDB_CPU_I386_REG_GS];
+}
+
+
+int
+gdb_sys_continue(struct gdb_state* state)
+{
+    state->registers[GDB_CPU_I386_REG_PS] &= ~(1 << 8);
+    return 0;
+}
+
+int
+gdb_sys_step(struct gdb_state* state)
+{
+    state->registers[GDB_CPU_I386_REG_PS] |= 1 << 8;
+    return 0;
+}
\ No newline at end of file