gems-kernel/source/THIRDPARTY/nanobyte_os/kernel/arch/i686/isr.asm
2024-06-03 11:16:15 -05:00

53 lines
No EOL
1.2 KiB
NASM

[bits 32]
extern i686_ISR_Handler
; cpu pushes to the stack: ss, esp, eflags, cs, eip
%macro ISR_NOERRORCODE 1
global i686_ISR%1:
i686_ISR%1:
push 0 ; push dummy error code
push %1 ; push interrupt number
jmp isr_common
%endmacro
%macro ISR_ERRORCODE 1
global i686_ISR%1:
i686_ISR%1:
; cpu pushes an error code to the stack
push %1 ; push interrupt number
jmp isr_common
%endmacro
%include "arch/i686/isrs_gen.inc"
isr_common:
pusha ; pushes in order: eax, ecx, edx, ebx, esp, ebp, esi, edi
xor eax, eax ; push ds
mov ax, ds
push eax
mov ax, 0x10 ; use kernel data segment
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
push esp ; pass pointer to stack to C, so we can access all the pushed information
call i686_ISR_Handler
add esp, 4
pop eax ; restore old segment
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
popa ; pop what we pushed with pusha
add esp, 8 ; remove error code and interrupt number
iret ; will pop: cs, eip, eflags, ss, esp