SMP Work (APs now start, just seem to lock up on lgdt, or whatever is at that address)
[tpg/acess2.git] / Kernel / arch / x86 / start.asm
index 4dd7603..ebf69f4 100644 (file)
@@ -39,8 +39,6 @@ start:
        jmp ecx\r
 .higherHalf:\r
 \r
-       mov DWORD [gaInitPageDir], 0\r
-\r
        ; Call the kernel\r
        push ebx        ; Multiboot Info\r
        push eax        ; Multiboot Magic Value\r
@@ -56,22 +54,27 @@ start:
 ; Multiprocessing AP Startup Code (Must be within 0x10FFF0)\r
 ;\r
 %if USE_MP\r
-[extern gGDTptr]\r
+[extern gGDT]\r
+[extern gGDTPtr]\r
+[extern gIDTPtr]\r
 [extern gpMP_LocalAPIC]\r
 [extern gaAPIC_to_CPU]\r
 [extern gaCPUs]\r
-[global APStartup]\r
+lGDTPtr:       ; Local GDT Pointer\r
+       dw      2*8-1\r
+       dd      gGDT-KERNEL_BASE\r
 \r
 [bits 16]\r
+[global APStartup]\r
 APStartup:\r
        xchg bx, bx     ; MAGIC BREAK!\r
        mov ax, 0xFFFF\r
        mov ds, ax\r
-       lgdt [DWORD ds:gGDTptr-0xFFFF0]\r
+       lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]\r
        mov eax, cr0\r
        or      al, 1\r
        mov     cr0, eax\r
-       jmp 08h:DWORD .ProtectedMode\r
+       jmp 08h:DWORD .ProtectedMode-KERNEL_BASE\r
 [bits 32]\r
 .ProtectedMode:\r
        ; Start Paging\r
@@ -84,6 +87,10 @@ APStartup:
        lea eax, [.higherHalf]\r
        jmp eax\r
 .higherHalf:\r
+       ; Load True GDT & IDT\r
+       lgdt [gGDTPtr]\r
+       lidt [gIDTPtr]\r
+\r
        mov eax, [gpMP_LocalAPIC]\r
        mov DWORD [eax], 0\r
        xor ecx, ecx\r
@@ -93,6 +100,7 @@ APStartup:
        ; CL is now the CPU ID\r
        mov BYTE [gaCPUs+ecx*8+1], 1\r
        ; CPU is now marked as initialised\r
+       sti\r
 .hlt:\r
        hlt\r
        jmp .hlt\r

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