feat: serial device interfacing
[lunaix-os.git] / lunaix-os / kernel / debug / sdbg.c
1 // FIXME Re-design needed!!
2
3 #include <hal/serial.h>
4 #include <klibc/stdio.h>
5 #include <lunaix/syslog.h>
6 #include <sdbg/gdbstub.h>
7 #include <sdbg/lsdbg.h>
8 #include <sdbg/protocol.h>
9
10 #include <lunaix/isrm.h>
11
12 // #define USE_LSDBG_BACKEND
13
14 LOG_MODULE("SDBG")
15
16 volatile int debug_mode = 0;
17
18 // begin: @cmc
19 #define DBG_START 0x636d6340UL
20
21 // begin: @yay
22 #define DBG_END 0x79617940UL
23
24 static int
25 sdbg_serial_callback(struct serial_dev* sdev)
26 {
27     u32_t dbg_sig = *(u32_t*)sdev->rw.buf;
28
29     if (dbg_sig == DBG_START) {
30         debug_mode = 1;
31     } else if (dbg_sig == DBG_END) {
32         debug_mode = 0;
33     }
34
35     // Debugger should be run later
36     // TODO implement a defer execution mechanism (i.e., soft interrupt)
37
38     return SERIAL_AGAIN;
39 }
40
41 void
42 sdbg_imm(const isr_param* param)
43 {
44     struct exec_param* execp = param->execp;
45     kprintf(KDEBUG "Quick debug mode\n");
46     kprintf(KDEBUG "cs=%p eip=%p eax=%p ebx=%p\n",
47             execp->cs,
48             execp->eip,
49             param->registers.eax,
50             param->registers.ebx);
51     kprintf(KDEBUG "ecx=%p edx=%p edi=%p esi=%p\n",
52             param->registers.ecx,
53             param->registers.edx,
54             param->registers.edi,
55             param->registers.esi);
56     kprintf(KDEBUG "u.esp=%p k.esp=%p ebp=%p ps=%p\n",
57             param->esp,
58             execp->esp,
59             param->registers.ebp,
60             execp->eflags);
61     kprintf(KDEBUG "ss=%p ds=%p es=%p fs=%p gs=%p\n",
62             execp->ss,
63             param->registers.ds,
64             param->registers.es,
65             param->registers.fs,
66             param->registers.gs);
67     while (1)
68         ;
69 }
70
71 static char buf[4];
72
73 static void
74 __sdbg_breakpoint(const isr_param* param)
75 {
76     gdbstub_loop(param);
77 }
78
79 void
80 sdbg_init()
81 {
82     struct serial_dev* sdev = serial_get_avilable();
83
84     if (!sdev) {
85         kprintf(KERROR "no serial port available\n");
86         return;
87     }
88
89     kprintf("listening: %s\n", sdev->dev->name.value);
90
91     serial_rwbuf_async(sdev, buf, 4, sdbg_serial_callback, SERIAL_RW_RX);
92 }