diff --git a/src/arch/x86_64/boot.asm b/src/arch/x86_64/boot.asm index 3fb4c06..71703ee 100644 --- a/src/arch/x86_64/boot.asm +++ b/src/arch/x86_64/boot.asm @@ -9,6 +9,8 @@ start: call check_cpuid call check_long_mode + call set_up_page_tables + ; print `OK` to screen mov dword [0xb8000], 0x2f4b2f4f hlt @@ -74,6 +76,33 @@ check_long_mode: mov al, "2" jmp error +set_up_page_tables: + ; map first P4 entry to P3 table + mov eax, p3_table + or eax, 0b11 ; present + writable + mov [p4_table], eax + + ; map first P3 entry to P2 table + mov eax, p2_table + or eax, 0b11 ; present + writable + mov [p3_table], eax + + ; map each P2 entry to a huge 2MiB page + mov ecx, 0 ; counter variable + +.map_p2_table: + ; map ecx-th P2 entry to a huge page that starts at address 2MiB*ecx + mov eax, 0x200000 ; 2MiB + mul ecx ; start address of ecx-th page + or eax, 0b10000011 ; present + writable + huge + mov [p2_table + ecx * 8], eax ; map ecx-th entry + + inc ecx ; increase counter + cmp ecx, 512 ; if counter == 512, the whole P2 table is mapped + jne .map_p2_table ; else map the next entry + + ret + ; Prints `ERR: ` and the given error code to screen and hangs. ; parameter: error code (in ascii) in al error: @@ -84,6 +113,13 @@ error: hlt section .bss +align 4096 +p4_table: + resb 4096 +p3_table: + resb 4096 +p2_table: + resb 4096 stack_bottom: resb 64 stack_top: