#pragma once #include "stdarg.h" // c.f. intel software-developer-vol-1 6.4.1 struct interrupt_frame { uint32_t eip; uint32_t cs; uint32_t eflags; uint32_t esp; uint32_t ss; }; // Exception #define DECLARE_INTERRUPT(int_nb) \ void print_handler_##int_nb(struct interrupt_frame *frame, ulong error_code); #define ACCESS_INTERRUPT(int_nb) print_handler_##int_nb void pagefault_handler(struct interrupt_frame *frame, ulong error_code); DECLARE_INTERRUPT(EXCEPTION_DOUBLE_FAULT) DECLARE_INTERRUPT(EXCEPTION_DIVIDE_ZERO) DECLARE_INTERRUPT(EXCEPTION_DEBUG) DECLARE_INTERRUPT(EXCEPTION_NMI) DECLARE_INTERRUPT(EXCEPTION_BREAKPOINT) DECLARE_INTERRUPT(EXCEPTION_OVERFLOW) DECLARE_INTERRUPT(EXCEPTION_BOUND_RANGE_EXCEEDED) DECLARE_INTERRUPT(EXCEPTION_INVALID_OPCODE) DECLARE_INTERRUPT(EXCEPTION_DEVICE_NOT_AVAILABLE) DECLARE_INTERRUPT(EXCEPTION_COPRO_OVERRUN) DECLARE_INTERRUPT(EXCEPTION_INVALID_TSS) DECLARE_INTERRUPT(EXCEPTION_SEGMENT_NOT_PRESENT) DECLARE_INTERRUPT(EXCEPTION_STACK_SEGMENT_FAULT) DECLARE_INTERRUPT(EXCEPTION_GENERAL_PROTECTION_FAULT) DECLARE_INTERRUPT(EXCEPTION_PAGE_FAULT) DECLARE_INTERRUPT(EXCEPTION_RESERVED_1) DECLARE_INTERRUPT(EXCEPTION_X87_FP_EXCEPTION) DECLARE_INTERRUPT(EXCEPTION_ALIGNMENT_CHECK) DECLARE_INTERRUPT(EXCEPTION_MACHINE_CHECK) DECLARE_INTERRUPT(EXCEPTION_SIMD_FP) DECLARE_INTERRUPT(EXCEPTION_VIRTUALIZATION) DECLARE_INTERRUPT(EXCEPTION_RESERVED_2) DECLARE_INTERRUPT(EXCEPTION_RESERVED_3) DECLARE_INTERRUPT(EXCEPTION_RESERVED_4) DECLARE_INTERRUPT(EXCEPTION_RESERVED_5) DECLARE_INTERRUPT(EXCEPTION_RESERVED_6) DECLARE_INTERRUPT(EXCEPTION_RESERVED_7) DECLARE_INTERRUPT(EXCEPTION_RESERVED_8) DECLARE_INTERRUPT(EXCEPTION_RESERVED_9) DECLARE_INTERRUPT(EXCEPTION_RESERVED_10) DECLARE_INTERRUPT(EXCEPTION_SECURITY) DECLARE_INTERRUPT(EXCEPTION_RESERVED_11) // IRQ void pit_handler(struct interrupt_frame *frame);