section .text %assign i 0 %rep 256 isr_%+ i: ; push an error code if the cpu did not %if i <> 8 && i <> 10 && i <> 11 && i <> 12 && i <> 13 && i <> 14 push qword 0 %endif push rbp ; this push is here to free a register mov rbp, i jmp isr_common %assign i i + 1 %endrep isr_common: ; check if swapgs is needed cmp qword [rsp+24], 0x8 je .notneeded1 swapgs .notneeded1: ; push context push rbp ; push irq num push rsi push rdi push r15 push r14 push r13 push r12 push r11 push r10 push r9 push r8 push rdx push rcx push rbx push rax mov rax, ds push rax mov rax, es push rax mov rax, fs push rax mov rax, gs push rax mov rdi,cr2 push rdi ; set up kernel segments mov rdi, 0x10 mov ds, rdi mov es, rdi ; save ctx pointer and interrupt vector number mov rdi, rbp ; vec mov rsi, rsp ; ctx ; set this as the end of the stack frame or continue it cmp qword [rsp + 184], 0x8 jne .zero_frame push qword [rsp + 176] push qword [rsp + 168] jmp .keep_going .zero_frame: push qword 0 push qword 0 .keep_going: mov rbp, rsp cld extern interrupt_isr call interrupt_isr cli ; pop context add rsp, 40 ; cr2 gs and fs are not popped. pop rax mov es,rax pop rax mov ds,rax pop rax pop rbx pop rcx pop rdx pop r8 pop r9 pop r10 pop r11 pop r12 pop r13 pop r14 pop r15 pop rdi pop rsi add rsp,8 ; remove irq pop rbp add rsp,8 ; remove error code ; check if swapgs is needed cmp qword [rsp+8], 0x8 je .notneeded2 swapgs .notneeded2: o64 iret global asm_nmi_handler asm_nmi_handler: sub rsp, 8 ; error code, unused for nmi push rbp sub rsp, 8 ; vec number, unused for nmi push rsi push rdi push r15 push r14 push r13 push r12 push r11 push r10 push r9 push r8 push rdx push rcx push rbx push rax mov rax, ds push rax mov rax, es push rax mov rax, fs push rax mov rax, gs push rax mov rdi,cr2 push rdi ; set up kernel segments mov rdi, 0x10 mov ds, rdi mov es, rdi ; save ctx pointer mov rdi, rsp ; set this as the end of the stack frame xor rbp, rbp cld extern arch_nmi_isr call arch_nmi_isr cli ; pop context add rsp, 24 ; cr2 gs and fs are not popped. pop rax mov es,rax pop rax mov ds,rax pop rax pop rbx pop rcx pop rdx pop r8 pop r9 pop r10 pop r11 pop r12 pop r13 pop r14 pop r15 pop rdi pop rsi add rsp, 8 ; vector num, unused for nmi pop rbp add rsp, 8 ; error code, unused for nmi o64 iret section .rodata global isr_table isr_table: %assign i 0 %rep 256 dq isr_%+ i %assign i i + 1 %endrep