111 lines
1.9 KiB
NASM
111 lines
1.9 KiB
NASM
; vi: ft=asm :
|
|
org 0x7000
|
|
bits 16
|
|
|
|
; Application processor bootstrapping code
|
|
; --------------------------------------------
|
|
; Parameters passed to us from BSP:
|
|
; 0x7FC0 Kernel PML4 physical address
|
|
; 0x7FC8 GDTR physical address
|
|
; 0x7FD0 ----
|
|
; 0x7FD8 Kernel AP core entrypoint
|
|
; 0x7FE0 Kernel AP stack
|
|
; --------------------------------------------
|
|
|
|
ap_startup:
|
|
cli
|
|
|
|
mov ax, 0
|
|
mov ds, ax
|
|
|
|
; Disable NMI
|
|
in al, 0x70
|
|
or al, 0x80
|
|
out 0x70, al
|
|
|
|
; Load protected-mode GDT
|
|
lgdt [ap_prot_gdtr]
|
|
mov eax, cr0
|
|
or al, 1
|
|
mov cr0, eax
|
|
|
|
jmp 0x08:ap_startup_prot
|
|
|
|
bits 32
|
|
ap_startup_prot:
|
|
cli
|
|
|
|
mov eax, 0x10
|
|
mov ds, eax
|
|
|
|
; Enable PAE, PSE
|
|
mov eax, cr4
|
|
or eax, (1 << 5) | (1 << 4)
|
|
mov cr4, eax
|
|
|
|
; Load cr3 = PML4
|
|
mov eax, dword [0x7FC0]
|
|
mov cr3, eax
|
|
|
|
; Enable EFER.LME
|
|
mov ecx, 0xC0000080
|
|
rdmsr
|
|
or eax, 1 << 8
|
|
wrmsr
|
|
|
|
; Enable paging
|
|
mov eax, cr0
|
|
or eax, 1 << 31
|
|
mov cr0, eax
|
|
|
|
; Load long-mode GDT (will be reloaded with upper address)
|
|
mov eax, [0x7FC8]
|
|
lgdt [eax]
|
|
|
|
jmp 0x08:ap_startup_long
|
|
|
|
bits 64
|
|
align 8
|
|
ap_startup_long:
|
|
mov rax, 0x10
|
|
mov ds, rax
|
|
|
|
; Reload GDT from upper memory pointer
|
|
mov rax, [0x7FC8]
|
|
mov rcx, 0xFFFFFF0000000000
|
|
add rax, rcx
|
|
|
|
lgdt [rax]
|
|
mov ax, 0x28
|
|
ltr ax
|
|
|
|
mov rax, 0x10
|
|
mov ds, rax
|
|
mov ss, rax
|
|
mov es, rax
|
|
mov fs, rax
|
|
mov gs, rax
|
|
|
|
; Load stack
|
|
mov rsp, qword [0x7FE0]
|
|
mov rbp, rsp
|
|
|
|
; Jump to kernel entry
|
|
mov rax, qword [0x7FD8]
|
|
jmp rax
|
|
|
|
; Protected-mode GDT
|
|
align 4
|
|
ap_prot_gdt:
|
|
; 0x00 - Null
|
|
dq 0
|
|
; 0x08 - Code: 32-bit, ex, pr, sys
|
|
dq 0xCF98000000FFFF
|
|
; 0x10 - Data: 32-bit, rw, pr, sys
|
|
dq 0xCF92000000FFFF
|
|
ap_prot_gdt_end:
|
|
|
|
ap_prot_gdtr:
|
|
dw ap_prot_gdt_end - ap_prot_gdt - 1
|
|
dd ap_prot_gdt
|