VMM - set_page sets 2Mb pages

This commit is contained in:
Thomas Lovén 2018-01-02 11:55:06 +01:00
parent f81e5cd8b0
commit 518eaf73c3
2 changed files with 20 additions and 0 deletions

View File

@ -49,6 +49,17 @@ uintptr_t vmm_get_page(void *P4, uintptr_t addr)
int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags) int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags)
{ {
if(flags & PAGE_HUGE)
{
if(!(P4
&& P4e(P4, addr).present
&& P3e(P4, addr).present
))
return -1;
P2e(P4, addr).value = page | flags;
return 0;
}
if(!page_exists(P4, addr)) if(!page_exists(P4, addr))
return -1; return -1;

View File

@ -97,6 +97,15 @@ TEST(set_page_fails_if_PT_missing)
ASSERT_NEQ_INT(retval, 0); ASSERT_NEQ_INT(retval, 0);
} }
TEST(set_page_sets_2mb_pages)
{
p4[1] = (uintptr_t)p3; p4[1] |= PAGE_PRESENT;
p3[2] = (uintptr_t)p2; p3[2] |= PAGE_PRESENT;
vmm_set_page(p4, (1UL<<39)+(2UL<<30)+(3UL<<21), 0x1234567890A00000, PAGE_HUGE | PAGE_PRESENT);
ASSERT_EQ_PTR(p2[3], 0x1234567890A00000 | PAGE_HUGE | PAGE_PRESENT);
}
uintptr_t pmm_alloc() uintptr_t pmm_alloc()
{ {