X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fstart.asm;h=d9a1e500ea6d8316cf28c38e6208023dc2bc122c;hb=e617614d9e5ca900649d584524eacef768b1f1b9;hp=4dd760365c3bd8284af47d74614ce39f5300202e;hpb=d52a53f035af92941c0cafe5f81888fed16d2462;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/start.asm b/Kernel/arch/x86/start.asm index 4dd76036..d9a1e500 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 @@ -103,6 +148,26 @@ GetEIP: mov eax, [esp] ret +; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args) +; Call a function passing the array as arguments +[global CallWithArgArray] +CallWithArgArray: + push ebp + mov ebp, esp + mov ecx, [ebp+12] ; Get NArgs + mov edx, [ebp+16] + +.top: + mov eax, [edx+ecx*4-4] + push eax + loop .top + + mov eax, [ebp+8] + call eax + lea esp, [ebp] + pop ebp + ret + [extern Proc_Clone] [extern Threads_Exit] [global SpawnTask]