Many changes, Mostly working on improving the BootConf script engine.
[tpg/acess2.git] / Kernel / arch / x86 / start.asm
index 3da5075..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,31 +23,60 @@ 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
+[extern kmain]\r
 [global start]\r
 start:\r
        ; Set up stack\r
-       mov esp, _Kernel_Stack_Top\r
+       mov esp, Kernel_Stack_Top\r
        \r
        ; Start Paging\r
-       mov ecx, _gaInitPageDir - KERNEL_BASE\r
+       mov ecx, gaInitPageDir - KERNEL_BASE\r
        mov cr3, ecx\r
        \r
        mov ecx, cr0\r
-       or      ecx, 0x80000000\r
+       or      ecx, 0x80010000 ; PG and WP\r
        mov cr0, ecx\r
        \r
        lea ecx, [.higherHalf]\r
        jmp ecx\r
 .higherHalf:\r
 \r
-       mov DWORD [_gaInitPageDir], 0\r
-\r
        ; Call the kernel\r
        push ebx        ; Multiboot Info\r
        push eax        ; Multiboot Magic Value\r
-       call _kmain
+       call kmain
 
        ; Halt the Machine\r
        cli\r
@@ -52,20 +84,99 @@ start:
        hlt\r
        jmp .hlt\r
 \r
-[global _GetEIP]\r
-_GetEIP:\r
+; \r
+; Multiprocessing AP Startup Code (Must be within 0x10FFF0)\r
+;\r
+%if USE_MP\r
+[extern gGDT]\r
+[extern gGDTPtr]\r
+[extern gIDTPtr]\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
+\r
+[bits 16]\r
+[global APStartup]\r
+APStartup:\r
+       xchg bx, bx     ; MAGIC BREAK!\r
+       mov ax, 0xFFFF\r
+       mov ds, ax\r
+       lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]\r
+       mov eax, cr0\r
+       or      al, 1\r
+       mov     cr0, eax\r
+       jmp 08h:DWORD .ProtectedMode-KERNEL_BASE\r
+[bits 32]\r
+.ProtectedMode:\r
+       ; Start Paging\r
+       mov eax, gaInitPageDir - KERNEL_BASE\r
+       mov cr3, eax\r
+       mov eax, cr0\r
+       or      eax, 0x80010000 ; PG and WP\r
+       mov cr0, eax\r
+       ; Jump to higher half\r
+       lea eax, [.higherHalf]\r
+       jmp eax\r
+.higherHalf:\r
+       ; Load True GDT & IDT\r
+       lgdt [gGDTPtr]\r
+       lidt [gIDTPtr]\r
+\r
+       mov eax, [gpMP_LocalAPIC]\r
+       mov DWORD [eax], 0\r
+       xor ecx, ecx\r
+       mov cl, BYTE [eax+0x10]\r
+       ; CL is now local APIC ID\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
+       hlt\r
+       jmp .hlt\r
+%endif\r
+\r
+[global GetEIP]\r
+GetEIP:\r
        mov eax, [esp]\r
        ret\r
 \r
-[extern _Proc_Clone]\r
-[extern _Threads_Exit]\r
-[global _SpawnTask]\r
-_SpawnTask:\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
+SpawnTask:\r
        ; Call Proc_Clone with Flags=0\r
        xor eax, eax\r
        push eax
        push eax\r
-       call _Proc_Clone\r
+       call Proc_Clone\r
        add esp, 8      ; Remove arguments from stack\r
        \r
        test eax, eax\r
@@ -77,29 +188,29 @@ _SpawnTask:
        ; Child\r
        push edx        ; Argument\r
        call ebx        ; Function\r
-       call _Threads_Exit      ; Kill Thread\r
+       call Threads_Exit       ; Kill Thread\r
        \r
 .parent:\r
        ret\r
 \r
 [section .initpd]\r
-[global _gaInitPageDir]\r
-[global _gaInitPageTable]\r
+[global gaInitPageDir]\r
+[global gaInitPageTable]\r
 align 0x1000\r
-_gaInitPageDir:\r
-       dd      _gaInitPageTable-KERNEL_BASE+3  ; 0x00\r
+gaInitPageDir:\r
+       dd      gaInitPageTable-KERNEL_BASE+3   ; 0x00\r
        times 1024-256-1        dd      0\r
-       dd      _gaInitPageTable-KERNEL_BASE+3  ; 0xC0\r
+       dd      gaInitPageTable-KERNEL_BASE+3   ; 0xC0\r
        times 256-1     dd      0\r
 align 0x1000\r
-_gaInitPageTable:\r
+gaInitPageTable:\r
        %assign i 0\r
        %rep 1024\r
        dd      i*0x1000+3\r
        %assign i i+1\r
        %endrep\r
-[global _Kernel_Stack_Top]\r
+[global Kernel_Stack_Top]\r
 ALIGN 0x1000\r
        times 1024      dd      0\r
-_Kernel_Stack_Top:\r
+Kernel_Stack_Top:\r
        

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