x86_64: pmap: implement pmap_destroy()
This commit is contained in:
@@ -100,7 +100,7 @@ static void delete_ptab(phys_addr_t pt)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pt &= ~VM_PAGE_MASK;
|
pt = ENTRY_TO_PTR(pt);
|
||||||
if (!pt) {
|
if (!pt) {
|
||||||
/* physical address of 0x0, nothing to delete */
|
/* physical address of 0x0, nothing to delete */
|
||||||
return;
|
return;
|
||||||
@@ -117,7 +117,7 @@ static void delete_pdir(phys_addr_t pd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pd &= ~0x1FFFFFULL;
|
pd &= ENTRY_TO_PTR(pd);
|
||||||
if (!pd) {
|
if (!pd) {
|
||||||
/* physical address of 0x0, nothing to delete */
|
/* physical address of 0x0, nothing to delete */
|
||||||
return;
|
return;
|
||||||
@@ -412,8 +412,46 @@ pmap_t pmap_create(void)
|
|||||||
return pmap;
|
return pmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void delete_pdpt(phys_addr_t pd)
|
||||||
|
{
|
||||||
|
if (pd & PTE_PAGESIZE) {
|
||||||
|
/* this entry points to a hugepage, nothing to delete */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pd &= ENTRY_TO_PTR(pd);
|
||||||
|
if (!pd) {
|
||||||
|
/* physical address of 0x0, nothing to delete */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pdpt *pdpt = vm_phys_to_virt(ENTRY_TO_PTR(pd));
|
||||||
|
for (int i = 0; i < 512; i++) {
|
||||||
|
if (pdpt->p_pages[i] & PTE_PAGESIZE) {
|
||||||
|
/* this is a hugepage, there is nothing to delete */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pdpt->p_entries[i]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_ptab(pdpt->p_entries[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
kfree(pdpt);
|
||||||
|
}
|
||||||
|
|
||||||
void pmap_destroy(pmap_t pmap)
|
void pmap_destroy(pmap_t pmap)
|
||||||
{
|
{
|
||||||
|
struct pml4t *pml4t = vm_phys_to_virt(ENTRY_TO_PTR(pmap));
|
||||||
|
for (unsigned int i = 0; i < 256; i++) {
|
||||||
|
if (pml4t->p_entries[i]) {
|
||||||
|
delete_pdpt(pml4t->p_entries[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kfree(pml4t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void log_fault(virt_addr_t fault_addr, enum pmap_fault_flags flags)
|
static void log_fault(virt_addr_t fault_addr, enum pmap_fault_flags flags)
|
||||||
|
|||||||
Reference in New Issue
Block a user