58217f5900
WOO HOO!
53 lines
No EOL
1.2 KiB
NASM
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 |