Files
opencoreC/kernel/asm/timer_isr.S
T

50 lines
973 B
ArmAsm

/* opencoreC - Timer Preemptive Interrupt Trampoline (Vector 32 / 0x20) */
.global timer_isr_entry
.extern timer_interrupt_handler
.section .text
timer_isr_entry:
/* 1. Save all general-purpose registers to form a complete interrupt context frame */
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
/* 2. Pass current saved stack pointer in RDI */
mov rdi, rsp
call timer_interrupt_handler
/* 3. Switch stack pointer to returned value (RAX contains next thread's RSP) */
mov rsp, rax
/* 4. Restore all general-purpose registers */
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
/* 5. Return from interrupt (IRETQ restores RIP, CS, RFLAGS, RSP, SS) */
iretq