interrupts, timer, keyboard, segments, lots of kernel code
[bootcensus] / src / panic.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdarg.h>
4 #include "asmops.h"
5
6 struct all_registers {
7         uint32_t eax, ebx, ecx, edx;
8         uint32_t esp, ebp, esi, edi;
9         uint32_t eflags;
10         uint32_t cs, ss, ds, es, fs, gs;
11         uint32_t cr0, cr1, cr2, cr3;
12 };
13
14 /* defined in regs.S */
15 void get_regs(struct all_registers *regs);
16
17 void panic(const char *fmt, ...)
18 {
19         va_list ap;
20         struct all_registers regs;
21         uint32_t eip;
22
23         disable_intr();
24
25         memset(&regs, 0, sizeof regs);
26         get_regs(&regs);
27
28         CALLER_EIP(eip);
29
30         printf("~~~~~ pcboot panic ~~~~~\n");
31         va_start(ap, fmt);
32         vprintf(fmt, ap);
33         va_end(ap);
34
35         printf("\nRegisters:\n");
36         printf("eax: %x, ebx: %x, ecx: %x, edx: %x\n", regs.eax, regs.ebx, regs.ecx, regs.edx);
37         printf("esp: %x, ebp: %x, esi: %x, edi: %x\n", regs.esp, regs.ebp, regs.esi, regs.edi);
38         printf("eip: %x, eflags: %x\n", eip, regs.eflags);
39         printf("cr0: %x, cr1: %x, cr2: %x, cr3: %x\n", regs.cr0, regs.cr1, regs.cr2, regs.cr3);
40         printf("cs: %x (%d|%d)\n", regs.cs, regs.cs >> 3, regs.cs & 3);
41         printf("ss: %x (%d|%d)\n", regs.ss, regs.ss >> 3, regs.ss & 3);
42         printf("ds: %x (%d|%d)\n", regs.ds, regs.ds >> 3, regs.ds & 3);
43         printf("es: %x (%d|%d)\n", regs.es, regs.es >> 3, regs.es & 3);
44         printf("fs: %x (%d|%d)\n", regs.fs, regs.fs >> 3, regs.fs & 3);
45         printf("gs: %x (%d|%d)\n", regs.gs, regs.gs >> 3, regs.gs & 3);
46
47         for(;;) halt_cpu();
48 }