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)))
_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 <stddef.h>
#include <lib.h>
#include <panic.h>
#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) {

View file

@ -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();
}
}

View file

@ -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
}
}