From 1ad156902ae1c251f8d6641b58668a1db50c0512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Sat, 23 Dec 2017 22:01:07 +0100 Subject: [PATCH] VMM - get_page ignores flags -- also restructuring - bad Thomas! --- src/kernel/memory/vmm.c | 35 ++++++++++++++++++++--------------- src/kernel/memory/vmm.tt | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index d5dbf47..079ec35 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -1,26 +1,31 @@ #include #define FLAGS_MASK (PAGE_SIZE-1) +#define MASK_FLAGS(addr) ((uintptr_t)addr & ~FLAGS_MASK) -struct PT { - struct PT *p[ENTRIES_PER_PT]; -}__attribute__((packed)); +union PTE { + uint64_t value; + struct { + uintptr_t flags:12; + }; +}; -#define P(pt) ((struct PT *)((uintptr_t)pt & ~(FLAGS_MASK))) +typedef union PTE PT[512]; -#define P3(pt, addr) (P(pt)->p[P4_OFFSET(addr)]) -#define P2(pt, addr) (P(P3(pt, addr))->p[P3_OFFSET(addr)]) -#define P1(pt, addr) (P(P2(pt, addr))->p[P2_OFFSET(addr)]) -#define P0(pt, addr) (P(P1(pt, addr))->p[P1_OFFSET(addr)]) +#define PT(ptr) ((PT *)MASK_FLAGS(ptr->value)) +#define P4e(pt, addr) (((PT *)pt)[P4_OFFSET(addr)]) +#define P3e(pt, addr) PT(P4e(pt, addr))[P3_OFFSET(addr)] +#define P2e(pt, addr) PT(P3e(pt, addr))[P2_OFFSET(addr)] +#define P1e(pt, addr) PT(P2e(pt, addr))[P1_OFFSET(addr)] - -uintptr_t vmm_get_page(uintptr_t *P4, uintptr_t addr) +uintptr_t vmm_get_page(void *P4, uintptr_t addr) { if(P4 - && P3(P4, addr) - && P2(P4, addr) - && P1(P4, addr) + && P4e(P4, addr) + && P3e(P4, addr) + && P2e(P4, addr) ) - return (uintptr_t)P0(P4, addr); - return 0; + return MASK_FLAGS(P1e(P4, addr)->value); + else + return 0; } diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index 469f2fc..9e1fe0b 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -30,3 +30,17 @@ TEST(get_page_returns_correct_address) ASSERT_EQ_PTR(ret, 0x1234567890ABC000); } +TEST(get_page_ignores_flags) +{ + p4[0] = (uintptr_t)p3; + p4[0] |= 0x123; + p3[0] = (uintptr_t)p2; + p3[0] |= 0x456; + p2[0] = (uintptr_t)p1; + p2[0] |= 0x789; + p1[0] = 0x1234567890ABCDEF; + + uintptr_t ret = vmm_get_page(p4, 0); + + ASSERT_EQ_PTR(ret, 0x1234567890ABC000); +}