idt.asm (1197B)
1 bits 64 2 3 extern interrupt_handler 4 global idt_handler_0 5 global idt_handler_13 ; GPF pushes an error code 6 7 ; Macro for interrupts that DO NOT push an error code 8 %macro ISR_NOERR 1 9 global idt_handler_%1 10 idt_handler_%1: 11 push qword 0 ; Push dummy error code 12 push qword %1 ; Push vector number 13 jmp isr_common 14 %endmacro 15 16 ; Macro for interrupts that DO push an error code 17 %macro ISR_ERR 1 18 global idt_handler_%1 19 idt_handler_%1: 20 push qword %1 ; Push vector number (error code is already there) 21 jmp isr_common 22 %endmacro 23 24 ISR_NOERR 0 ; Divide by Zero 25 ISR_ERR 13 ; General Protection Fault 26 27 isr_common: 28 push rax 29 push rbx 30 push rcx 31 push rdx 32 push rsi 33 push rdi 34 push rbp 35 push r8 36 push r9 37 push r10 38 push r11 39 push r12 40 push r13 41 push r14 42 push r15 43 44 mov rdi, rsp ; Pass stack pointer as first argument to C handler 45 call interrupt_handler 46 47 pop r15 48 pop r14 49 pop r13 50 pop r12 51 pop r11 52 pop r10 53 pop r9 54 pop r8 55 pop rbp 56 pop rdi 57 pop rsi 58 pop rdx 59 pop rcx 60 pop rbx 61 pop rax 62 add rsp, 16 ; Clean up pushed vector number and error code 63 iretq