31 lines
No EOL
660 B
C
31 lines
No EOL
660 B
C
#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);
|
|
}
|
|
} |