diff options
Diffstat (limited to 'src/kernel/core/sys.cpp')
-rw-r--r-- | src/kernel/core/sys.cpp | 105 |
1 files changed, 90 insertions, 15 deletions
diff --git a/src/kernel/core/sys.cpp b/src/kernel/core/sys.cpp index 01a3c20..e27e0a6 100644 --- a/src/kernel/core/sys.cpp +++ b/src/kernel/core/sys.cpp @@ -31,8 +31,7 @@ uint16_t inw(uint16_t port) { void stack_trace(size_t bp) { uint32_t *stack = (uint32_t*)bp, i; for (i = 0; i < 5 && (size_t)stack > K_HIGHHALF_ADDR && (size_t)stack < (bp + 0x8000); i++) { - *ke_vt << " | " << (size_t)stack; - *ke_vt << "\tnext:" << stack[0] << "\t\tret:" << stack[1] << " \n"; + dbg_printf(" | %p\tnext:%p\t\tret:%p\n", stack, stack[0], stack[1]); stack = (uint32_t*)stack[0]; } } @@ -40,29 +39,21 @@ void stack_trace(size_t bp) { /* For internal use only. Used by panic and panic_assert. */ static void panic_do(char* file, int line) { asm volatile("cli;"); - *ke_vt << " \n File:\t\t" << file << ":" << line; - *ke_vt << " \nTrace: \n"; + dbg_printf("File:\t\t%s:%i\n", file, line); + dbg_printf("Trace:\n"); size_t bp; asm volatile("mov %%ebp,%0" : "=r"(bp)); stack_trace(bp); - *ke_vt << "\n\t\tSystem halted -_-'"; + dbg_printf("\t\tSystem halted -_-'\n"); asm volatile("hlt"); } /* These functions stop the system, reporting an error message, because something bad happenned. */ void panic(char* message, char* file, int line) { - ke_vt->fgcolor = TC_WHITE; - ke_vt->bgcolor = TC_BLUE; - ke_vt->outputTo(text_display); - *ke_vt << " * * * * * * * * * * * * * * * * * * * * * * * * * * "; - *ke_vt << "\nPANIC:\t" << message; + dbg_printf("#### PANIC ####\n"); panic_do(file, line); } void panic_assert(char* assertion, char* file, int line) { - ke_vt->fgcolor = TC_WHITE; - ke_vt->bgcolor = TC_RED; - ke_vt->outputTo(text_display); - *ke_vt << " * * * * * * * * * * * * * * * * * * * * * * * * * * "; - *ke_vt << "\nASSERT FAILED:\t" << assertion; + dbg_printf("#### ASSERT FAILED ####\n"); panic_do(file, line); } @@ -79,3 +70,87 @@ void sti() { if (if_locks > 0) if_locks--; if (if_locks == 0) asm volatile("sti"); } + +// Serial debugging + +#define SER_PORT 0x3F8 // COM1 +static int ser_init = 1; + +void ser_putc(const char c) { + if (ser_init) { + outb(SER_PORT + 1, 0x00); // disable interrupts + outb(SER_PORT + 3, 0x80); // set baud rate + outb(SER_PORT + 0, 0x03); // set divisor to 3 (38400 baud) + outb(SER_PORT + 1, 0x00); + outb(SER_PORT + 3, 0x03); // 8 bits, no parity, one stop bit + outb(SER_PORT + 2, 0xC7); // enable FIFO, clear them, with 14-byte threshold + ser_init = 0; + } + + while (!(inb(SER_PORT + 5) & 0x20)); + outb(SER_PORT, c); +} + +void ser_puts(const char *c) { + while (*c) { + ser_putc(*c); + c++; + } +} + +void ser_printf(const char *format, ...) { + va_list ap; + va_start(ap, format); + + while (*format) { + if (*format == '%') { + format++; + if (*format == 'd' || *format == 'i') { + // Output DEC + int v = va_arg(ap, int); + if (v == 0) { + ser_putc('0'); + } else { + if (v < 0) { + ser_putc('-'); + v = -v; + } + char s[20]; + char *b = s + 19; + *b = 0; + while (v) { + *(--b) = '0' + (v % 10); + v /= 10; + } + ser_puts(b); + } + } else if (*format == 'p') { + // Output HEX + uint32_t v = va_arg(ap, uint32_t); + const char *digits = "0123456789ABCDEF"; + char s[11]; + s[0] = '0'; + s[1] = 'x'; + s[10] = 0; + for (int i = 0; i < 8; i++) { + s[9 - i] = digits[v % 16]; + v /= 16; + } + ser_puts(s); + } else if (*format == 's') { + // Output STR + const char *s = va_arg(ap, const char*); + ser_puts(s); + } else if (*format == 'c') { + // Output CHR + char v = va_arg(ap, int); + ser_putc(v); + } + format++; + } else { + ser_putc(*(format++)); + } + } + + va_end(ap); +} |