[extern kmain]
[global start]
start:
+ ; Just show we're here
+ mov WORD [0xB8000], 0x0741 ; 'A'
; Set up stack
mov esp, Kernel_Stack_Top
mov cr3, ecx
mov ecx, cr0
- or ecx, 0x80010000 ; PG and WP
+ or ecx, 0x80010000 ; PG and WP
mov cr0, ecx
+ mov WORD [0xB8002], 0x0763 ; 'c'
+ mov WORD [0xB8004], 0x0765 ; 'e'
+
lea ecx, [.higherHalf]
jmp ecx
.higherHalf:
+
+ mov WORD [0xB8006], 0x0773 ; 's'
+ mov WORD [0xB8008], 0x0773 ; 's'
; Call the kernel
push ebx ; Multiboot Info
push eax ; Multiboot Magic Value
+ mov WORD [0xB800A], 0x0732 ; '2'
call kmain
; Halt the Machine
jmp .hlt
;
-; Multiprocessing AP Startup Code (Must be within 0x10FFF0)
+; Multiprocessing AP Startup Code (Must be within 0 - 0x10FFF0)
;
%if USE_MP
[extern gGDT]
[global APStartup]
APStartup:
;xchg bx, bx ; MAGIC BREAK!
+ ; Load initial GDT
mov ax, 0xFFFF
mov ds, ax
lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]
+ ; Enable PMode in CR0
mov eax, cr0
- or al, 1
- mov cr0, eax
+ or al, 1
+ mov cr0, eax
+ ; Jump into PMode
jmp 08h:DWORD .ProtectedMode-KERNEL_BASE
[bits 32]
.ProtectedMode:
mov eax, gaInitPageDir - KERNEL_BASE
mov cr3, eax
mov eax, cr0
- or eax, 0x80010000 ; PG and WP
+ or eax, 0x80010000 ; PG and WP
mov cr0, eax
; Jump to higher half
lea eax, [.higherHalf]
[section .initpd]
[global gaInitPageDir]
[global gaInitPageTable]
-align 0x1000
+align 4096
gaInitPageDir:
- dd gaInitPageTable-KERNEL_BASE+3 ; 0x00
- times 1024-256-1 dd 0
- dd gaInitPageTable-KERNEL_BASE+3 ; 0xC0
- times 256-1 dd 0
-align 0x1000
+ dd gaInitPageTable-KERNEL_BASE+3 ; 0x000 - Low kernel
+ times 0x300-0x000-1 dd 0
+ dd gaInitPageTable-KERNEL_BASE+3 ; 0xC00 - High kernel
+ times 0x3F0-0x300-1 dd 0
+ dd gaInitPageDir-KERNEL_BASE+3 ; 0xFC0 - Fractal
+ times 0x400-0x3F0-1 dd 0
+align 4096
gaInitPageTable:
%assign i 0
%rep 1024
%assign i i+1
%endrep
[global Kernel_Stack_Top]
-ALIGN 0x1000
+ALIGN 4096
times 1024 dd 0
Kernel_Stack_Top:
gInitAPStacks: