X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/ddb4e08c76afcae5e40e0bcb418683dfb2a22aa8..4f966b9a6710d138d6e921bf2a1e40f2abc76f9a:/lunaix-os/debug/bg_lsdbg.c?ds=sidebyside diff --git a/lunaix-os/debug/bg_lsdbg.c b/lunaix-os/debug/bg_lsdbg.c new file mode 100644 index 0000000..0f0496d --- /dev/null +++ b/lunaix-os/debug/bg_lsdbg.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include + +#define COM SERIAL_COM1 + +LOG_MODULE("DBG"); + +static volatile sdbg_state = 0; + +void +sdbg_printf(char* fmt, ...) +{ + char buf[256]; + va_list l; + + va_start(l, fmt); + + size_t len = __ksprintf_internal(buf, fmt, 256, l); + serial_tx_buffer(COM, buf, len); + + va_end(l); +} + +void +lunaix_sdbg_loop(isr_param* param) +{ + char c; + + if (sdbg_state == SDBG_STATE_WAIT_BRK) { + (param)->eflags &= ~(1 << 8); + sdbg_state = SDBG_STATE_INSESSION; + sdbg_printf("[%p:%p] Break point reached.\n", param->cs, param->eip); + } + + while (1) { + c = serial_rx_byte(SERIAL_COM1); + if (c == SDBG_CLNT_QUIT) { + sdbg_state = SDBG_STATE_START; + break; + } + + switch (c) { + case SDBG_CLNT_HI: + if (sdbg_state == SDBG_STATE_START) { + sdbg_printf( + "[%p:%p] Session started.\n", param->cs, param->eip); + sdbg_state = SDBG_STATE_INSESSION; + } else { + sdbg_printf( + "[%p:%p] Session resumed.\n", param->cs, param->eip); + } + break; + case SDBG_CLNT_RREG: + + serial_tx_buffer(SERIAL_COM1, (char*)param, sizeof(isr_param)); + break; + case SDBG_CLNT_STEP: + ((isr_param*)param)->eflags |= (1 << 8); // set TF flags + sdbg_state = SDBG_STATE_WAIT_BRK; + return; + case SDBG_CLNT_BRKP: + // the break point address + // serial_rx_buffer(SERIAL_COM1, buffer, sizeof(uintptr_t)); + + // asm("movl %0, %%dr0" ::"r"(*((uintptr_t*)buffer))); + + sdbg_state = SDBG_STATE_WAIT_BRK; + return; + case SDBG_CLNT_CONT: + return; + default: + break; + } + } +} \ No newline at end of file