1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
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+0x5000
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
mov dword[PAGETABLE+0x2008], PAGETABLE+0x4003
; 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, 0x200000
jb .build_pt
; enable paging and long mode
mov di, PAGETABLE
; mask all IRQs
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
|