diff options
author | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2022-10-06 16:45:17 +0200 |
---|---|---|
committer | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2022-10-06 16:45:17 +0200 |
commit | f8397815545adb7d0da36614e0065aa68453a2e4 (patch) | |
tree | a771f526970c6724b2511577dceece8783450a49 /stage2/paging.asm | |
download | cuddles-f8397815545adb7d0da36614e0065aa68453a2e4.tar.xz |
Initial commit
Diffstat (limited to 'stage2/paging.asm')
-rw-r--r-- | stage2/paging.asm | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/stage2/paging.asm b/stage2/paging.asm new file mode 100644 index 0000000..91ed0ac --- /dev/null +++ b/stage2/paging.asm @@ -0,0 +1,77 @@ +paging: + ; print message + mov ebx, .msg + call print_str + + ; clear 4 levels of page maps + mov di, PAGETABLE+0x0000 +.clr_buf: + mov byte[di], 0 + inc di + cmp di, PAGETABLE+0x4000 + jne .clr_buf + + ; init 3 page map levels + mov dword[PAGETABLE+0x0000], PAGETABLE+0x1003 + mov dword[PAGETABLE+0x1000], PAGETABLE+0x2003 + mov dword[PAGETABLE+0x2000], PAGETABLE+0x3003 + + ; fill up level 4 page map + mov eax, 3 + mov di, PAGETABLE+0x3000 +.build_pt: + mov [di], eax + add di, 8 + add eax, 0x1000 + cmp eax, 0x100000 + jb .build_pt + + ; enable paging and long mode + + mov di, PAGETABLE + + mov al, 0xFF + out 0xA1, al + out 0x21, al + + nop + nop + + lidt [.idt] + + mov eax, 0b10100000 + mov cr4, eax + + mov edx, edi + mov cr3, edx + + mov ecx, 0xC0000080 + rdmsr + + or eax, 0x00000100 + wrmsr + + mov ebx, cr0 + or ebx, 0x80000001 + mov cr0, ebx + + lgdt [.gdt_pointer] + + ret + +.gdt: + dq 0 + dq 0x00209A0000000000 + dq 0x0000920000000000 + dw 0 + +.gdt_pointer: + dw $ - .gdt - 1 + dd .gdt + +.idt: + dw 0 + dd 0 + +.msg: + db "building page table", 10, 13, 0 |