X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=inline;f=Kernel%2Farch%2Fx86%2Fdesctab.asm;h=fa7b84b239f31f778e5002706ad622e01be1e580;hb=2ffc5de855d609cf0486c3dad331621341e48175;hp=f6cc14e1b7e3bfcf26f9a9ff5e7b068e116b0139;hpb=66d1b7be42dfb476ce9f9d09d1c57da8de5805d3;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/desctab.asm b/Kernel/arch/x86/desctab.asm index f6cc14e1..fa7b84b2 100644 --- a/Kernel/arch/x86/desctab.asm +++ b/Kernel/arch/x86/desctab.asm @@ -108,27 +108,27 @@ Desctab_Install: 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 @@ -210,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 @@ -227,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 @@ -248,12 +249,18 @@ Isr240.jmp: [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 @@ -287,6 +294,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 @@ -300,6 +319,8 @@ SyscallCommon: ; ------------ [extern IRQ_Handler] [global IRQCommon] +[global IRQCommon_handled] +IRQCommon_handled equ IRQCommon.handled IRQCommon: pusha push ds @@ -315,6 +336,7 @@ IRQCommon: push esp call IRQ_Handler +.handled: add esp, 4 pop gs