Files
Astral/kernel-src/arch/x86-64/isr.asm
T
2025-02-08 20:13:30 -03:00

104 lines
1.4 KiB
NASM

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], 0x23
jne .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
cld
extern interrupt_isr
call interrupt_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 ; remove irq
pop rbp
add rsp,8 ; remove error code
; check if swapgs is needed
cmp qword [rsp+8], 0x23
jne .notneeded2
swapgs
.notneeded2:
o64 iret
section .rodata
global isr_table
isr_table:
%assign i 0
%rep 256
dq isr_%+ i
%assign i i + 1
%endrep