summaryrefslogtreecommitdiff
path: root/kernel/src/mem/paging.c
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-08-08 19:50:11 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-08-08 19:50:11 +0200
commit0162997df4ae7769bd4fc055b2c03b473846d1f5 (patch)
treef6c40a64cbb15cf3fd102e5e8f15b48030e96f4e /kernel/src/mem/paging.c
parent71396c5cd460890c52e348687e6e7c864e2dfeed (diff)
higher half
Diffstat (limited to 'kernel/src/mem/paging.c')
-rw-r--r--kernel/src/mem/paging.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c
index 3f9e2f5..f0181cd 100644
--- a/kernel/src/mem/paging.c
+++ b/kernel/src/mem/paging.c
@@ -6,30 +6,31 @@ 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];
+__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;
- 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;
+ 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;
- // 0x00000000 - 0x00400000 : 0x00000000 - 0x00400000
+ // higher half kernel
+ // 0xc0000000 - 0xc0400000 : 0xc0000000 - 0xc0400000
for (uint64_t i = 0; i < 2; i++) {
- page_table_lvl2_kernel[i] = i * PAGE_SIZE + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
+ 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 = 0; i < 512; i++) {
- page_table_lvl2_fb[i] = i * PAGE_SIZE + 0xc0000000 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
+ 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);