]> git.lizzy.rs Git - nyax.git/blob - stage2/paging.asm
Force make to use bash (#1)
[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 di, 8
25         add eax, 0x1000
26         cmp eax, 0x100000
27         jb .build_pt
28
29         ; enable paging and long mode
30
31         mov di, PAGETABLE
32
33         mov al, 0xFF
34         out 0xA1, al
35         out 0x21, al
36
37         nop
38         nop
39
40         lidt [.idt]
41
42         mov eax, 0b10100000
43         mov cr4, eax
44
45         mov edx, edi
46         mov cr3, edx
47
48         mov ecx, 0xC0000080
49         rdmsr
50
51         or eax, 0x00000100
52         wrmsr
53
54         mov ebx, cr0
55         or ebx, 0x80000001
56         mov cr0, ebx
57
58         lgdt [.gdt_pointer]
59
60         ret
61
62 .gdt:
63         dq 0
64         dq 0x00209A0000000000
65         dq 0x0000920000000000
66         dw 0
67
68 .gdt_pointer:
69         dw $ - .gdt - 1
70         dd .gdt
71
72 .idt:
73         dw 0
74         dd 0
75
76 .msg:
77         db "building page table", 10, 13, 0