summaryrefslogtreecommitdiff
path: root/src/kernel/core/sys.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/core/sys.cpp')
-rw-r--r--src/kernel/core/sys.cpp105
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);
+}