Add stack frame to panic

This commit is contained in:
ssimnb 2026-02-01 14:55:30 +01:00
parent b337e5193b
commit cfcb806ebf
16 changed files with 169 additions and 103 deletions

View file

@ -1,5 +1,6 @@
#include "idt.h"
#include "error.h"
#include "smp.h"
#include "timer.h"
#include <kprint.h>
#include <lock.h>
@ -200,15 +201,30 @@ char *exception_messages[] =
"Reserved"
};
extern void *next_frame(void *addr);
void interrupt_handler(interrupt_frame *r){
if(r->int_no < 32){
kprintf("\nOh no! Received interrupt {d}, '{s}'. Below is the provided stack frame{n}{n}", r->int_no, exception_messages[r->int_no]);
kprintf("error code 0x{xn}", r->err);
kprintf("rax 0x{x} | rbx 0x{x} | rcx 0x{x} | rdx 0x{xn}", r->rax, r->rbx, r->rcx, r->rdx);
kprintf("rdi 0x{x} | rsi 0x{x} | rbp 0x{xn}", r->rdi, r->rsi, r->rbp);
kprintf("r8 0x{x} | r9 0x{x} | r10 0x{x} | r11 0x{x} | r12 0x{x} | r13 0x{x} | r14 0x{x} | r15 0x{xn}", r->r8, r->r9, r->r10, r->r11, r->r12, r->r13, r->r14, r->r15);
kprintf("rip 0x{x} | cs 0x{x} | ss 0x{x} | rsp 0x{x} | rflags 0x{xn}", r->rip, r->cs, r->ss, r->rsp, r->rflags);
kprintf("\nOh no! Received interrupt {d}, '{s}'. Below is the provided stack frame\n\n", r->int_no, exception_messages[r->int_no]);
if(r->err != 0){
kprintf("error code 0x{xn}", r->err);
}
kprintf("rax 0x{x} | rbx 0x{x} | rcx 0x{x} | rdx 0x{x}\n", r->rax, r->rbx, r->rcx, r->rdx);
kprintf("rdi 0x{x} | rsi 0x{x} | rbp 0x{x}\n", r->rdi, r->rsi, r->rbp);
kprintf("r8 0x{x} | r9 0x{x} | r10 0x{x} | r11 0x{x} | r12 0x{x} | r13 0x{x} | r14 0x{x} | r15 0x{x}\n", r->r8, r->r9, r->r10, r->r11, r->r12, r->r13, r->r14, r->r15);
kprintf("rip 0x{x} | cs 0x{x} | ss 0x{x} | rsp 0x{x} | rflags 0x{x}\n", r->rip, r->cs, r->ss, r->rsp, r->rflags);
kprintf("\nStack frame:\n");
struct stack_frame *f = __builtin_frame_address(0);
int i = 0;
while(f != NULL && i < 10){
kprintf("{d}: 0x{x}\n", i, f->rip);
f = (stack_frame *)f->rbp;
i++;
}
kkill();
for(;;);
}
@ -220,6 +236,12 @@ void interrupt_handler(interrupt_frame *r){
if(r->int_no == 69){
apic_timer_handler();
}
if(r->int_no == 69 && get_cpu_struct_initialized()
&& get_cpu_struct()->scheduler_initialized){
enter_scheduler();
}
if(r->int_no == 70){
for(;;){
asm("cli;hlt");