;************************************************************************************
%macro COMMONSTUB 1
[EXTERN idt_%1Handler]
%1_common_stub:
pusha ; Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
mov ax, ds ; Lower 16-bits of eax = ds.
push eax ; save the data segment descriptor
mov ax, 0x10 ; load the kernel data segment descriptor
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; pass the register data structure as a pointer to the function
; (passing it directly results in GCC trashing the data when doing optimisations)
mov eax, esp
push eax
call idt_%1Handler
add esp, 4
pop eax ; reload the original data segment descriptor
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
popa ; Pops edi,esi,ebp...
add esp, 8 ; Cleans up the pushed error code and pushed ISR number
iret
%endmacro
COMMONSTUB ex
COMMONSTUB irq
COMMONSTUB syscall
;************************************************************************************
%macro EX_NOERRCODE 1 ; define a macro, taking one parameter
[GLOBAL isr%1] ; %1 accesses the first parameter.
isr%1:
push byte 0
push byte %1
jmp ex_common_stub
%endmacro
%macro EX_ERRCODE 1
[GLOBAL isr%1]
isr%1:
push byte %1
jmp ex_common_stub
%endmacro
%macro IRQ 2
[GLOBAL irq%1]
irq%1:
push byte %1 ;push irq number
push byte %2 ;push int number
jmp irq_common_stub
%endmacro
%macro SYSCALL 1
[GLOBAL syscall%1]
syscall%1:
cli
push byte 0
push byte %1
jmp syscall_common_stub
%endmacro
EX_NOERRCODE 0
EX_NOERRCODE 1
EX_NOERRCODE 2
EX_NOERRCODE 3
EX_NOERRCODE 4
EX_NOERRCODE 5
EX_NOERRCODE 6
EX_NOERRCODE 7
EX_ERRCODE 8
EX_NOERRCODE 9
EX_ERRCODE 10
EX_ERRCODE 11
EX_ERRCODE 12
EX_ERRCODE 13
EX_ERRCODE 14
EX_NOERRCODE 15
EX_NOERRCODE 16
EX_NOERRCODE 17
EX_NOERRCODE 18
EX_NOERRCODE 19
EX_NOERRCODE 20
EX_NOERRCODE 21
EX_NOERRCODE 22
EX_NOERRCODE 23
EX_NOERRCODE 24
EX_NOERRCODE 25
EX_NOERRCODE 26
EX_NOERRCODE 27
EX_NOERRCODE 28
EX_NOERRCODE 29
EX_NOERRCODE 30
EX_NOERRCODE 31
IRQ 0, 32
IRQ 1, 33
IRQ 2, 34
IRQ 3, 35
IRQ 4, 36
IRQ 5, 37
IRQ 6, 38
IRQ 7, 39
IRQ 8, 40
IRQ 9, 41
IRQ 10, 42
IRQ 11, 43
IRQ 12, 44
IRQ 13, 45
IRQ 14, 46
IRQ 15, 47
SYSCALL 64
; vim: set ts=4 sw=4 tw=0 noet :