implemented drop_page_map() (more testing needed)

This commit is contained in:
Steffen Vogel 2013-11-14 13:09:56 +01:00
parent bbb8c5c186
commit 892154c9f1

View file

@ -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)