VMM -- Know what? Let's ignore huge pages for simplicity

This commit is contained in:
2018-03-20 13:08:55 +01:00
parent ae2de799f3
commit cb09833ebc
3 changed files with 10 additions and 83 deletions

View File

@@ -39,8 +39,6 @@ uint64_t vmm_get_page(uint64_t P4, uint64_t addr)
{
if(page_exists(P4, addr))
{
if(P2E.huge)
return P2E.value;
return P1E.value;
}
return -1;
@@ -48,22 +46,6 @@ uint64_t vmm_get_page(uint64_t P4, uint64_t addr)
int vmm_set_page(uint64_t P4, uint64_t addr, uint64_t page, uint16_t flags, int touch)
{
if(flags & PAGE_HUGE)
{
if(!(P4 && P4E.present && P3E.present))
{
if(!touch)
return -1;
touch_page(P4, addr, flags);
}
// Don't overwrite a non-huge page with a huge one
if(P2E.present && !P2E.huge)
return -1;
P2E.value = page | flags;
return 0;
}
if(!page_exists(P4, addr))
{
if(!touch)
@@ -79,9 +61,6 @@ int touch_page(uint64_t P4, uint64_t addr, uint16_t flags)
{
if(!P4) return -1;
int huge=(flags & PAGE_HUGE)?1:0;
flags ^= PAGE_HUGE*huge;
if((!P4E.present) && (!(P4E.value = pmm_calloc())))
return -1;
P4E.value |= flags | PAGE_PRESENT;
@@ -90,8 +69,6 @@ int touch_page(uint64_t P4, uint64_t addr, uint16_t flags)
return -1;
P3E.value |= flags | PAGE_PRESENT;
if(huge) return 0;
if((!P2E.present) && (!(P2E.value = pmm_calloc())))
return -1;
P2E.value |= flags | PAGE_PRESENT;
@@ -106,25 +83,17 @@ void free_page(uint64_t P4, uint64_t addr, int free)
union PTE *pt;
if(P2E.huge)
{
P2E.value = 0;
P1E.value = 0;
if(!free)
if(!free)
return;
pt = PT(P2E.value);
for(int i = 0; i < ENTRIES_PER_PT; i++)
if(pt[i].value)
return;
} else {
P1E.value = 0;
if(!free)
return;
pt = PT(P2E.value);
for(int i = 0; i < ENTRIES_PER_PT; i++)
if(pt[i].value)
return;
pmm_free(MASK_FLAGS(P2E.value));
P2E.value = 0;
}
pmm_free(MASK_FLAGS(P2E.value));
P2E.value = 0;
pt = PT(P3E.value);
for(int i = 0; i < ENTRIES_PER_PT; i++)