From ffa23b1dba2e06cac787dc72135960d35e2a7a7b Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Sun, 27 Sep 2026 17:04:41 +0200 Subject: [PATCH] handle non-canonical addresses in vmm --- kernel/src/kmain.c | 21 --------------------- kernel/src/vmm.c | 12 ++++++++++++ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/kernel/src/kmain.c b/kernel/src/kmain.c index 05120de..3024ab5 100644 --- a/kernel/src/kmain.c +++ b/kernel/src/kmain.c @@ -51,27 +51,6 @@ __noreturn void _start(void) { printk("%d: %lu\n", i, get_random_number()); } - // test VMM - { - void* vaddr; - int ret = vmm_alloc(&vaddr, 2, 0); - if (ret != SUCCESS) { - panic(NULL, "vmm_alloc returned %d", ret); - } - { - uint64_t* pml4 = pag_get_pml4(); - uint64_t* pte = pag_get_pte(pml4, vaddr); - if (!IS_ERR(pte) && (*pte & PTE_FLAG_PRESENT)) { - printk("page allocated\n"); - } else { - printk("page not allocated\n"); - } - } - memset(vaddr, 69, 2 * PAGE_SIZE); - *(char*)((vaddr + (2 * PAGE_SIZE)) - 1) = 0; - printk("read back:\n%s\n", (char*)vaddr); - } - // The most important function in the world. splash(); diff --git a/kernel/src/vmm.c b/kernel/src/vmm.c index 1af7637..040c127 100644 --- a/kernel/src/vmm.c +++ b/kernel/src/vmm.c @@ -31,6 +31,18 @@ int vmm_alloc(void** vaddr, uint64_t count, uint64_t flags) { *vaddr = (void*)((uint64_t)(*vaddr) | CANONICAL_MASK_KERNEL); } + } else { + if (flags & PTE_FLAG_USER) { + if ((void*)((uint64_t)(*vaddr) & + CANONICAL_MASK_KERNEL)) { + return -EINVAL; + } + } else { + if (!((void*)((uint64_t)(*vaddr) & + CANONICAL_MASK_KERNEL))) { + return -EINVAL; + } + } } for (uint64_t i = 0; i < count; i++) { uint64_t* pte =