Fixed the EnvP array passed to Proc_StartUser not being NULL terminated
[tpg/acess2.git] / Kernel / arch / x86 / start.asm
index b1884ae..8b3e18c 100644 (file)
@@ -10,30 +10,30 @@ KERNEL_BASE equ 0xC0000000
 [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
@@ -148,29 +148,24 @@ GetEIP:
        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

UCC git Repository :: git.ucc.asn.au