\r
KERNEL_BASE equ 0xC0000000\r
\r
+[extern __load_addr]\r
+[extern __bss_start]\r
+[extern gKernelEnd]\r
[section .multiboot]\r
mboot:\r
; Multiboot macros to make a few lines later more readable\r
dd MULTIBOOT_CHECKSUM\r
dd mboot - KERNEL_BASE ;Location of Multiboot Header\r
\r
+; Multiboot 2 Header\r
+mboot2:\r
+ MULTIBOOT2_HEADER_MAGIC equ 0xE85250D6\r
+ MULTIBOOT2_HEADER_ARCH equ 0\r
+ MULTIBOOT2_HEADER_LENGTH equ (mboot2_end-mboot2)\r
+ MULTIBOOT2_CHECKSUM equ -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_HEADER_ARCH + MULTIBOOT2_HEADER_LENGTH)\r
+ \r
+ dd MULTIBOOT2_HEADER_MAGIC\r
+ dd MULTIBOOT2_HEADER_ARCH\r
+ dd MULTIBOOT2_HEADER_LENGTH\r
+ dd MULTIBOOT2_CHECKSUM\r
+ ; MBoot2 Address Header\r
+ dw 2, 0\r
+ dd 8 + 16\r
+ dd mboot2 ; Location of Multiboot Header\r
+ dd __load_addr - KERNEL_BASE ; Kernel Load base\r
+ dd __bss_start - KERNEL_BASE ; Kernel Data End\r
+ dd gKernelEnd - KERNEL_BASE ; Kernel BSS End\r
+ ; MBoot2 Entry Point Tag\r
+ dw 3, 0\r
+ dd 8 + 4\r
+ dd start - KERNEL_BASE\r
+ ; MBoot2 Module Alignment Tag\r
+ dw 6, 0\r
+ dd 12 ; ???\r
+ dd 0 ; Search me, seems it wants padding\r
+ ; Terminator\r
+ dw 0, 0\r
+ dd 8\r
+mboot2_end:\r
+ \r
[section .text]\r
[extern kmain]\r
[global start]\r
[extern gpMP_LocalAPIC]\r
[extern gaAPIC_to_CPU]\r
[extern gaCPUs]\r
+[extern giNumInitingCPUs]\r
lGDTPtr: ; Local GDT Pointer\r
dw 2*8-1\r
dd gGDT-KERNEL_BASE\r
mov cl, BYTE [gaAPIC_to_CPU+ecx]\r
; CL is now the CPU ID\r
mov BYTE [gaCPUs+ecx*8+1], 1\r
+ ; Decrement the remaining CPU count\r
+ dec DWORD [giNumInitingCPUs]\r
; CPU is now marked as initialised\r
sti\r
.hlt:\r
mov eax, [esp]\r
ret\r
\r
-[extern Proc_Clone]\r
-[extern Threads_Exit]\r
-[global SpawnTask]\r
-SpawnTask:\r
- ; Call Proc_Clone with Flags=0\r
- xor eax, eax\r
- push eax
+; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)\r
+; Call a function passing the array as arguments\r
+[global CallWithArgArray]\r
+CallWithArgArray:\r
+ push ebp\r
+ mov ebp, esp\r
+ mov ecx, [ebp+12] ; Get NArgs\r
+ mov edx, [ebp+16]\r
+\r
+.top:\r
+ mov eax, [edx+ecx*4-4]\r
push eax\r
- call Proc_Clone\r
- add esp, 8 ; Remove arguments from stack\r
- \r
- test eax, eax\r
- jnz .parent\r
- \r
- ; In child, so now set up stack frame\r
- mov ebx, [esp+4] ; Child Function\r
- mov edx, [esp+8] ; Argument\r
- ; Child\r
- push edx ; Argument\r
- call ebx ; Function\r
- call Threads_Exit ; Kill Thread\r
+ loop .top\r
\r
-.parent:\r
+ mov eax, [ebp+8]\r
+ call eax\r
+ lea esp, [ebp]\r
+ pop ebp\r
ret\r
\r
[section .initpd]\r