#include "panic/panic.h" #include "arch/x86_64/hal/idt.h" #include "arch/x86_64/x86_64.h" #include "arch/x86_64/hal/paging.h" #include "lib/printf.h" __attribute__((naked)) void* __panic_get_bp(void) { asm("movq %%rbp, %%rax; \ retq"::: "memory"); } void* __panic_print_istate(void *state) { struct int_stackframe *int_state = state; kprintf("RIP: %p | RSP: %p\n", int_state->int_rip, int_state->int_rsp); print_state(&int_state->state); return (void*)int_state->state.rbp; } void __panic_stack_trace(void *bp) { uintmax_t *rbp = (uintmax_t*)bp; kprintf("\nStack trace:\n"); while(rbp) { kprintf("%p:\n", rbp[1]); uintmax_t *next = (uintmax_t*)rbp[0]; ptrdiff_t dist = (next - rbp); if((uintptr_t)next < IDENT_VIRT_BASE) break; if(dist > 0) { for(size_t i = 0; i < dist; i++) { kprintf(" %p\n", rbp[i]); } } rbp = next; } }