]> git.lizzy.rs Git - nyax.git/blob - stage2/paging.asm
9254d86f7d620813ebbf3add2671f9e0b6945823
[nyax.git] / stage2 / paging.asm
1 paging:
2         ; print message
3         mov ebx, .msg
4         call print_str
5
6         ; clear 4 levels of page maps
7         mov di, PAGETABLE+0x0000
8 .clr_buf:
9         mov byte[di], 0
10         inc di
11         cmp di, PAGETABLE+0x4000
12         jne .clr_buf
13
14         ; init 3 page map levels
15         mov dword[PAGETABLE+0x0000], PAGETABLE+0x1003
16         mov dword[PAGETABLE+0x1000], PAGETABLE+0x2003
17         mov dword[PAGETABLE+0x2000], PAGETABLE+0x3003
18
19         ; fill up level 4 page map
20         mov eax, 3
21         mov di, PAGETABLE+0x3000
22 .build_pt:
23         mov [di], eax
24         add eax, 0x1000
25         add di, 8
26         cmp eax, 0x100000
27         jb .build_pt
28         ; enable paging and long mode
29
30         mov di, PAGETABLE
31
32         mov al, 0xFF
33         out 0xA1, al
34         out 0x21, al
35
36         nop
37         nop
38
39         lidt [.idt]
40
41         mov eax, 0b10100000
42         mov cr4, eax
43
44         mov edx, edi
45         mov cr3, edx
46
47         mov ecx, 0xC0000080
48         rdmsr
49
50         or eax, 0x00000100
51         wrmsr
52
53         mov ebx, cr0
54         or ebx, 0x80000001
55         mov cr0, ebx
56
57         lgdt [.gdt_pointer]
58
59         ret
60
61 .gdt:
62         dq 0
63         dq 0x00209A0000000000
64         dq 0x0000920000000000
65         dw 0
66
67 .gdt_pointer:
68         dw $ - .gdt - 1
69         dd .gdt
70
71 .idt:
72         dw 0
73         dd 0
74
75 .msg:
76         db "building page table", 10, 13, 0