diff options
author | Anton Kling <anton@kling.gg> | 2024-10-16 20:41:17 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-10-16 20:41:17 +0200 |
commit | 4e817cecfa7328af34fb96db7f052352737cd07e (patch) | |
tree | e2470a6e3f9683ed83a1e4067dd0ab79a9b67be5 /kernel/log.c | |
parent | 6d4f0e917f638c0ab53d847037938d83497f53ea (diff) |
kernel: Add RSOD(red screen of death)
This is not useful since 99% of the time I will have access to the
serial output. But it does look cool.
Diffstat (limited to 'kernel/log.c')
-rw-r--r-- | kernel/log.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/kernel/log.c b/kernel/log.c index 47f6d6f..11ac783 100644 --- a/kernel/log.c +++ b/kernel/log.c @@ -1,13 +1,50 @@ #include "log.h" #include <cpu/arch_inst.h> +#include <drivers/serial.h> +#include <drivers/vbe.h> +#include <fonts.h> #include <sched/scheduler.h> #include <stdarg.h> +int log_to_screen = 0; + +extern u8 *framebuffer; +extern u32 framebuffer_width; +extern u32 framebuffer_height; + +void log_enable_screen(void) { + log_to_screen = 1; + u32 *p = (u32 *)framebuffer; + for (u32 i = 0; i < framebuffer_width * framebuffer_height; i++, p++) { + *p = 0xFF0000; + } +} + struct stackframe { struct stackframe *ebp; u32 eip; }; +u32 x = 0; +u32 y = 0; + +void log_char(const char c) { + write_serial(c); + if (log_to_screen) { + if ('\n' == c) { + x = 0; + y += 8; + return; + } + if (x > 1000) { + y += 8; + x = 0; + } + vbe_drawfont(x, y, c); + x += 8; + } +} + void dump_backtrace(u32 max_frames) { struct stackframe *stk = (void *)get_current_sbp(); kprintf("Stack trace:\n"); |