diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index 079ec35..775771e 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -10,22 +10,20 @@ union PTE { }; }; -typedef union PTE PT[512]; - -#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)] +#define PT(ptr) ((union PTE *)MASK_FLAGS(ptr)) +#define P4e(pt, addr) (PT(pt)[P4_OFFSET(addr)]) +#define P3e(pt, addr) PT(P4e(pt, addr).value)[P3_OFFSET(addr)] +#define P2e(pt, addr) PT(P3e(pt, addr).value)[P2_OFFSET(addr)] +#define P1e(pt, addr) PT(P2e(pt, addr).value)[P1_OFFSET(addr)] uintptr_t vmm_get_page(void *P4, uintptr_t addr) { if(P4 - && P4e(P4, addr) - && P3e(P4, addr) - && P2e(P4, addr) + && P4e(P4, addr).value + && P3e(P4, addr).value + && P2e(P4, addr).value ) - return MASK_FLAGS(P1e(P4, addr)->value); + 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 9e1fe0b..07ae68e 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -44,3 +44,17 @@ TEST(get_page_ignores_flags) ASSERT_EQ_PTR(ret, 0x1234567890ABC000); } +TEST(get_page_works_for_different_address) +{ + p4[1] = (uintptr_t)p3; + p4[1] |= 0x123; + p3[2] = (uintptr_t)p2; + p3[2] |= 0x456; + p2[3] = (uintptr_t)p1; + p2[3] |= 0x789; + p1[4] = 0x34567890ABCDEF12; + + uintptr_t ret = vmm_get_page(p4, (1UL<<39)+(2UL<<30)+(3UL<<21)+(4UL<<12)); + + ASSERT_EQ_PTR(ret, 0x34567890ABCDE000); +}