fix dependency check logic cause config always disabled
[lunaix-os.git] / lunaix-os / kernel / debug / gdbstub.c
index 38d35adf0b13e75a56aa771725a0abdb3ce3840d..1ae44802ba57616bb5f4e5980fa9a4d179897e42 100644 (file)
  * SOFTWARE.
  */
 
-#include <hal/io.h>
+#include <hal/serial.h>
 #include <klibc/string.h>
-#include <lunaix/peripheral/serial.h>
 #include <sdbg/gdbstub.h>
 
-/*****************************************************************************
- * Types
- ****************************************************************************/
-
-#ifndef GDBSTUB_DONT_DEFINE_STDINT_TYPES
-typedef unsigned char u8_t;
-typedef unsigned short u16_t;
-typedef unsigned long uint32_t;
-#endif
-
-typedef unsigned int address;
-typedef unsigned int reg;
-
-enum GDB_REGISTER
-{
-    GDB_CPU_I386_REG_EAX = 0,
-    GDB_CPU_I386_REG_ECX = 1,
-    GDB_CPU_I386_REG_EDX = 2,
-    GDB_CPU_I386_REG_EBX = 3,
-    GDB_CPU_I386_REG_ESP = 4,
-    GDB_CPU_I386_REG_EBP = 5,
-    GDB_CPU_I386_REG_ESI = 6,
-    GDB_CPU_I386_REG_EDI = 7,
-    GDB_CPU_I386_REG_PC = 8,
-    GDB_CPU_I386_REG_PS = 9,
-    GDB_CPU_I386_REG_CS = 10,
-    GDB_CPU_I386_REG_SS = 11,
-    GDB_CPU_I386_REG_DS = 12,
-    GDB_CPU_I386_REG_ES = 13,
-    GDB_CPU_I386_REG_FS = 14,
-    GDB_CPU_I386_REG_GS = 15,
-    GDB_CPU_NUM_REGISTERS = 16
-};
-
-struct gdb_state
-{
-    int signum;
-    reg registers[GDB_CPU_NUM_REGISTERS];
-};
-
-/*****************************************************************************
- *
- *  GDB Remote Serial Protocol
- *
- ****************************************************************************/
+#include <asm/x86_pmio.h>
+#include <asm/cpu.h>
 
 /*****************************************************************************
  * Macros
@@ -89,14 +45,8 @@ struct gdb_state
 
 #define GDB_PRINT(...)
 
-#define COM_PORT SERIAL_COM1
-
 #define GDB_EOF (-1)
 
-#ifndef NULL
-#define NULL ((void*)0)
-#endif
-
 #ifndef GDB_ASSERT
 #define GDB_ASSERT(x)                                                          \
     do {                                                                       \
@@ -118,13 +68,10 @@ gdb_sys_getc(struct gdb_state* state);
 int
 gdb_sys_putchar(struct gdb_state* state, int ch);
 int
-gdb_sys_mem_readb(struct gdb_state* state, address addr, char* val);
-int
-gdb_sys_mem_writeb(struct gdb_state* state, address addr, char val);
-int
-gdb_sys_continue(struct gdb_state* state);
+gdb_sys_mem_readb(struct gdb_state* state, ptr_t addr, char* val);
 int
-gdb_sys_step(struct gdb_state* state);
+gdb_sys_mem_writeb(struct gdb_state* state, ptr_t addr, char val);
+
 
 /*****************************************************************************
  * Types
@@ -158,9 +105,7 @@ gdb_read(struct gdb_state* state,
          unsigned int buf_len,
          unsigned int len);
 
-/* String processing helper functions */
-static int
-gdb_strlen(const char* ch);
+
 static char
 gdb_get_digit(int val);
 static int
@@ -227,14 +172,14 @@ static int
 gdb_mem_read(struct gdb_state* state,
              char* buf,
              unsigned int buf_len,
-             address addr,
+             ptr_t addr,
              unsigned int len,
              gdb_enc_func enc);
 static int
 gdb_mem_write(struct gdb_state* state,
               const char* buf,
               unsigned int buf_len,
-              address addr,
+              ptr_t addr,
               unsigned int len,
               gdb_dec_func dec);
 static int
@@ -246,22 +191,6 @@ gdb_step(struct gdb_state* state);
  * String Processing Helper Functions
  ****************************************************************************/
 
-/*
- * Get null-terminated string length.
- */
-static int
-gdb_strlen(const char* ch)
-{
-    int len;
-
-    len = 0;
-    while (*ch++) {
-        len += 1;
-    }
-
-    return len;
-}
-
 /*
  * Get integer value for a string representation.
  *
@@ -702,7 +631,7 @@ static int
 gdb_mem_read(struct gdb_state* state,
              char* buf,
              unsigned int buf_len,
-             address addr,
+             ptr_t addr,
              unsigned int len,
              gdb_enc_func enc)
 {
@@ -732,7 +661,7 @@ static int
 gdb_mem_write(struct gdb_state* state,
               const char* buf,
               unsigned int buf_len,
-              address addr,
+              ptr_t addr,
               unsigned int len,
               gdb_dec_func dec)
 {
@@ -810,7 +739,7 @@ gdb_send_conmsg_packet(struct gdb_state* state,
     }
 
     buf[0] = 'O';
-    status = gdb_enc_hex(&buf[1], buf_len - 1, msg, gdb_strlen(msg));
+    status = gdb_enc_hex(&buf[1], buf_len - 1, msg, strlen(msg));
     if (status == GDB_EOF) {
         return GDB_EOF;
     }
@@ -884,13 +813,9 @@ gdb_send_error_packet(struct gdb_state* state,
 static int
 gdb_write(struct gdb_state* state, const char* buf, unsigned int len)
 {
-    while (len--) {
-        if (gdb_sys_putchar(state, *buf++) == GDB_EOF) {
-            return GDB_EOF;
-        }
-    }
+    int err = serial_rwbuf_sync(state->sdev, buf, len, SERIAL_RW_TX);
 
-    return 0;
+    return err < 0 ? GDB_EOF : 0;
 }
 
 /*
@@ -913,14 +838,9 @@ gdb_read(struct gdb_state* state,
         return GDB_EOF;
     }
 
-    while (len--) {
-        if ((c = gdb_sys_getc(state)) == GDB_EOF) {
-            return GDB_EOF;
-        }
-        *buf++ = c;
-    }
+    int err = serial_rwbuf_sync(state->sdev, buf, buf_len, SERIAL_RW_RX);
 
-    return 0;
+    return err < 0 ? GDB_EOF : 0;
 }
 
 /*****************************************************************************
@@ -933,7 +853,7 @@ gdb_read(struct gdb_state* state,
 int
 gdb_main(struct gdb_state* state)
 {
-    address addr;
+    ptr_t addr;
     char pkt_buf[256];
     int status;
     unsigned int length;
@@ -1170,36 +1090,6 @@ gdb_main(struct gdb_state* state)
     return 0;
 }
 
-/*****************************************************************************
- * Types
- ****************************************************************************/
-
-struct gdb_idtr
-{
-    u16_t len;
-    uint32_t offset;
-} __attribute__((packed));
-
-struct gdb_idt_gate
-{
-    u16_t offset_low;
-    u16_t segment;
-    u16_t flags;
-    u16_t offset_high;
-} __attribute__((packed));
-
-/*****************************************************************************
- * Prototypes
- ****************************************************************************/
-#define gdb_x86_io_write_8(port, val) io_outb(port, val)
-#define gdb_x86_io_read_8(port) io_inb(port)
-
-#define gdb_x86_serial_getc() serial_rx_byte(COM_PORT)
-#define gdb_x86_serial_putchar(ch) serial_tx_byte(COM_PORT, ch)
-
-#ifdef __STRICT_ANSI__
-#define asm __asm__
-#endif
 
 static struct gdb_state gdb_state;
 static volatile int start_debugging = 0;
@@ -1208,57 +1098,14 @@ static volatile int start_debugging = 0;
  * Debug interrupt handler.
  */
 void
-gdbstub_loop(isr_param* param)
+gdbstub_loop(struct hart_state* hstate)
 {
-    /* Translate vector to signal */
-    switch (param->execp->vector) {
-        case 1:
-            gdb_state.signum = 5;
-            break;
-        case 3:
-            gdb_state.signum = 5;
-            break;
-        default:
-            gdb_state.signum = 7;
-    }
-
-    /* Load Registers */
-    gdb_state.registers[GDB_CPU_I386_REG_EAX] = param->registers.eax;
-    gdb_state.registers[GDB_CPU_I386_REG_ECX] = param->registers.ecx;
-    gdb_state.registers[GDB_CPU_I386_REG_EDX] = param->registers.edx;
-    gdb_state.registers[GDB_CPU_I386_REG_EBX] = param->registers.ebx;
-    gdb_state.registers[GDB_CPU_I386_REG_ESP] = param->esp;
-    gdb_state.registers[GDB_CPU_I386_REG_EBP] = param->registers.ebp;
-    gdb_state.registers[GDB_CPU_I386_REG_ESI] = param->registers.esi;
-    gdb_state.registers[GDB_CPU_I386_REG_EDI] = param->registers.edi;
-    gdb_state.registers[GDB_CPU_I386_REG_PC] = param->execp->eip;
-    gdb_state.registers[GDB_CPU_I386_REG_CS] = param->execp->cs;
-    gdb_state.registers[GDB_CPU_I386_REG_PS] = param->execp->eflags;
-    gdb_state.registers[GDB_CPU_I386_REG_SS] = param->execp->ss;
-    gdb_state.registers[GDB_CPU_I386_REG_DS] = param->registers.ds;
-    gdb_state.registers[GDB_CPU_I386_REG_ES] = param->registers.es;
-    gdb_state.registers[GDB_CPU_I386_REG_FS] = param->registers.fs;
-    gdb_state.registers[GDB_CPU_I386_REG_GS] = param->registers.gs;
-
+    arch_gdbstub_setup_state(&gdb_state, hstate);
+    arch_gdbstub_save_regs(&gdb_state, hstate);
+    
     gdb_main(&gdb_state);
 
-    /* Restore Registers */
-    param->registers.eax = gdb_state.registers[GDB_CPU_I386_REG_EAX];
-    param->registers.ecx = gdb_state.registers[GDB_CPU_I386_REG_ECX];
-    param->registers.edx = gdb_state.registers[GDB_CPU_I386_REG_EDX];
-    param->registers.ebx = gdb_state.registers[GDB_CPU_I386_REG_EBX];
-    param->esp = gdb_state.registers[GDB_CPU_I386_REG_ESP];
-    param->registers.ebp = gdb_state.registers[GDB_CPU_I386_REG_EBP];
-    param->registers.esi = gdb_state.registers[GDB_CPU_I386_REG_ESI];
-    param->registers.edi = gdb_state.registers[GDB_CPU_I386_REG_EDI];
-    param->execp->eip = gdb_state.registers[GDB_CPU_I386_REG_PC];
-    param->execp->cs = gdb_state.registers[GDB_CPU_I386_REG_CS];
-    param->execp->eflags = gdb_state.registers[GDB_CPU_I386_REG_PS];
-    param->execp->ss = gdb_state.registers[GDB_CPU_I386_REG_SS];
-    param->registers.ds = gdb_state.registers[GDB_CPU_I386_REG_DS];
-    param->registers.es = gdb_state.registers[GDB_CPU_I386_REG_ES];
-    param->registers.fs = gdb_state.registers[GDB_CPU_I386_REG_FS];
-    param->registers.gs = gdb_state.registers[GDB_CPU_I386_REG_GS];
+    arch_gdbstub_restore_regs(&gdb_state, hstate);
 }
 
 /*****************************************************************************
@@ -1271,7 +1118,7 @@ gdbstub_loop(isr_param* param)
 int
 gdb_sys_putchar(struct gdb_state* state, int ch)
 {
-    gdb_x86_serial_putchar(ch);
+    serial_rwbuf_sync(state->sdev, &ch, 1, SERIAL_RW_TX);
     return ch;
 }
 
@@ -1281,14 +1128,16 @@ gdb_sys_putchar(struct gdb_state* state, int ch)
 int
 gdb_sys_getc(struct gdb_state* state)
 {
-    return gdb_x86_serial_getc() & 0xff;
+    char ch;
+    serial_rwbuf_sync(state->sdev, &ch, 1, SERIAL_RW_RX);
+    return ch & 0xff;
 }
 
 /*
  * Read one byte from memory.
  */
 int
-gdb_sys_mem_readb(struct gdb_state* state, address addr, char* val)
+gdb_sys_mem_readb(struct gdb_state* state, ptr_t addr, char* val)
 {
     *val = *(volatile char*)addr;
     return 0;
@@ -1298,28 +1147,8 @@ gdb_sys_mem_readb(struct gdb_state* state, address addr, char* val)
  * Write one byte to memory.
  */
 int
-gdb_sys_mem_writeb(struct gdb_state* state, address addr, char val)
+gdb_sys_mem_writeb(struct gdb_state* state, ptr_t addr, char val)
 {
     *(volatile char*)addr = val;
     return 0;
 }
-
-/*
- * Continue program execution.
- */
-int
-gdb_sys_continue(struct gdb_state* state)
-{
-    gdb_state.registers[GDB_CPU_I386_REG_PS] &= ~(1 << 8);
-    return 0;
-}
-
-/*
- * Single step the next instruction.
- */
-int
-gdb_sys_step(struct gdb_state* state)
-{
-    gdb_state.registers[GDB_CPU_I386_REG_PS] |= 1 << 8;
-    return 0;
-}
\ No newline at end of file