Kernel/vfs - Fixing OpenInode support
[tpg/acess2.git] / Kernel / arch / x86 / desctab.asm
index 4223e6f..dc064f5 100644 (file)
@@ -54,6 +54,8 @@ Desctab_Install:
 .pl0code:
 
        ; 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
@@ -64,23 +66,28 @@ Desctab_Install:
        or ax, 0x8000
        mov     WORD [gIDT + %1*8 + 4], ax
 %endmacro
+       ; 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
        SET_USER        0xAC
        SET_TRAP        0xAC    ; Interruptable
        
+       ; MP ISRs
        %if USE_MP
        SETISR  0xEE    ; 0xEE Timer
        SETISR  0xEF    ; 0xEF Spurious Interrupt
@@ -203,7 +210,7 @@ DEF_SYSCALL 0xAC    ; Acess System Call
 [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
@@ -220,7 +227,8 @@ Isr0xEF:
 [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
@@ -280,6 +288,18 @@ SyscallCommon:
        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
@@ -293,6 +313,8 @@ SyscallCommon:
 ; ------------
 [extern IRQ_Handler]
 [global IRQCommon]
+[global IRQCommon_handled]
+IRQCommon_handled equ IRQCommon.handled
 IRQCommon:
        pusha
        push ds
@@ -308,6 +330,7 @@ IRQCommon:
        
        push esp
        call IRQ_Handler
+.handled:
        add esp, 4
        
        pop gs

UCC git Repository :: git.ucc.asn.au