summaryrefslogtreecommitdiff
path: root/src/bootloader/enter_kernel.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootloader/enter_kernel.asm')
-rw-r--r--src/bootloader/enter_kernel.asm13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/bootloader/enter_kernel.asm b/src/bootloader/enter_kernel.asm
index c9991e3..d3933cf 100644
--- a/src/bootloader/enter_kernel.asm
+++ b/src/bootloader/enter_kernel.asm
@@ -1,5 +1,6 @@
[extern main]
[extern _kernel_stack_loc]
+[extern _stage1_pagetable]
enter_longmode:
cli
@@ -29,7 +30,7 @@ mov es, ax
mov fs, ax
mov gs, ax
-mov edi, 0x4000 ; 0x3000
+mov edi, _stage1_pagetable ; 0x3000
mov cr3, edi
mov eax, 0
mov ecx, 0xc00 ; 0x1000
@@ -37,14 +38,14 @@ rep stosd
mov edi, cr3
-mov DWORD [edi], 0x5003 ; pml4e[0] = pdpe
+mov DWORD [edi], _stage1_pagetable + 0x1003 ; pml4e[0] = pdpe
add edi, 0x1000
-mov DWORD [edi], 0x6003 ; pdpe[0] = pde
+mov DWORD [edi], _stage1_pagetable + 0x2003 ; pdpe[0] = pde
add edi, 0x1000
mov DWORD [edi], 0x83 ; pde[0] = pte
mov eax, cr4
-or eax, 1 << 5
+or eax, 0x620
mov cr4, eax
;end of setting up pages
@@ -65,9 +66,11 @@ or eax, 1 << 8
wrmsr
mov eax, cr0
-or eax, 1 << 31
+and ax, 0xfffb
+or eax, 0x80000002
mov cr0, eax
+
lgdt [long_gdt.descriptor]
jmp LONG_CODE_SEGMENT:enter_kernel