#include #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); } }