From e68698ff808d89ffa621bcf07ae706a9d2083ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Tue, 2 Jan 2018 12:24:02 +0100 Subject: [PATCH] VMM - set_page does not overwrite 4kb pages with 2mb --- src/kernel/memory/vmm.c | 2 ++ src/kernel/memory/vmm.tt | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index 1085705..595e443 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -56,6 +56,8 @@ int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags) && P3e(P4, addr).present )) return -1; + if(P2e(P4, addr).present && !P2e(P4,addr).huge) + return -1; P2e(P4, addr).value = page | flags; return 0; } diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index 9ab0b0f..161b0a6 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -106,6 +106,14 @@ TEST(set_page_sets_2mb_pages) ASSERT_EQ_PTR(p2[3], 0x1234567890A00000 | PAGE_HUGE | PAGE_PRESENT); } +TEST(set_page_does_not_overwrite_4kb_pages_with_2mb) +{ + BUILD_PT(0,0,0); + + int retval = vmm_set_page(p4, 0, 0, PAGE_HUGE | PAGE_PRESENT); + + ASSERT_NEQ_INT(retval, 0); +} uintptr_t pmm_alloc() {