X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Farch%2Fx86%2Fdesctab.asm;h=dc064f579f7287910e44e1d6f66f00b7021892e7;hb=7e5607004c3221d55c7992148b2f0d958cf28533;hp=4223e6f18f199a2d9dadd3b9e3669defb9fd349f;hpb=3998cfbbadb005bf3ad52ea2538dc21f82864ddc;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/desctab.asm b/Kernel/arch/x86/desctab.asm index 4223e6f1..dc064f57 100644 --- a/Kernel/arch/x86/desctab.asm +++ b/Kernel/arch/x86/desctab.asm @@ -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