+;
+; Acess2 x86_64 port
+;
+
+%include "arch/x86_64/include/common.inc.asm"
[BITS 32]
mov eax, gInitialPML4 - KERNEL_BASE
mov cr3, eax
- ; Enable long/compatability mode
+ ; Enable IA-32e mode
+ ; (Also enables SYSCALL and NX)
mov ecx, 0xC0000080
rdmsr
- or ax, 0x100
+ or eax, (1 << 11)|(1 << 8)|(1 << 0) ; NXE, LME, SCE
wrmsr
; Enable paging
mov eax, cr0
- or eax, 0x80000000
+ or eax, 0x80010000 ; PG & WP
mov cr0, eax
; Load GDT
jmp .loop
.hlt:
+ cli
+ hlt
jmp .hlt
[section .data]
dd 0,0
dd 0x00000000, 0x00209A00 ; 0x08: 64-bit Code
dd 0x00000000, 0x00009200 ; 0x10: 64-bit Data
- dd 0x00000000, 0x0020FA00 ; 0x18: 64-bit User Code
- dd 0x00000000, 0x0000F200 ; 0x20: 64-bit User Data
- dd 0x00000000, 0x0040FA00 ; 0x28: 32-bit User Code
- dd 0x00000000, 0x0040F200 ; 0x30: 32-bit User Data
+ dd 0x00000000, 0x0040FA00 ; 0x18: 32-bit User Code
+ dd 0x00000000, 0x0040F200 ; 0x20: User Data
+ dd 0x00000000, 0x0020FA00 ; 0x28: 64-bit User Code
+ dd 0x00000000, 0x0000F200 ; 0x30: User Data (64 version)
times MAX_CPUS dd 0, 0x00008900, 0, 0 ; 0x38+16*n: TSS 0
gGDTPtr:
dw $-gGDT-1
; Initial stack - 64KiB
dq 0
%assign i 0
- %rep 16-1
+ %rep INITIAL_KSTACK_SIZE-1
dd gInitialKernelStack - KERNEL_BASE + i*0x1000 + 0x103, 0
%assign i i+1
%endrep
- times 512-16 dq 0
+ times 512-INITIAL_KSTACK_SIZE dq 0
gInitialPT1: ; 2 MiB
%assign i 0
%rep 512
[section .padata]
[global gInitialKernelStack]
gInitialKernelStack:
- times 0x1000*(16-1) db 0 ; 16 Pages
+ times 0x1000*(INITIAL_KSTACK_SIZE-1) db 0 ; 8 Pages
[section .rodata]
csNot64BitCapable:
db "Not 64-bit Capable",0
+
+; vim: ft=nasm