diff options
author | Benji Dial <benji3.141@gmail.com> | 2020-05-24 11:02:43 -0400 |
---|---|---|
committer | Benji Dial <benji3.141@gmail.com> | 2020-05-24 11:02:43 -0400 |
commit | 02f14113cbf14c6f842fb43ecbc68d0c851ef3b0 (patch) | |
tree | 75d2d943d9822b3f945fd947e9b91eec1d68e900 /src/kernel/panic.c | |
parent | 31d8ae388a7ded576abd3e3d99c3d9193ea6d704 (diff) | |
download | portland-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.c | 31 |
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 |