ALIGN 8
[global gIDT]
gIDT:
- times 256 dd 0x00080000,0x00000F00
+ ; CS = 0x08, Type = 32-bit Interrupt (0xE = 1 110)
+ times 256 dd 0x00080000,0x00000E00
[global gIDTPtr]
gIDTPtr:
dw 256 * 16 - 1 ; Limit
jmp 0x08:.pl0code
.pl0code:
- ; Set IDT
+ ; Set up IDT
+ ; Helper Macros
+ ; - Set an IDT entry to an ISR
%macro SETISR 1
mov eax, Isr%1
mov WORD [gIDT + %1*8], ax
or ax, 0x8000
mov WORD [gIDT + %1*8 + 4], ax
%endmacro
-%macro SETUSER 1
- mov ax, WORD [gIDT + %1*8 + 4]
- or ax, 0x6000
- mov WORD [gIDT + %1*8 + 4], ax
+ ; Enable user calling of an ISR
+%macro SET_USER 1
+ or WORD [gIDT + %1*8 + 4], 0x6000
+%endmacro
+ ; Set an ISR as a trap (leaves interrupts enabled when invoked)
+%macro SET_TRAP 1
+ or WORD [gIDT + %1*8 + 4], 0x0100
%endmacro
+
+ ; Error handlers
%assign i 0
%rep 32
SETISR i
%assign i i+1
%endrep
+ ; User Syscall
SETISR 0xAC
- SETUSER 0xAC
+ SET_USER 0xAC
+ SET_TRAP 0xAC ; Interruptable
+ ; MP ISRs
%if USE_MP
SETISR 0xEE ; 0xEE Timer
SETISR 0xEF ; 0xEF Spurious Interrupt
%endif
-
+
+ ; IRQs
%assign i 0xF0
%rep 16
SETISR i
%macro ISR_ERRNO 1
[global Isr%1]
Isr%1:
- xchg bx, bx
+ ;xchg bx, bx
push %1
jmp ErrorCommon
%endmacro
%macro ISR_NOERR 1
[global Isr%1]
Isr%1:
- xchg bx, bx
+ ;xchg bx, bx
push 0
push %1
jmp ErrorCommon