blob: a463a2a34cb86f68e545bddb08717cf979168176 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include <stdint.h>
#include "vga.h"
#include "serial.h"
#include "util.h"
void halt() {
vga_printsz("\n\nHalting...");
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 *)frame + 1);
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 *)frame;
}
}
|