Kernel/x86 - Debugging SMP bugs, lead to some fixes and cleanups
[tpg/acess2.git] / Kernel / arch / x86 / desctab.asm
index dc064f5..8c7d320 100644 (file)
@@ -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,17 +20,6 @@ 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
@@ -89,6 +56,7 @@ Desctab_Install:
        
        ; MP ISRs
        %if USE_MP
+       SETISR  0xED    ; 0xED Inter-processor HALT
        SETISR  0xEE    ; 0xEE Timer
        SETISR  0xEF    ; 0xEF Spurious Interrupt
        %endif
@@ -108,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
        
@@ -206,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  ; Line up with interrupt number
-       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]
@@ -249,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

UCC git Repository :: git.ucc.asn.au