From 96f377cc12baf1ab808925ac5ce7f3b3a9a2be19 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 17 Nov 2025 19:18:01 -0500 Subject: kern/amd64: Bring application cores to long mode Signed-off-by: Ian Moffett --- sys/arch/amd64/boot/apboot.asm | 54 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) (limited to 'sys/arch/amd64/boot') diff --git a/sys/arch/amd64/boot/apboot.asm b/sys/arch/amd64/boot/apboot.asm index b9c3ad7..8c16319 100644 --- a/sys/arch/amd64/boot/apboot.asm +++ b/sys/arch/amd64/boot/apboot.asm @@ -30,9 +30,57 @@ [bits 16] [org 0x1000] +%define AP_BUDA 0x3000 +%define IA32_EFER 0xC0000080 + +[bits 16] _start: - cli - hlt - jmp _start + mov al, 0xFF ;; Mask i8259 inputs + out 0x21, al ;; Disable master PIC + out 0xA1, al ;; Disable slave PIC + + mov eax, dword [AP_BUDA] ;; BUDA.CR3 -> EAX + mov cr3, eax ;; EAX -> CR3 + + mov eax, cr4 ;; CR4 -> EAX + or eax, 0xA0 ;; Enable physical address extension + PGE + mov cr4, eax ;; Write it back + + mov ecx, IA32_EFER ;; Read IA32_EFER + rdmsr ;; -> EAX + or eax, 0xD00 ;; Set EFER.LME + defaults + wrmsr ;; Write it back + + mov eax, cr0 ;; CR0 -> EAX + or eax, 0x80000001 ;; CR0 |= PG/PM + mov cr0, eax ;; Write it back + + lgdt [GDTR] + jmp 0x08:thunk64 + +GDT: +.NULL: + dq 0x0000000000000000 ;; NULL DESCRIPTOR +.CODE: ;; --------------- + dq 0x00209A0000000000 ;; CODE DESCRIPTOR +.DATA: ;; --------------- + dq 0x0000920000000000 ;; DATA DESCRIPTOR +GDTR: ;; --------------- + dw $ - GDT - 1 ;; LIMIT + dq GDT ;; OFFSET + +[bits 64] +thunk64: + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov ss, ax + xor ax, ax + mov gs, ax + mov rsp, qword [AP_BUDA + 0x08] + mov rbx, qword [AP_BUDA + 0x10] + cld + jmp rbx times 4096 - ($ - $$) db 0 -- cgit v1.2.3