X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fstart.asm;h=d9a1e500ea6d8316cf28c38e6208023dc2bc122c;hb=04b10ec9d26122069ed497cc0035e3a5f20f9197;hp=e1cc70ad12b73174d642118635daf6f94a81b47f;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/start.asm b/Kernel/arch/x86/start.asm index e1cc70ad..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,31 +23,60 @@ 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] +[extern kmain] [global start] start: ; Set up stack - mov esp, _Kernel_Stack_Top + mov esp, Kernel_Stack_Top ; Start Paging - mov ecx, _gaInitPageDir - KERNEL_BASE + mov ecx, gaInitPageDir - KERNEL_BASE mov cr3, ecx mov ecx, cr0 - or ecx, 0x80000000 + or ecx, 0x80010000 ; PG and WP mov cr0, ecx lea ecx, [.higherHalf] jmp ecx .higherHalf: - mov DWORD [_gaInitPageDir], 0 - ; Call the kernel push ebx ; Multiboot Info push eax ; Multiboot Magic Value - call _kmain + call kmain ; Halt the Machine cli @@ -52,20 +84,99 @@ start: hlt jmp .hlt -[global _GetEIP] -_GetEIP: +; +; Multiprocessing AP Startup Code (Must be within 0x10FFF0) +; +%if USE_MP +[extern gGDT] +[extern gGDTPtr] +[extern gIDTPtr] +[extern gpMP_LocalAPIC] +[extern gaAPIC_to_CPU] +[extern gaCPUs] +[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:lGDTPtr-KERNEL_BASE-0xFFFF0] + mov eax, cr0 + or al, 1 + mov cr0, eax + jmp 08h:DWORD .ProtectedMode-KERNEL_BASE +[bits 32] +.ProtectedMode: + ; Start Paging + mov eax, gaInitPageDir - KERNEL_BASE + mov cr3, eax + mov eax, cr0 + or eax, 0x80010000 ; PG and WP + mov cr0, eax + ; Jump to higher half + 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 + mov cl, BYTE [eax+0x10] + ; CL is now local APIC ID + 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 +%endif + +[global GetEIP] +GetEIP: mov eax, [esp] ret -[extern _Proc_Clone] -[extern _Proc_Exit] -[global _SpawnTask] -_SpawnTask: +; 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] +SpawnTask: ; Call Proc_Clone with Flags=0 xor eax, eax push eax push eax - call _Proc_Clone + call Proc_Clone add esp, 8 ; Remove arguments from stack test eax, eax @@ -77,29 +188,29 @@ _SpawnTask: ; Child push edx ; Argument call ebx ; Function - call _Proc_Exit ; Kill Thread + call Threads_Exit ; Kill Thread .parent: ret [section .initpd] -[global _gaInitPageDir] -[global _gaInitPageTable] +[global gaInitPageDir] +[global gaInitPageTable] align 0x1000 -_gaInitPageDir: - dd _gaInitPageTable-KERNEL_BASE+3 ; 0x00 +gaInitPageDir: + dd gaInitPageTable-KERNEL_BASE+3 ; 0x00 times 1024-256-1 dd 0 - dd _gaInitPageTable-KERNEL_BASE+3 ; 0xC0 + dd gaInitPageTable-KERNEL_BASE+3 ; 0xC0 times 256-1 dd 0 align 0x1000 -_gaInitPageTable: +gaInitPageTable: %assign i 0 %rep 1024 dd i*0x1000+3 %assign i i+1 %endrep -[global _Kernel_Stack_Top] +[global Kernel_Stack_Top] ALIGN 0x1000 times 1024 dd 0 -_Kernel_Stack_Top: +Kernel_Stack_Top: