#include "exception.h" #include "klibc.h" #include "kthread.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; \ VGAPrintf(RED, BLACK, 0, VGA_HEIGHT - 1, "EXCEPTION %d %d", intNbInt, error_code); \ printf("Exception %d (Err %d) at 0x%x\n", int_nb, error_code, frame->eip); \ asm("hlt"); \ } DEFINE_INTERRUPT(EXCEPTION_DOUBLE_FAULT) DEFINE_INTERRUPT(EXCEPTION_DIVIDE_ZERO) DEFINE_INTERRUPT(EXCEPTION_DEBUG) DEFINE_INTERRUPT(EXCEPTION_NMI) DEFINE_INTERRUPT(EXCEPTION_BREAKPOINT) DEFINE_INTERRUPT(EXCEPTION_OVERFLOW) DEFINE_INTERRUPT(EXCEPTION_BOUND_RANGE_EXCEEDED) DEFINE_INTERRUPT(EXCEPTION_INVALID_OPCODE) DEFINE_INTERRUPT(EXCEPTION_DEVICE_NOT_AVAILABLE) DEFINE_INTERRUPT(EXCEPTION_COPRO_OVERRUN) DEFINE_INTERRUPT(EXCEPTION_INVALID_TSS) DEFINE_INTERRUPT(EXCEPTION_SEGMENT_NOT_PRESENT) DEFINE_INTERRUPT(EXCEPTION_STACK_SEGMENT_FAULT) DEFINE_INTERRUPT(EXCEPTION_GENERAL_PROTECTION_FAULT) DEFINE_INTERRUPT(EXCEPTION_PAGE_FAULT) DEFINE_INTERRUPT(EXCEPTION_RESERVED_1) DEFINE_INTERRUPT(EXCEPTION_X87_FP_EXCEPTION) DEFINE_INTERRUPT(EXCEPTION_ALIGNMENT_CHECK) DEFINE_INTERRUPT(EXCEPTION_MACHINE_CHECK) DEFINE_INTERRUPT(EXCEPTION_SIMD_FP) DEFINE_INTERRUPT(EXCEPTION_VIRTUALIZATION) DEFINE_INTERRUPT(EXCEPTION_RESERVED_2) DEFINE_INTERRUPT(EXCEPTION_RESERVED_3) DEFINE_INTERRUPT(EXCEPTION_RESERVED_4) DEFINE_INTERRUPT(EXCEPTION_RESERVED_5) DEFINE_INTERRUPT(EXCEPTION_RESERVED_6) DEFINE_INTERRUPT(EXCEPTION_RESERVED_7) DEFINE_INTERRUPT(EXCEPTION_RESERVED_8) DEFINE_INTERRUPT(EXCEPTION_RESERVED_9) DEFINE_INTERRUPT(EXCEPTION_RESERVED_10) DEFINE_INTERRUPT(EXCEPTION_SECURITY) DEFINE_INTERRUPT(EXCEPTION_RESERVED_11) // 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)); struct kthread *current = getCurrentThread(); printf("page fault while in thread %s at 0x%x\n", current->name, faulting_address); VGAPrintf(RED, BLACK, 0, VGA_HEIGHT - 1, "PAGE FAULT %d", error_code); (void)faulting_address; (void)frame; (void)error_code; for(;;) continue; }