[section .text]
[global start]
start:
+ mov [gMultibootMagic - KERNEL_BASE], eax
+ mov [gMultibootPtr - KERNEL_BASE], ebx
+
; Check for Long Mode support
+ mov eax, 0x80000000
+ cpuid
+ cmp eax, 0x80000001 ; Compare the A-register with 0x80000001.
mov eax, 0x80000001
cpuid
+ jb .not64bitCapable
test edx, 1<<29
jz .not64bitCapable
; Load GDT
lgdt [gGDTPtr - KERNEL_BASE]
- mov ax, 0x10
- mov ss, ax
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
-
jmp 0x08:start64 - KERNEL_BASE
.not64bitCapable:
[global gGDT]
gGDT:
dd 0,0
- dd 0x00000000, 0x00209800 ; 0x08: 64-bit Code
- dd 0x00000000, 0x00009000 ; 0x10: 64-bit Data
- dd 0x00000000, 0x00209800 ; 0x18: 64-bit User Code
- dd 0x00000000, 0x00209000 ; 0x20: 64-bit User Data
- dd 0x00000000, 0x00209800 ; 0x38: 32-bit User Code
- dd 0x00000000, 0x00209000 ; 0x30: 32-bit User Data
- times MAX_CPUS dd 0, 0, 0, 0 ; 0x38+16*n: TSS 0
+ dd 0x00000000, 0x00209A00 ; 0x08: 64-bit Code
+ dd 0x00000000, 0x00009200 ; 0x10: 64-bit Data
+ dd 0x00000000, 0x0020FA00 ; 0x18: 64-bit User Code
+ dd 0x00000000, 0x0000F200 ; 0x20: 64-bit User Data
+ dd 0x00000000, 0x0040FA00 ; 0x38: 32-bit User Code
+ dd 0x00000000, 0x0040F200 ; 0x30: 32-bit User Data
+ times MAX_CPUS dd 0, 0x00008900, 0, 0 ; 0x38+16*n: TSS 0
gGDTPtr:
dw $-gGDT-1
dd gGDT-KERNEL_BASE
dd 0
+[global gMultibootPtr]
+[global gMultibootMagic]
+gMultibootMagic:
+ dd 0
+gMultibootPtr:
+ dd 0
[section .padata]
[global gInitialPML4]
dd gInitialPDP - KERNEL_BASE + 3, 0 ; Identity Map Low 4Mb
times 256-1 dq 0
dd gInitialPDP - KERNEL_BASE + 3, 0 ; Map Low 4Mb to kernel base
- times 256-1-2 dq 0
+ times 256-1-4 dq 0
dd gInitialPML4 - KERNEL_BASE + 3, 0 ; Fractal Mapping
dq 0
+ dq 0
+ dq 0
gInitialPDP: ; Covers 512 GiB
dd gInitialPD - KERNEL_BASE + 3, 0