From 2d0f539e233943d6db4149f0b6369dab7396de2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Tue, 20 Feb 2018 13:41:32 +0100 Subject: [PATCH] Create and load new page directories --- src/kernel/boot/kmain.c | 2 ++ src/kernel/cpu/registers.S | 4 ++++ src/kernel/include/cpu.h | 1 + src/kernel/include/memory.h | 1 + src/kernel/memory/vmm.c | 7 +++++++ src/kernel/memory/vmm.tt | 8 +++++++- 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index 7805c58..c0c27e5 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -35,6 +35,8 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) cpu_init(); + uintptr_t P4 = new_P4(); + write_cr3(P4); debug_ok("Boot \"Complete\"\n"); diff --git a/src/kernel/cpu/registers.S b/src/kernel/cpu/registers.S index fa5a1da..09e1eec 100644 --- a/src/kernel/cpu/registers.S +++ b/src/kernel/cpu/registers.S @@ -17,6 +17,10 @@ read_cr2: read_cr3: mov rax, cr3 ret +.global write_cr3 +write_cr3: + mov cr3, rdi + ret .global read_cr4 read_cr4: mov rax, cr4 diff --git a/src/kernel/include/cpu.h b/src/kernel/include/cpu.h index f1d0dcd..7b93617 100644 --- a/src/kernel/include/cpu.h +++ b/src/kernel/include/cpu.h @@ -9,4 +9,5 @@ void load_idt(void *); uint64_t read_cr0(); uint64_t read_cr2(); uint64_t read_cr3(); +void write_cr3(uint64_t); uint64_t read_cr4(); diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 8c9414f..e4ae958 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -39,6 +39,7 @@ void pmm_free(uint64_t page); uint64_t pmm_alloc(); uint64_t pmm_calloc(); +uint64_t new_P4(); uint64_t vmm_get_page(uint64_t P4, uint64_t addr); #define PAGE_EXIST(p) ((p) != (uint64_t)-1) int vmm_set_page(uint64_t P4, uint64_t addr, uint64_t page, uint16_t flags); diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index e8cb79e..eae6c17 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -14,6 +14,13 @@ #define P2E PT(P3E)[P2_OFFSET(addr)] #define P1E PT(P2E)[P1_OFFSET(addr)] +uint64_t new_P4() +{ + uint64_t p4 = pmm_alloc(); + memcpy(P2V(p4), (void *)kernel_P4, PAGE_SIZE); + return p4; +} + static int page_exists(uint64_t P4, uint64_t addr) { if(P4 && PRESENT(P4E) && PRESENT(P3E) && PRESENT(P2E)) diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index 15d3283..b0b31a6 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -3,7 +3,13 @@ #include #undef P2V -#define P2V(p) (p) +#define P2V(p) ((void *)(p)) + +uint64_t kernel_P4; +uint64_t pmm_alloc() +{ + return 0; +} #include "vmm.c"