X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fdesctab.asm;h=8c7d320eba90201412fb483ab031b82a5741816e;hb=a20cfd571f504f5c7f2d29516442a12c200441d5;hp=4223e6f18f199a2d9dadd3b9e3669defb9fd349f;hpb=3998cfbbadb005bf3ad52ea2538dc21f82864ddc;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/desctab.asm b/Kernel/arch/x86/desctab.asm index 4223e6f1..8c7d320e 100644 --- a/Kernel/arch/x86/desctab.asm +++ b/Kernel/arch/x86/desctab.asm @@ -3,30 +3,8 @@ ; desctab.asm [BITS 32] -%if USE_MP -MAX_CPUS equ 8 -%else -MAX_CPUS equ 1 -%endif -GDT_SIZE equ (1+2*2+1+MAX_CPUS)*8 [section .data] -; GDT -[global gGDT] -gGDT: - ; PL0 - Kernel - ; PL3 - User - dd 0x00000000, 0x00000000 ; 00 NULL Entry - dd 0x0000FFFF, 0x00CF9A00 ; 08 PL0 Code - dd 0x0000FFFF, 0x00CF9200 ; 10 PL0 Data - dd 0x0000FFFF, 0x00CFFA00 ; 18 PL3 Code - dd 0x0000FFFF, 0x00CFF200 ; 20 PL3 Data - 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] @@ -42,18 +20,9 @@ gIDTPtr: [global Desctab_Install] Desctab_Install: - ; Set GDT - lgdt [gGDTPtr] - mov ax, 0x10 ; PL0 Data - mov ss, ax - mov ds, ax - mov es, ax - mov gs, ax - mov fs, ax - jmp 0x08:.pl0code -.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,24 +33,30 @@ 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 0xED ; 0xED Inter-processor HALT SETISR 0xEE ; 0xEE Timer SETISR 0xEF ; 0xEF Spurious Interrupt %endif @@ -101,27 +76,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 @@ -199,12 +174,21 @@ ISR_NOERR 31; 31: Reserved DEF_SYSCALL 0xAC ; Acess System Call %if USE_MP +[global Isr0xED] +; 0xED - Interprocessor HALT +Isr0xED: + cli +.jmp: hlt + jmp .jmp + [global Isr0xEE] [extern SchedulerBase] ; AP's Timer Interrupt Isr0xEE: - push 0 - xchg bx, bx ; MAGIC BREAK + push eax ; Line up with interrupt number + mov eax, dr1 ; CPU Number + push eax + mov eax, [esp-4] ; Load EAX back jmp SchedulerBase ; Spurious Interrupt [global Isr0xEF] @@ -220,7 +204,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 @@ -241,12 +226,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 @@ -280,6 +271,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 +296,8 @@ SyscallCommon: ; ------------ [extern IRQ_Handler] [global IRQCommon] +[global IRQCommon_handled] +IRQCommon_handled equ IRQCommon.handled IRQCommon: pusha push ds @@ -308,6 +313,7 @@ IRQCommon: push esp call IRQ_Handler +.handled: add esp, 4 pop gs