refactor: cut off some bloats in intr_ctx
[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)->execp->eflags &= ~(1 << 8);
33         sdbg_state = SDBG_STATE_INSESSION;
34         sdbg_printf("[%p:%p] Break point reached.\n",
35                     param->execp->cs,
36                     param->execp->eip);
37     }
38
39     while (1) {
40         c = serial_rx_byte(SERIAL_COM1);
41         if (c == SDBG_CLNT_QUIT) {
42             sdbg_state = SDBG_STATE_START;
43             break;
44         }
45
46         switch (c) {
47             case SDBG_CLNT_HI:
48                 if (sdbg_state == SDBG_STATE_START) {
49                     sdbg_printf("[%p:%p] Session started.\n",
50                                 param->execp->cs,
51                                 param->execp->eip);
52                     sdbg_state = SDBG_STATE_INSESSION;
53                 } else {
54                     sdbg_printf("[%p:%p] Session resumed.\n",
55                                 param->execp->cs,
56                                 param->execp->eip);
57                 }
58                 break;
59             case SDBG_CLNT_RREG:
60
61                 serial_tx_buffer(SERIAL_COM1, (char*)param, sizeof(isr_param));
62                 break;
63             case SDBG_CLNT_STEP:
64                 ((isr_param*)param)->execp->eflags |= (1 << 8); // set TF flags
65                 sdbg_state = SDBG_STATE_WAIT_BRK;
66                 return;
67             case SDBG_CLNT_BRKP:
68                 // the break point address
69                 // serial_rx_buffer(SERIAL_COM1, buffer, sizeof(uintptr_t));
70
71                 // asm("movl %0, %%dr0" ::"r"(*((uintptr_t*)buffer)));
72
73                 sdbg_state = SDBG_STATE_WAIT_BRK;
74                 return;
75             case SDBG_CLNT_CONT:
76                 return;
77             default:
78                 break;
79         }
80     }
81 }