VMM - free_page returns P1 to PMM if empty

This commit is contained in:
Thomas Lovén 2017-12-30 13:16:20 +01:00
parent 46e27fb817
commit d54a206f82
2 changed files with 19 additions and 0 deletions

View File

@ -91,17 +91,20 @@ void free_page(void *P4, uintptr_t addr, int free)
for(int i = 0; i < ENTRIES_PER_PT; i++) for(int i = 0; i < ENTRIES_PER_PT; i++)
if(pt[i].value) if(pt[i].value)
return; return;
pmm_free(MASK_FLAGS(P2e(P4, addr).value));
P2e(P4, addr).value = 0; P2e(P4, addr).value = 0;
pt = PT(P3e(P4, addr).value); pt = PT(P3e(P4, addr).value);
for(int i = 0; i < ENTRIES_PER_PT; i++) for(int i = 0; i < ENTRIES_PER_PT; i++)
if(pt[i].value) if(pt[i].value)
return; return;
pmm_free(MASK_FLAGS(P3e(P4, addr).value));
P3e(P4, addr).value = 0; P3e(P4, addr).value = 0;
pt = PT(P4e(P4, addr).value); pt = PT(P4e(P4, addr).value);
for(int i = 0; i < ENTRIES_PER_PT; i++) for(int i = 0; i < ENTRIES_PER_PT; i++)
if(pt[i].value) if(pt[i].value)
return; return;
pmm_free(MASK_FLAGS(P4e(P4, addr).value));
P4e(P4, addr).value = 0; P4e(P4, addr).value = 0;
} }

View File

@ -165,3 +165,19 @@ TEST(free_page_does_not_unset_P2_entry_if_P1_is_not_empty)
ASSERT_NEQ_PTR(p2[3], 0); ASSERT_NEQ_PTR(p2[3], 0);
} }
uintptr_t freed[] = {0,0,0,0,0};
void pmm_free(uintptr_t page)
{
static int counter = 0;
freed[counter++] = page;
}
TEST(free_page_returns_P1_to_PMM_if_empty)
{
BUILD_PT(1,2,3);
p1[4] = PAGE_PRESENT;
free_page(p4, ADDR1234, 1);
ASSERT_EQ_PTR(freed[0], p1);
}