summaryrefslogtreecommitdiff
path: root/src/kernel/panic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/panic.c')
-rw-r--r--src/kernel/panic.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/kernel/panic.c b/src/kernel/panic.c
new file mode 100644
index 0000000..49d4a27
--- /dev/null
+++ b/src/kernel/panic.c
@@ -0,0 +1,31 @@
+#include <stdint.h>
+#include "vga.h"
+#include "serial.h"
+#include "util.h"
+
+void halt() {
+ while (1)
+ asm volatile ("hlt");
+}
+
+void panic(uint8_t *message) {
+ uint32_t frame;
+ asm (
+ "movl %%ebp, %0"
+ : "=r" (frame));
+ vga_set_color(0x4f);
+ vga_blank();
+ vga_printsz("Kernel panic: ");
+ vga_printsz(message);
+ vga_printsz("\n\nStack trace:");
+ uint8_t stb[6];
+ while (1) {
+ uint32_t ip = *(uint32_t *)(0x38000 + frame + 4);
+ if (!ip)
+ halt();
+ vga_printsz("\n 0x");
+ u16_hex(ip - 0x30000 - 5, stb);//assumes would return to just after a call instruction
+ vga_printsz(stb);
+ frame = *(uint32_t *)(0x38000 + frame);
+ }
+} \ No newline at end of file