X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fstart.asm;h=b1884aeff516ee77c5d897a2a955ac35d8d35c4a;hb=049de1f2533477716a12a708c097b199eaa8fb6c;hp=4dd760365c3bd8284af47d74614ce39f5300202e;hpb=d52a53f035af92941c0cafe5f81888fed16d2462;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/start.asm b/Kernel/arch/x86/start.asm index 4dd76036..b1884aef 100644 --- a/Kernel/arch/x86/start.asm +++ b/Kernel/arch/x86/start.asm @@ -5,6 +5,9 @@ KERNEL_BASE equ 0xC0000000 +[extern __load_addr] +[extern __bss_start] +[extern gKernelEnd] [section .multiboot] mboot: ; Multiboot macros to make a few lines later more readable @@ -20,6 +23,37 @@ mboot: dd MULTIBOOT_CHECKSUM dd mboot - KERNEL_BASE ;Location of Multiboot Header +; Multiboot 2 Header +mboot2: + MULTIBOOT2_HEADER_MAGIC equ 0xE85250D6 + MULTIBOOT2_HEADER_ARCH equ 0 + MULTIBOOT2_HEADER_LENGTH equ (mboot2_end-mboot2) + MULTIBOOT2_CHECKSUM equ -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_HEADER_ARCH + MULTIBOOT2_HEADER_LENGTH) + + dd MULTIBOOT2_HEADER_MAGIC + dd MULTIBOOT2_HEADER_ARCH + dd MULTIBOOT2_HEADER_LENGTH + dd MULTIBOOT2_CHECKSUM + ; MBoot2 Address Header + dw 2, 0 + dd 8 + 16 + dd mboot2 ; Location of Multiboot Header + dd __load_addr - KERNEL_BASE ; Kernel Load base + dd __bss_start - KERNEL_BASE ; Kernel Data End + dd gKernelEnd - KERNEL_BASE ; Kernel BSS End + ; MBoot2 Entry Point Tag + dw 3, 0 + dd 8 + 4 + dd start - KERNEL_BASE + ; MBoot2 Module Alignment Tag + dw 6, 0 + dd 12 ; ??? + dd 0 ; Search me, seems it wants padding + ; Terminator + dw 0, 0 + dd 8 +mboot2_end: + [section .text] [extern kmain] [global start] @@ -39,8 +73,6 @@ start: jmp ecx .higherHalf: - mov DWORD [gaInitPageDir], 0 - ; Call the kernel push ebx ; Multiboot Info push eax ; Multiboot Magic Value @@ -56,22 +88,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 +122,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 +134,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