From 96a877c95b5d37ed2fea605c675ab4a4f4d2a2ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Wed, 3 Jan 2018 14:05:27 +0100 Subject: [PATCH] VMM - touch_page stops at P2 for huge pages --- src/kernel/memory/vmm.c | 5 +++++ src/kernel/memory/vmm.tt | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index 595e443..6acfd13 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -73,6 +73,9 @@ int touch_page(void *P4, uintptr_t addr, uint16_t flags) { if(!P4) return -1; + int huge=(flags & PAGE_HUGE)?1:0; + flags ^= PAGE_HUGE*huge; + if((!P4e(P4, addr).present) && (!(P4e(P4, addr).value = pmm_alloc()))) return -1; @@ -83,6 +86,8 @@ int touch_page(void *P4, uintptr_t addr, uint16_t flags) return -1; P3e(P4, addr).value |= flags | PAGE_PRESENT; + if(huge) return 0; + if((!P2e(P4, addr).present) && (!(P2e(P4, addr).value = pmm_alloc()))) return -1; diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index 161b0a6..b3e729b 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -143,9 +143,9 @@ TEST(touch_page_adds_P1) } TEST(touch_page_sets_flags) { - touch_page(p4, 0, 0x123); + touch_page(p4, 0, PAGE_WRITE); - ASSERT_EQ_PTR(p2[0], (uintptr_t)p1 | 0x123 | PAGE_PRESENT); + ASSERT_EQ_PTR(p2[0], (uintptr_t)p1 | PAGE_WRITE | PAGE_PRESENT); } TEST(touch_page_fails_if_out_of_pages) { @@ -153,6 +153,11 @@ TEST(touch_page_fails_if_out_of_pages) int retval = touch_page(p4, 0, 0); ASSERT_NEQ_INT(retval, 0); } +TEST(touch_page_stops_at_P2_for_huge_pages) +{ + touch_page(p4, 0, PAGE_HUGE); + ASSERT_EQ_PTR(p2[0], 0); +} TEST(free_page_unsets_page) {