VMM - set_page with tests
This commit is contained in:
parent
cd7ed38a40
commit
28c8afe3c5
@ -36,3 +36,16 @@ uintptr_t vmm_get_page(void *P4, uintptr_t addr)
|
||||
else
|
||||
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;
|
||||
}
|
||||
|
@ -75,3 +75,42 @@ TEST(get_page_fails_if_PTE_not_present)
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user