From 1d4b689215654d68f6312318d0c134ab649195bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Wed, 27 Dec 2017 23:08:41 +0100 Subject: [PATCH] VMM - touch_page adds P3 --- src/kernel/memory/vmm.c | 10 ++++++++++ src/kernel/memory/vmm.tt | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index 15447d6..fccb76c 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -49,3 +49,13 @@ int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags) P1e(P4, addr).value = page | flags; return 0; } + +int touch_page(void *P4, uintptr_t addr, uint16_t flags) +{ + (void)flags; + if(!P4) return -1; + if(!P4e(P4, addr).present) + P4e(P4, addr).value = pmm_alloc(); + + return 0; +} diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index 3388f8a..6da6503 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -114,3 +114,19 @@ TEST(set_page_fails_if_PT_missing) ASSERT_NEQ_INT(retval, 0); } + +uintptr_t pmm_alloc() +{ + uintptr_t *pages[] = {p3, p2, p1}; + static int counter=0; + return (uintptr_t)pages[counter++]; +} + +TEST(touch_page_adds_P3) +{ + p4[0] = 0; + + touch_page(p4, 0, 0); + + ASSERT_NEQ_PTR(p4[0], 0); +}