summaryrefslogtreecommitdiff
path: root/src/kernel/panic.c
diff options
context:
space:
mode:
authorBenji Dial <benji3.141@gmail.com>2020-05-24 11:02:43 -0400
committerBenji Dial <benji3.141@gmail.com>2020-05-24 11:02:43 -0400
commit02f14113cbf14c6f842fb43ecbc68d0c851ef3b0 (patch)
tree75d2d943d9822b3f945fd947e9b91eec1d68e900 /src/kernel/panic.c
parent31d8ae388a7ded576abd3e3d99c3d9193ea6d704 (diff)
downloadportland-os-02f14113cbf14c6f842fb43ecbc68d0c851ef3b0.tar.gz
very basic vga, ata, serial drivers. start of fat and fs drivers
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