summaryrefslogtreecommitdiff
path: root/stage2/paging.asm
blob: 4e5e2f14920966039ab653facf8db8ead285b145 (plain)
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, 0x400000
	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