[extern gKernelEnd]\r
[section .multiboot]\r
mboot:\r
- ; Multiboot macros to make a few lines later more readable\r
- MULTIBOOT_PAGE_ALIGN equ 1<<0\r
- MULTIBOOT_MEMORY_INFO equ 1<<1\r
- MULTIBOOT_HEADER_MAGIC equ 0x1BADB002\r
- MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO\r
- MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)\r
+ ; Multiboot macros to make a few lines later more readable\r
+ MULTIBOOT_PAGE_ALIGN equ 1<<0\r
+ MULTIBOOT_MEMORY_INFO equ 1<<1\r
+ MULTIBOOT_HEADER_MAGIC equ 0x1BADB002\r
+ MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO\r
+ MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)\r
\r
- ; This is the GRUB Multiboot header. A boot signature\r
- dd MULTIBOOT_HEADER_MAGIC\r
- dd MULTIBOOT_HEADER_FLAGS\r
- dd MULTIBOOT_CHECKSUM\r
+ ; This is the GRUB Multiboot header. A boot signature\r
+ dd MULTIBOOT_HEADER_MAGIC\r
+ dd MULTIBOOT_HEADER_FLAGS\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
+ 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
+ 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
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