\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
+[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
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 _Proc_Exit]\r
-[global _SpawnTask]\r
-_SpawnTask:\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
; Child\r
push edx ; Argument\r
call ebx ; Function\r
- call _Proc_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