Cleaning up more Log( calls with Log_*(
[tpg/acess2.git] / Kernel / arch / x86 / start.asm
index ebf69f4..d9a1e50 100644 (file)
@@ -5,6 +5,9 @@
 \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
@@ -20,6 +23,37 @@ mboot:
     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
@@ -60,6 +94,7 @@ start:
 [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
@@ -99,6 +134,8 @@ APStartup:
        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
@@ -111,6 +148,26 @@ GetEIP:
        mov eax, [esp]\r
        ret\r
 \r
+; 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
+       loop .top\r
+       \r
+       mov eax, [ebp+8]\r
+       call eax\r
+       lea esp, [ebp]\r
+       pop ebp\r
+       ret\r
+\r
 [extern Proc_Clone]\r
 [extern Threads_Exit]\r
 [global SpawnTask]\r

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