From 518eaf73c37a070d57e06139053531f6d3ac9a74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Tue, 2 Jan 2018 11:55:06 +0100 Subject: [PATCH] VMM - set_page sets 2Mb pages --- src/kernel/memory/vmm.c | 11 +++++++++++ src/kernel/memory/vmm.tt | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index 280e5b4..1085705 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -49,6 +49,17 @@ uintptr_t vmm_get_page(void *P4, uintptr_t addr) int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags) { + if(flags & PAGE_HUGE) + { + if(!(P4 + && P4e(P4, addr).present + && P3e(P4, addr).present + )) + return -1; + P2e(P4, addr).value = page | flags; + return 0; + } + if(!page_exists(P4, addr)) return -1; diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index ca774a4..9ab0b0f 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -97,6 +97,15 @@ TEST(set_page_fails_if_PT_missing) ASSERT_NEQ_INT(retval, 0); } +TEST(set_page_sets_2mb_pages) +{ + p4[1] = (uintptr_t)p3; p4[1] |= PAGE_PRESENT; + p3[2] = (uintptr_t)p2; p3[2] |= PAGE_PRESENT; + + vmm_set_page(p4, (1UL<<39)+(2UL<<30)+(3UL<<21), 0x1234567890A00000, PAGE_HUGE | PAGE_PRESENT); + + ASSERT_EQ_PTR(p2[3], 0x1234567890A00000 | PAGE_HUGE | PAGE_PRESENT); +} uintptr_t pmm_alloc() {