refactor exception panic

This commit is contained in:
trimill 2024-02-03 00:58:27 -05:00
parent 90a6065691
commit 5bec5d9fbd
No known key found for this signature in database
GPG key ID: 4F77A16E17E10BCB
4 changed files with 17 additions and 32 deletions

View file

@ -8,6 +8,3 @@
__attribute__((format(printf, 3, 4))) __attribute__((format(printf, 3, 4)))
_Noreturn void _panic_impl(char *line, char *file, char *format, ...); _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, ...);

View file

@ -1,10 +1,11 @@
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
#include <lib.h> #include <lib.h>
#include <panic.h>
#include "idt.h" #include "idt.h"
#include "backtrace.h"
#include "debugger.h" #include "debugger.h"
#include "../paging.h" #include "../bindings.h"
#include "../drivers/pic.h" #include "../drivers/pic.h"
#define IDT_SIZE 256 #define IDT_SIZE 256
@ -117,25 +118,25 @@ void idt_exception_handler(uint64_t exception, uint64_t code, struct isr_regs *s
return; return;
} }
char custom[64]; kputs("\n\n!!! EXCEPTION !!!\n");
*custom = '\0'; kprintf("0x%02lX %s\n", exception, EXCEPTIONS[exception]);
kprintf("Error code 0x%lX\n", code);
// page faults store the offending address in cr2 // page faults store the offending address in cr2
if (exception == 0x0E) { if (exception == 0x0E) {
strcat(custom, "\nPage fault address: 0x");
uint64_t cr2; uint64_t cr2;
__asm__ volatile ("mov %%cr2, %0" : "=r"(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( log_backtrace_ex((void *)state->rip, (void *)state->rbp);
(void *)state->rip,
(void *)state->rbp, while (1) {
"Exception %s\nError code 0x%lu%s", halt();
EXCEPTIONS[exception], }
code,
custom
);
} }
void idt_pic_eoi(uint8_t exception) { void idt_pic_eoi(uint8_t exception) {

View file

@ -20,17 +20,3 @@ _Noreturn void _panic_impl(char *line, char *file, char *format, ...) {
halt(); 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();
}
}

View file

@ -20,8 +20,9 @@ void kmain(struct boot_info *info) {
char *test = kalloc(5); char *test = kalloc(5);
*test = 1; *test = 1;
while (1) { while (1) {
screen_redraw(); screen_redraw();
// loop so we dont halt
// this allows interrupts to fire
} }
} }