X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fdesctab.asm;h=f6cc14e1b7e3bfcf26f9a9ff5e7b068e116b0139;hb=18b264927674c480481466c40368554fb72f560f;hp=1513984ae23e526479dec84d935ffadf7e278b1b;hpb=43be77083eba1fc5b11b46deddcf499bac054d6e;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/desctab.asm b/Kernel/arch/x86/desctab.asm index 1513984a..f6cc14e1 100644 --- a/Kernel/arch/x86/desctab.asm +++ b/Kernel/arch/x86/desctab.asm @@ -31,7 +31,8 @@ gGDTPtr: 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 @@ -52,34 +53,47 @@ Desctab_Install: 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 shr eax, 16 mov WORD [gIDT + %1*8+6], ax + ; Enable mov ax, WORD [gIDT + %1*8 + 4] 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 239 + SETISR 0xEE ; 0xEE Timer + SETISR 0xEF ; 0xEF Spurious Interrupt %endif - + + ; IRQs %assign i 0xF0 %rep 16 SETISR i @@ -134,7 +148,7 @@ Isr%1: %macro ISR_NOERR 1 [global Isr%1] Isr%1: - xchg bx, bx + ;xchg bx, bx push 0 push %1 jmp ErrorCommon @@ -191,24 +205,33 @@ ISR_NOERR 31; 31: Reserved DEF_SYSCALL 0xAC ; Acess System Call -; AP's Timer Interrupt %if USE_MP -[global Isr239] +[global Isr0xEE] [extern SchedulerBase] -Isr239: +; AP's Timer Interrupt +Isr0xEE: push 0 + xchg bx, bx ; MAGIC BREAK jmp SchedulerBase +; Spurious Interrupt +[global Isr0xEF] +Isr0xEF: + xchg bx, bx ; MAGIC BREAK + iret %endif ; IRQs ; - Timer [global Isr240] +[global Isr240.jmp] [extern SchedulerBase] [extern SetAPICTimerCount] Isr240: push 0 + ;xchg bx, bx ; MAGIC BREAK +Isr240.jmp: %if USE_MP - jmp SetAPICTimerCount + jmp SetAPICTimerCount ; This is reset once the bus speed has been calculated %else jmp SchedulerBase %endif @@ -224,7 +247,7 @@ Isr240: ; --------------------- [extern ErrorHandler] ErrorCommon: - ;xchg bx, bx + ;xchg bx, bx ; MAGIC BREAK pusha push ds push es