X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fdesctab.asm;h=4223e6f18f199a2d9dadd3b9e3669defb9fd349f;hb=3998cfbbadb005bf3ad52ea2538dc21f82864ddc;hp=b5d060dd180ef03c580035dbae17ec6c0696e1dd;hpb=8d062ceb17eb6cfb2e3db8af6794d38391c245d3;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/desctab.asm b/Kernel/arch/x86/desctab.asm index b5d060dd..4223e6f1 100644 --- a/Kernel/arch/x86/desctab.asm +++ b/Kernel/arch/x86/desctab.asm @@ -21,16 +21,18 @@ gGDT: dd 0x0000FFFF, 0x00CF9200 ; 10 PL0 Data dd 0x0000FFFF, 0x00CFFA00 ; 18 PL3 Code dd 0x0000FFFF, 0x00CFF200 ; 20 PL3 Data - dd 26*4-1, 0x00408900 ; Double Fault TSS - times MAX_CPUS dd 26*4-1, 0x00408900 + dd 26*4-1, 0x00408900 ; 28 Double Fault TSS + times MAX_CPUS dd 26*4-1, 0x00408900 ; 30+ TSSes [global gGDTPtr] gGDTPtr: dw GDT_SIZE-1 dd gGDT ; IDT 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 @@ -51,21 +53,24 @@ Desctab_Install: jmp 0x08:.pl0code .pl0code: - ; Set IDT + ; Set up IDT %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 +%macro SET_USER 1 + or WORD [gIDT + %1*8 + 4], 0x6000 +%endmacro +%macro SET_TRAP 1 + or WORD [gIDT + %1*8 + 4], 0x0100 %endmacro + %assign i 0 %rep 32 SETISR i @@ -73,8 +78,15 @@ Desctab_Install: %endrep SETISR 0xAC - SETUSER 0xAC + SET_USER 0xAC + SET_TRAP 0xAC ; Interruptable + %if USE_MP + SETISR 0xEE ; 0xEE Timer + SETISR 0xEF ; 0xEF Spurious Interrupt + %endif + + ; IRQs %assign i 0xF0 %rep 16 SETISR i @@ -129,7 +141,7 @@ Isr%1: %macro ISR_NOERR 1 [global Isr%1] Isr%1: - xchg bx, bx + ;xchg bx, bx push 0 push %1 jmp ErrorCommon @@ -146,7 +158,6 @@ Isr%1: %macro DEF_IRQ 1 [global Isr%1] Isr%1: - ;cli ; HACK! push 0 push %1 jmp IRQCommon @@ -187,12 +198,36 @@ ISR_NOERR 31; 31: Reserved DEF_SYSCALL 0xAC ; Acess System Call +%if USE_MP +[global Isr0xEE] +[extern SchedulerBase] +; 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 ; This is reset once the bus speed has been calculated + %else jmp SchedulerBase + %endif ; - Assignable %assign i 0xF1 %rep 16 @@ -205,12 +240,19 @@ Isr240: ; --------------------- [extern ErrorHandler] ErrorCommon: + ;xchg bx, bx ; MAGIC BREAK pusha push ds push es push fs push gs + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + push esp call ErrorHandler add esp, 4 @@ -250,6 +292,7 @@ SyscallCommon: ; IRQ Handling ; ------------ [extern IRQ_Handler] +[global IRQCommon] IRQCommon: pusha push ds @@ -257,6 +300,12 @@ IRQCommon: push fs push gs + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + push esp call IRQ_Handler add esp, 4 @@ -268,34 +317,3 @@ IRQCommon: popa add esp, 8 ; Error Code and ID iret - -; -------------- -; Task Scheduler -; -------------- -[extern Proc_Scheduler] -SchedulerBase: - pusha - push ds - push es - push fs - push gs - - mov eax, [esp+12*4] ; CPU Number - push eax ; Pus as argument - - call Proc_Scheduler - - add esp, 4 ; Remove Argument - - pop gs - pop fs - pop es - pop ds - - mov dx, 0x20 - mov al, 0x20 - out dx, al ; ACK IRQ - popa - add esp, 4 ; CPU ID - ; No Error code / int num - iret