extern idt_exception_handler global isr_stub_table %macro PUSHALL 0 push rbx push rcx push rdx push rsi push rdi push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 %endmacro %macro POPALL 0 pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop r9 pop r8 pop rdi pop rsi pop rdx pop rcx pop rbx %endmacro ; call the exception handler with the interrupt number ; args: interrupt number %macro ISRException 1 align 8 isr_stub_%+%1: PUSHALL cld mov rdi, %1 mov rsi, 0 call idt_exception_handler POPALL iretq %endmacro ; call the exception handler with the interrupt number ; these exceptions also put an error code on the stack ; args: interrupt number %macro ISRExceptionCode 1 align 8 isr_stub_%+%1: PUSHALL cld mov rdi, %1 pop rsi call idt_exception_handler POPALL iretq %endmacro ; do nothing ; args: interrupt number %macro ISRIgnore 1 align 8 isr_stub_%+%1: iretq %endmacro ; isr stubs section .text bits 64 ISRException 0 ISRException 1 ISRException 2 ISRException 3 ISRException 4 ISRException 5 ISRException 6 ISRException 7 ISRExceptionCode 8 ISRException 9 ISRExceptionCode 10 ISRExceptionCode 11 ISRExceptionCode 12 ISRExceptionCode 13 ISRExceptionCode 14 ISRException 15 ISRException 16 ISRExceptionCode 17 ISRException 18 ISRException 19 ISRException 20 ISRExceptionCode 21 ISRException 22 ISRException 23 ISRException 24 ISRException 25 ISRException 26 ISRException 27 ISRException 28 ISRExceptionCode 29 ISRExceptionCode 30 ISRException 31 %assign i 32 ; ignore other interrupts %rep 0x100 - i ISRIgnore i %assign i i+1 %endrep ; isr stub table section .rodata bits 64 align 16 isr_stub_table: %assign i 0 %rep 256 dq isr_stub_%+i %assign i i+1 %endrep