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
mov dx, 0x20
mov al, 0x11
out dx, al ; Init Command
- mov dx, 0x21
+ mov dx, 0x21
mov al, 0xF0
out dx, al ; Offset (Start of IDT Range)
- mov al, 0x04
+ mov al, 0x04
out dx, al ; IRQ connected to Slave (00000100b) = IRQ2
- mov al, 0x01
+ mov al, 0x01
out dx, al ; Set Mode
- mov al, 0x00
+ mov al, 0x00
out dx, al ; Set Mode
mov dx, 0xA0
mov al, 0x11
out dx, al ; Init Command
- mov dx, 0xA1
+ mov dx, 0xA1
mov al, 0xF8
out dx, al ; Offset (Start of IDT Range)
- mov al, 0x02
+ mov al, 0x02
out dx, al ; IRQ Line connected to master
- mov al, 0x01
+ mov al, 0x01
out dx, al ; Set Mode
- mov dl, 0x00
+ mov dl, 0x00
out dx, al ; Set Mode
pop edx
[extern SchedulerBase]
; AP's Timer Interrupt
Isr0xEE:
- push 0
+ push 0 ; Line up with interrupt number
xchg bx, bx ; MAGIC BREAK
jmp SchedulerBase
; Spurious Interrupt
[extern SchedulerBase]
[extern SetAPICTimerCount]
Isr240:
- push 0
+ push 0 ; Line up with Argument in errors
+ push 0 ; CPU Number
;xchg bx, bx ; MAGIC BREAK
Isr240.jmp:
%if USE_MP
[extern ErrorHandler]
ErrorCommon:
;xchg bx, bx ; MAGIC BREAK
+
pusha
push ds
push es
push fs
push gs
-
+
+ ; Clear TF
+; pushf
+; and WORD [esp], 0xFEFF
+; popf
+
mov ax, 0x10
mov ds, ax
mov es, ax
call SyscallHandler
add esp, 4
+ ; Pass changes to TF on to the user
+ ; EFLAGS is stored at ESP[4+8+2+2]
+ ; 4 Segment Registers
+ ; 8 GPRs
+ ; 2 Error Code / Interrupt ID
+ ; 2 CS/EIP
+ pushf
+ pop eax
+ and eax, 0x100 ; 0x100 = Trace Flag
+ and WORD [esp+(4+8+2+2)*4], ~0x100 ; Clear
+ or DWORD [esp+(4+8+2+2)*4], eax ; Set for user
+
pop gs
pop fs
pop es
; ------------
[extern IRQ_Handler]
[global IRQCommon]
+[global IRQCommon_handled]
+IRQCommon_handled equ IRQCommon.handled
IRQCommon:
pusha
push ds
push esp
call IRQ_Handler
+.handled:
add esp, 4
pop gs