blob: f0181cd96e8fcc429d26cf2966f6e07ebb4ada5d (
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
|
#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_hh[512];
#define PAGE_SIZE 0x00200000
#define FLAG_PRESENT 0x1
#define FLAG_WRITABLE 0x2
#define FLAG_HUGE 0x80
#define KERNEL_VMA 0xc0000000
void init_paging(void)
{
page_table_lvl4[0] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA;
page_table_lvl3[3] = (uint64_t)page_table_lvl2_hh + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA;
// higher half kernel
// 0xc0000000 - 0xc0400000 : 0xc0000000 - 0xc0400000
for (uint64_t i = 0; i < 2; i++) {
page_table_lvl2_hh[i] = i * PAGE_SIZE + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
}
// TODO: remove initial mapping for fb and instead page on demand
// identity paged for fb
// 0xe0000000 - 0xffffffff : 0xe0000000 - 0xffffffff
for (uint64_t i = 2; i < 512; i++) {
page_table_lvl2_hh[i] = i * PAGE_SIZE + 0xc0000000 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
}
load_pt_lvl4(page_table_lvl4);
}
|