implemented drop_page_map() (more testing needed)
This commit is contained in:
parent
bbb8c5c186
commit
892154c9f1
1 changed files with 31 additions and 14 deletions
|
@ -218,33 +218,50 @@ int create_page_map(task_t* task, int copy)
|
|||
|
||||
int drop_page_map(void)
|
||||
{
|
||||
#if 0
|
||||
page_map_t* pgd = per_core(current_task)->page_map;
|
||||
size_t phy_pgd = virt_to_phys((size_t) pgd);
|
||||
#if 1
|
||||
kprintf("TODO: test drop_page_map()\n");
|
||||
return -EINVAL; // TODO
|
||||
#else
|
||||
task_t* task = per_core(current_task);
|
||||
uint32_t i;
|
||||
page_map_t* pml4, * pdpt, * pgd, * pgt;
|
||||
size_t phys;
|
||||
uint32_t i, j, k, l;
|
||||
|
||||
if (BUILTIN_EXPECT(pgd == &boot_pgd, 0))
|
||||
pml4 = task->page_map;
|
||||
|
||||
if (BUILTIN_EXPECT(pml4 == &boot_pml4, 0))
|
||||
return -EINVAL;
|
||||
|
||||
spinlock_lock(&task->page_lock);
|
||||
|
||||
for(i=0; i<1024; i++) {
|
||||
if (pgd->entries[i] & PG_USER) {
|
||||
put_page(pgd->entries[i] & PAGE_MASK);
|
||||
pgd->entries[i] = 0;
|
||||
|
||||
// delete all user pages and tables
|
||||
for(i=0; i<PAGE_MAP_ENTRIES; i++) { // pml4
|
||||
if (pml4->entries[i] & PG_USER) {
|
||||
for(j=0; j<PAGE_MAP_ENTRIES; j++) { // pdpt
|
||||
if (pdpt->entries[j] & PG_USER) {
|
||||
for(k=0; k<PAGE_MAP_ENTRIES; k++) { // pgd
|
||||
if (pgd->entries[k] & PG_USER) {
|
||||
for(l=0; l<PAGE_MAP_ENTRIES; l++) { // pgt
|
||||
if (pgt->entries[l] & PG_USER)
|
||||
put_page(pgt->entries[l] & PAGE_MASK);
|
||||
}
|
||||
// TODO: put pgt
|
||||
}
|
||||
}
|
||||
// TODO: put pgd
|
||||
}
|
||||
}
|
||||
// TODO: put pdpt
|
||||
}
|
||||
}
|
||||
|
||||
// freeing the page directory
|
||||
put_page(phy_pgd);
|
||||
|
||||
put_page(virt_to_phys((size_t) pml4));
|
||||
task->page_map = NULL;
|
||||
|
||||
spinlock_unlock(&task->page_lock);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t virt_to_phys(size_t viraddr)
|
||||
|
|
Loading…
Add table
Reference in a new issue