X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fstart.asm;h=b98a0165a935a5638ef58526916990d6dd944e95;hb=7a6a1cbc62289d64d604fb2cb204d21659c4905e;hp=ebf69f424f79e4388301a42906485ca69ebfe087;hpb=8d062ceb17eb6cfb2e3db8af6794d38391c245d3;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/start.asm b/Kernel/arch/x86/start.asm index ebf69f42..b98a0165 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] @@ -60,6 +94,7 @@ start: [extern gpMP_LocalAPIC] [extern gaAPIC_to_CPU] [extern gaCPUs] +[extern giNumInitingCPUs] lGDTPtr: ; Local GDT Pointer dw 2*8-1 dd gGDT-KERNEL_BASE @@ -99,6 +134,8 @@ 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: @@ -111,29 +148,24 @@ GetEIP: mov eax, [esp] ret -[extern Proc_Clone] -[extern Threads_Exit] -[global SpawnTask] -SpawnTask: - ; Call Proc_Clone with Flags=0 - xor eax, eax - push eax +; 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 - call Proc_Clone - add esp, 8 ; Remove arguments from stack - - test eax, eax - jnz .parent - - ; In child, so now set up stack frame - mov ebx, [esp+4] ; Child Function - mov edx, [esp+8] ; Argument - ; Child - push edx ; Argument - call ebx ; Function - call Threads_Exit ; Kill Thread + loop .top -.parent: + mov eax, [ebp+8] + call eax + lea esp, [ebp] + pop ebp ret [section .initpd]