VMM - get_page works for different address
This commit is contained in:
parent
1ad156902a
commit
d32e93b72b
@ -10,22 +10,20 @@ union PTE {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef union PTE PT[512];
|
#define PT(ptr) ((union PTE *)MASK_FLAGS(ptr))
|
||||||
|
#define P4e(pt, addr) (PT(pt)[P4_OFFSET(addr)])
|
||||||
#define PT(ptr) ((PT *)MASK_FLAGS(ptr->value))
|
#define P3e(pt, addr) PT(P4e(pt, addr).value)[P3_OFFSET(addr)]
|
||||||
#define P4e(pt, addr) (((PT *)pt)[P4_OFFSET(addr)])
|
#define P2e(pt, addr) PT(P3e(pt, addr).value)[P2_OFFSET(addr)]
|
||||||
#define P3e(pt, addr) PT(P4e(pt, addr))[P3_OFFSET(addr)]
|
#define P1e(pt, addr) PT(P2e(pt, addr).value)[P1_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(void *P4, uintptr_t addr)
|
uintptr_t vmm_get_page(void *P4, uintptr_t addr)
|
||||||
{
|
{
|
||||||
if(P4
|
if(P4
|
||||||
&& P4e(P4, addr)
|
&& P4e(P4, addr).value
|
||||||
&& P3e(P4, addr)
|
&& P3e(P4, addr).value
|
||||||
&& P2e(P4, addr)
|
&& P2e(P4, addr).value
|
||||||
)
|
)
|
||||||
return MASK_FLAGS(P1e(P4, addr)->value);
|
return MASK_FLAGS(P1e(P4, addr).value);
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -44,3 +44,17 @@ TEST(get_page_ignores_flags)
|
|||||||
|
|
||||||
ASSERT_EQ_PTR(ret, 0x1234567890ABC000);
|
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);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user