summaryrefslogtreecommitdiff
path: root/kernel/src/mem/paging.c
blob: 3f9e2f5ac9a2a5948f7c3ca449cc64a40d57a84c (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
#include <types.h>

#include <paging.h>

void load_pt_lvl4(uint64_t*);

__attribute__((aligned(4096))) uint64_t page_table_lvl4[512];
__attribute__((aligned(4096))) uint64_t page_table_lvl3[512];
__attribute__((aligned(4096))) uint64_t page_table_lvl2_kernel[512];
__attribute__((aligned(4096))) uint64_t page_table_lvl2_fb[512];

#define PAGE_SIZE 0x00200000
#define FLAG_PRESENT 0x1
#define FLAG_WRITABLE 0x2
#define FLAG_HUGE 0x80

void init_paging(void)
{
	page_table_lvl4[0] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE;
	page_table_lvl3[0] = (uint64_t)page_table_lvl2_kernel + FLAG_PRESENT + FLAG_WRITABLE;
	page_table_lvl3[3] = (uint64_t)page_table_lvl2_fb + FLAG_PRESENT + FLAG_WRITABLE;

	// 0x00000000 - 0x00400000 : 0x00000000 - 0x00400000
	for (uint64_t i = 0; i < 2; i++) {
		page_table_lvl2_kernel[i] = i * PAGE_SIZE + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
	}

	// TODO: remove initial mapping for fb and instead page on demand

	// 0xe0000000 - 0xffffffff : 0xe0000000 - 0xffffffff
	for (uint64_t i = 0; i < 512; i++) {
		page_table_lvl2_fb[i] = i * PAGE_SIZE + 0xc0000000 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
	}

	load_pt_lvl4(page_table_lvl4);
}