summaryrefslogtreecommitdiff
path: root/src/kernel/panic.c
blob: 49d4a271df1d5cca7a6be8a782557b3e846e9e6e (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
#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);
  }
}