feat: integrate gdb support over serial port for bare-metal debugging.
[lunaix-os.git] / lunaix-os / debug / bg_lsdbg.c
1 #include <klibc/stdio.h>
2 #include <lunaix/peripheral/serial.h>
3 #include <lunaix/syslog.h>
4 #include <sdbg/lsdbg.h>
5
6 #define COM SERIAL_COM1
7
8 LOG_MODULE("DBG");
9
10 static volatile sdbg_state = 0;
11
12 void
13 sdbg_printf(char* fmt, ...)
14 {
15     char buf[256];
16     va_list l;
17
18     va_start(l, fmt);
19
20     size_t len = __ksprintf_internal(buf, fmt, 256, l);
21     serial_tx_buffer(COM, buf, len);
22
23     va_end(l);
24 }
25
26 void
27 lunaix_sdbg_loop(isr_param* param)
28 {
29     char c;
30
31     if (sdbg_state == SDBG_STATE_WAIT_BRK) {
32         (param)->eflags &= ~(1 << 8);
33         sdbg_state = SDBG_STATE_INSESSION;
34         sdbg_printf("[%p:%p] Break point reached.\n", param->cs, param->eip);
35     }
36
37     while (1) {
38         c = serial_rx_byte(SERIAL_COM1);
39         if (c == SDBG_CLNT_QUIT) {
40             sdbg_state = SDBG_STATE_START;
41             break;
42         }
43
44         switch (c) {
45             case SDBG_CLNT_HI:
46                 if (sdbg_state == SDBG_STATE_START) {
47                     sdbg_printf(
48                       "[%p:%p] Session started.\n", param->cs, param->eip);
49                     sdbg_state = SDBG_STATE_INSESSION;
50                 } else {
51                     sdbg_printf(
52                       "[%p:%p] Session resumed.\n", param->cs, param->eip);
53                 }
54                 break;
55             case SDBG_CLNT_RREG:
56
57                 serial_tx_buffer(SERIAL_COM1, (char*)param, sizeof(isr_param));
58                 break;
59             case SDBG_CLNT_STEP:
60                 ((isr_param*)param)->eflags |= (1 << 8); // set TF flags
61                 sdbg_state = SDBG_STATE_WAIT_BRK;
62                 return;
63             case SDBG_CLNT_BRKP:
64                 // the break point address
65                 // serial_rx_buffer(SERIAL_COM1, buffer, sizeof(uintptr_t));
66
67                 // asm("movl %0, %%dr0" ::"r"(*((uintptr_t*)buffer)));
68
69                 sdbg_state = SDBG_STATE_WAIT_BRK;
70                 return;
71             case SDBG_CLNT_CONT:
72                 return;
73             default:
74                 break;
75         }
76     }
77 }