#include "exceptions.h" #include "interrupt.h" .macro EXCEPTION_BEGIN vec:req, code=0 // just in case something tried to be clever before cld // push param registers ISR_STORE_PARAM_REGS // store certain parameters movb $\vec,%dil .if \code movq ISR_PARAM_REGS_SIZE(%rsp), %rsi .else xor %rsi, %rsi .endif // caller-saved registers ISR_STORE_CALLER_REGS // callee-saved registers ISR_STORE_CALLEE_REGS .endm .macro EXCEPTION_END vec:req, code=0 // restore all the registers ISR_RESTORE_CALLEE_REGS ISR_RESTORE_CALLER_REGS ISR_RESTORE_PARAM_REGS .if \code add $8, %rsp .endif iretq .endm .macro EXCEPTION_DEFINE name:req, vec:req \name\()_isr: .if \vec > 9 && \vec < 15 || \vec == 17 || \vec == 21 || \vec > 28 && \vec < 31 EXCEPTION_BEGIN \vec, 1 .else EXCEPTION_BEGIN \vec .endif ISR_CALL \name\()_handler .if \vec > 9 && \vec < 15 || \vec == 17 || \vec == 21 || \vec > 28 && \vec < 31 EXCEPTION_END \vec, 1 .else EXCEPTION_END \vec .endif .size \name\()_isr, . - \name\()_isr .endm EXCEPTION_DECLARE page_fault PAGE_FAULT_EXCEPTION EXCEPTION_DECLARE general_protection GENERAL_PROTECTION_EXCEPTION EXCEPTION_DEFINE page_fault, PAGE_FAULT_EXCEPTION EXCEPTION_DEFINE general_protection, GENERAL_PROTECTION_EXCEPTION