X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fstart.asm;h=f1d1ea7467ab15ad1b8c75101a3bc0b5ee197b82;hb=1c2a87ec67d332b6a165c79398693eac1eb1166e;hp=4dd760365c3bd8284af47d74614ce39f5300202e;hpb=d52a53f035af92941c0cafe5f81888fed16d2462;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/start.asm b/Kernel/arch/x86/start.asm index 4dd76036..f1d1ea74 100644 --- a/Kernel/arch/x86/start.asm +++ b/Kernel/arch/x86/start.asm @@ -39,8 +39,6 @@ start: jmp ecx .higherHalf: - mov DWORD [gaInitPageDir], 0 - ; Call the kernel push ebx ; Multiboot Info push eax ; Multiboot Magic Value @@ -56,22 +54,28 @@ start: ; Multiprocessing AP Startup Code (Must be within 0x10FFF0) ; %if USE_MP -[extern gGDTptr] +[extern gGDT] +[extern gGDTPtr] +[extern gIDTPtr] [extern gpMP_LocalAPIC] [extern gaAPIC_to_CPU] [extern gaCPUs] -[global APStartup] +[extern giNumInitingCPUs] +lGDTPtr: ; Local GDT Pointer + dw 2*8-1 + dd gGDT-KERNEL_BASE [bits 16] +[global APStartup] APStartup: xchg bx, bx ; MAGIC BREAK! mov ax, 0xFFFF mov ds, ax - lgdt [DWORD ds:gGDTptr-0xFFFF0] + lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0] mov eax, cr0 or al, 1 mov cr0, eax - jmp 08h:DWORD .ProtectedMode + jmp 08h:DWORD .ProtectedMode-KERNEL_BASE [bits 32] .ProtectedMode: ; Start Paging @@ -84,6 +88,10 @@ APStartup: lea eax, [.higherHalf] jmp eax .higherHalf: + ; Load True GDT & IDT + lgdt [gGDTPtr] + lidt [gIDTPtr] + mov eax, [gpMP_LocalAPIC] mov DWORD [eax], 0 xor ecx, ecx @@ -92,7 +100,10 @@ APStartup: mov cl, BYTE [gaAPIC_to_CPU+ecx] ; CL is now the CPU ID mov BYTE [gaCPUs+ecx*8+1], 1 + ; Decrement the remaining CPU count + dec DWORD [giNumInitingCPUs] ; CPU is now marked as initialised + sti .hlt: hlt jmp .hlt