summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/panic.c
blob: 2e345009a9e3986e6220baf016d2372a0a0ed842 (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
33
34
35
36
#include "jove.h"
#include "arch/x86_64/idt.h"
#include "print.h"

#include <stddef.h>

struct stackFrame {
    struct stackFrame *ebp;
    uintptr_t eip;
};

void 
kpanic_state(ivt_state_t *state, const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    kprintf("Kernel Panic!\n");

    kvprintf(fmt, ap);
    kprintf("\n\nCore dump:\n");

    kprintf("RAX %p | RBX %p | RCX %p | RDX %p\n", state->rax, state->rbx, state->rcx, state->rdx);
    kprintf("RSI %p | RDI %p | RSP %p | RBP %p\n", state->rsi, state->rdi, state->rsp, state->rbp);
    kprintf("R8  %p | R9  %p | R10 %p | R11 %p\n", state->r8, state->r9, state->r10, state->r11);
    kprintf("R12 %p | R13 %p | R14 %p | R15 %p\n", state->r12, state->r13, state->r14, state->r15);
    kprintf("RIP %p\n", state->rip);

    kprintf("\nStack trace:\n");
    struct stackFrame *frame = (struct stackFrame*)state->rbp;
    for(size_t framei = 0; frame && framei < 64; ++framei) {
        kprintf("%i %p : %p\n", framei, frame, frame->eip);
        frame = frame->ebp;
    }

    hcf();
}