From 28c8afe3c5fc43d7417811347911ebd9e3ab80da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Wed, 27 Dec 2017 22:40:41 +0100 Subject: [PATCH] VMM - set_page with tests --- src/kernel/memory/vmm.c | 13 +++++++++++++ src/kernel/memory/vmm.tt | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index 7167a2c..15447d6 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -36,3 +36,16 @@ uintptr_t vmm_get_page(void *P4, uintptr_t addr) else return -1; } + +int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags) +{ + if(!(P4 + && P4e(P4, addr).present + && P3e(P4, addr).present + && P2e(P4, addr).present + )) + return -1; + + P1e(P4, addr).value = page | flags; + return 0; +} diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index a5553d9..3388f8a 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -75,3 +75,42 @@ TEST(get_page_fails_if_PTE_not_present) ASSERT_EQ_PTR(ret, -1); } + +TEST(set_page_sets_page) +{ + p4[0] = (uintptr_t)p3; + p4[0] |= PAGE_PRESENT; + p3[0] = (uintptr_t)p2; + p3[0] |= PAGE_PRESENT; + p2[0] = (uintptr_t)p1; + p2[0] |= PAGE_PRESENT; + + vmm_set_page(p4, 0, 0x1234567890ABC000, PAGE_PRESENT); + + ASSERT_EQ_PTR(p1[0], 0x1234567890ABC000 | PAGE_PRESENT); +} +TEST(set_page_returns_success_if_working) +{ + p4[0] = (uintptr_t)p3; + p4[0] |= PAGE_PRESENT; + p3[0] = (uintptr_t)p2; + p3[0] |= PAGE_PRESENT; + p2[0] = (uintptr_t)p1; + p2[0] |= PAGE_PRESENT; + + int retval = vmm_set_page(p4, 0, 0x1234567890ABC000, PAGE_PRESENT); + + ASSERT_EQ_INT(retval, 0); +} +TEST(set_page_fails_if_PT_missing) +{ + p4[0] = (uintptr_t)p3; + p4[0] |= PAGE_PRESENT; + p3[0] = (uintptr_t)p2; + p2[0] = (uintptr_t)p1; + p2[0] |= PAGE_PRESENT; + + int retval = vmm_set_page(p4, 0, 0x1234567890ABC000, PAGE_PRESENT); + + ASSERT_NEQ_INT(retval, 0); +}