VMM - set_page with tests

This commit is contained in:
Thomas Lovén 2017-12-27 22:40:41 +01:00
parent cd7ed38a40
commit 28c8afe3c5
2 changed files with 52 additions and 0 deletions

View File

@ -36,3 +36,16 @@ uintptr_t vmm_get_page(void *P4, uintptr_t addr)
else else
return -1; 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;
}

View File

@ -75,3 +75,42 @@ TEST(get_page_fails_if_PTE_not_present)
ASSERT_EQ_PTR(ret, -1); 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);
}