#include "exception.h" #include "klibc.h" #include "vga.h" #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) // Need GCC > 6 #define DEFINE_INTERRUPT(int_nb) \ __attribute__((interrupt)) void print_handler_##int_nb(struct interrupt_frame *frame, \ ulong error_code) \ { \ int intNbInt = int_nb; \ printStringDetails("EXCEPTION ", RED, BLACK, 0, VGA_HEIGHT - 1); \ printIntDetails(intNbInt, RED, BLACK, 11, VGA_HEIGHT - 1); \ printIntDetails(error_code, RED, BLACK, 14, VGA_HEIGHT - 1); \ printf("Exception %d (Err %d) at 0x%x\n", int_nb, error_code, frame->eip); \ } DEFINE_INTERRUPT(EXCEPTION_DOUBLE_FAULT) // c.f. https://wiki.osdev.org/Paging#Handling // error_code bit0: Present ? // bit1: Trying to write ? // bit2: User page try to access? __attribute__((interrupt)) void pagefault_handler(struct interrupt_frame *frame, ulong error_code) { // A page fault has occurred. // The faulting address is stored in the CR2 register. uint32_t faulting_address; asm volatile("mov %%cr2, %0" : "=r"(faulting_address)); printStringDetails("PAGE FAULT", RED, BLACK, 0, VGA_HEIGHT - 1); printIntDetails(error_code, RED, BLACK, 11, VGA_HEIGHT - 1); (void)faulting_address; (void)frame; (void)error_code; }