Files
2020-02-04 12:45:15 +02:00

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