diff options
Diffstat (limited to 'src/bootloader/enter_kernel.asm')
-rw-r--r-- | src/bootloader/enter_kernel.asm | 13 |
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 |