lenochka/loader/x86enter64.asm
2019-03-29 00:27:42 +02:00

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