X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/6c506d8916fb114675e93d0e2cb20831d4022294..d1b1c8d9119229dbeed06cd252917e54a1cb77f6:/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 index 0000000..78c3165 --- /dev/null +++ b/lunaix-os/arch/i386/gdbstub.c @@ -0,0 +1,77 @@ +#include +#include + +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