diff --git a/include/panic.h b/include/panic.h index 08b7561..b79c352 100644 --- a/include/panic.h +++ b/include/panic.h @@ -8,6 +8,3 @@ __attribute__((format(printf, 3, 4))) _Noreturn void _panic_impl(char *line, char *file, char *format, ...); - -__attribute__((format(printf, 3, 4))) -_Noreturn void panic_interrupt(void *ip, void *bp, char *format, ...); diff --git a/src/arch/amd64/cpu/idt.c b/src/arch/amd64/cpu/idt.c index 053f614..c286199 100644 --- a/src/arch/amd64/cpu/idt.c +++ b/src/arch/amd64/cpu/idt.c @@ -1,10 +1,11 @@ #include #include #include -#include + #include "idt.h" +#include "backtrace.h" #include "debugger.h" -#include "../paging.h" +#include "../bindings.h" #include "../drivers/pic.h" #define IDT_SIZE 256 @@ -117,25 +118,25 @@ void idt_exception_handler(uint64_t exception, uint64_t code, struct isr_regs *s return; } - char custom[64]; - *custom = '\0'; + kputs("\n\n!!! EXCEPTION !!!\n"); + kprintf("0x%02lX %s\n", exception, EXCEPTIONS[exception]); + kprintf("Error code 0x%lX\n", code); + // page faults store the offending address in cr2 if (exception == 0x0E) { - strcat(custom, "\nPage fault address: 0x"); uint64_t cr2; __asm__ volatile ("mov %%cr2, %0" : "=r"(cr2)); - ultoa((size_t)cr2, custom + 23, 16); + kprintf("Page fault address: 0x%lX\n", cr2); } + + kputs("\n"); - panic_interrupt( - (void *)state->rip, - (void *)state->rbp, - "Exception %s\nError code 0x%lu%s", - EXCEPTIONS[exception], - code, - custom - ); + log_backtrace_ex((void *)state->rip, (void *)state->rbp); + + while (1) { + halt(); + } } void idt_pic_eoi(uint8_t exception) { diff --git a/src/arch/amd64/panic.c b/src/arch/amd64/panic.c index 6c35727..48e65f5 100644 --- a/src/arch/amd64/panic.c +++ b/src/arch/amd64/panic.c @@ -20,17 +20,3 @@ _Noreturn void _panic_impl(char *line, char *file, char *format, ...) { halt(); } } - -_Noreturn void panic_interrupt(void *ip, void *bp, char *msg, ...) { - va_list list; - va_start(list, msg); - cli(); - kputs("\n\n!!! PANIC !!!\n"); - kvprintf(msg, list); - kputs("\n\n"); - - log_backtrace_ex(ip, bp); - while (1) { - halt(); - } -} diff --git a/src/kmain.c b/src/kmain.c index 249dd84..1175f14 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -20,8 +20,9 @@ void kmain(struct boot_info *info) { char *test = kalloc(5); *test = 1; - while (1) { screen_redraw(); + // loop so we dont halt + // this allows interrupts to fire } }