%macro ISR 1 global isr%1 isr%1: push byte 0 push byte %1 jmp asm_common %endmacro %macro ISR_ERROR 1 global isr%1 isr%1: push byte %1 jmp asm_common %endmacro %macro IRQ 2 global isr%1 isr%1: push byte %2 push byte %1 jmp asm_common %endmacro %macro SOFT 1 global isr%1 isr%1: push byte 0 push byte %1 jmp asm_common %endmacro global unused unused: push byte 0 push 256 jmp asm_common extern common_handler global asm_common asm_common: cld push rax push rbx push rcx push rdx push rbp push rdi push rsi push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 mov r8, ds push r8 mov r8, 0x10 mov ds, r8 mov es, r8 mov r8, cr2 push r8 mov rdi, rsp call common_handler add rsp, 8 pop r8 mov ds, r8 mov es, r8 pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop r9 pop r8 pop rsi pop rdi pop rbp pop rdx pop rcx pop rbx pop rax add rsp, 16 iretq ISR 0 ISR 1 ISR 2 ISR 3 ISR 4 ISR 5 ISR 6 ISR 7 ISR_ERROR 8 ISR_ERROR 10 ISR_ERROR 11 ISR_ERROR 12 ISR_ERROR 13 ISR_ERROR 14 ISR 16 ISR_ERROR 17 ISR 18 ISR 19 ISR 20 ISR_ERROR 21 ISR 28 ISR_ERROR 29 ISR_ERROR 30 IRQ 32, 0 IRQ 33, 1 IRQ 34, 2 IRQ 35, 3 IRQ 36, 4 IRQ 37, 5 IRQ 38, 6 IRQ 39, 7 IRQ 40, 8 IRQ 41, 9 IRQ 42, 10 IRQ 43, 11 IRQ 44, 12 IRQ 45, 13 IRQ 46, 14 IRQ 47, 15 SOFT 48