From 892154c9f11af9480fc6ba0c42f227db4ab789b0 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 14 Nov 2013 13:09:56 +0100 Subject: [PATCH] implemented drop_page_map() (more testing needed) --- arch/x86/mm/page64.c | 45 ++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/arch/x86/mm/page64.c b/arch/x86/mm/page64.c index 3465982f..2d9b1889 100644 --- a/arch/x86/mm/page64.c +++ b/arch/x86/mm/page64.c @@ -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; ientries[i] & PG_USER) { + for(j=0; jentries[j] & PG_USER) { + for(k=0; kentries[k] & PG_USER) { + for(l=0; lentries[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)