75 lines
1 KiB
NASM
75 lines
1 KiB
NASM
extern gdt_ptr
|
|
|
|
section .data
|
|
align 4096
|
|
gdt_limit dw 64
|
|
gdt_base dd 0
|
|
|
|
base_phys dq 0
|
|
|
|
section .text
|
|
global x86enter64
|
|
|
|
x86enter64:
|
|
; [esp+4] - base phys addr
|
|
mov ebx,[esp+4]
|
|
mov dword [base_phys],ebx
|
|
xor eax,eax
|
|
mov dword [base_phys+4],eax
|
|
|
|
;cli
|
|
; Disable paging
|
|
mov eax,cr0
|
|
and eax,0x7FFFFFFF
|
|
mov cr0,eax
|
|
; Enable PAE
|
|
mov eax,cr4
|
|
or eax,(1<<5)
|
|
mov cr4,eax
|
|
; Setup CR3
|
|
mov eax,dword [base_phys]
|
|
add eax,0x1000
|
|
mov cr3,eax
|
|
; Enter Long Mode
|
|
mov ecx,0xC0000080
|
|
rdmsr
|
|
or eax,(1<<8)
|
|
wrmsr
|
|
; Enable paging
|
|
mov eax,cr0
|
|
or eax,0x80000000
|
|
mov cr0,eax
|
|
; Enable Write-Protect
|
|
mov eax,cr0
|
|
or eax,(1<<16)
|
|
mov cr0,eax
|
|
; Setup GDT
|
|
mov eax,dword [base_phys]
|
|
mov dword [gdt_base],eax
|
|
|
|
lgdt [gdt_limit]
|
|
; Jump!
|
|
|
|
jmp 0x08:_kernel_64
|
|
|
|
;db 0xEA
|
|
;dd _kernel_64
|
|
;dw 8
|
|
use64
|
|
align 4096
|
|
_kernel_64:
|
|
mov ax,0x10
|
|
mov ds,ax
|
|
mov ss,ax
|
|
mov es,ax
|
|
mov fs,ax
|
|
mov gs,ax
|
|
|
|
mov rax,base_phys
|
|
mov rax,qword [rax]
|
|
mov rdi,rax
|
|
add rax,96
|
|
mov rax,qword [rax] ; ELF ptr
|
|
mov rax,qword [rax+24]
|
|
|
|
jmp rax
|