diff options
Diffstat (limited to 'kernel/src/mem')
| -rw-r--r-- | kernel/src/mem/paging.c | 19 | ||||
| -rw-r--r-- | kernel/src/mem/paging_asm.S | 6 |
2 files changed, 16 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); diff --git a/kernel/src/mem/paging_asm.S b/kernel/src/mem/paging_asm.S index 508930f..c7e11f3 100644 --- a/kernel/src/mem/paging_asm.S +++ b/kernel/src/mem/paging_asm.S @@ -1,11 +1,17 @@ .section .text +.set KERNEL_VMA, 0xc0000000 + .global load_pt_lvl4 load_pt_lvl4: push %rbp mov %rsp, %rbp + push %r12 + mov $KERNEL_VMA, %r12 + sub %r12, %rdi mov %rdi, %cr3 + pop %r12 mov %rbp, %rsp pop %rbp |
