summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authorAustin Clements <[email protected]>2010-09-02 15:18:19 -0400
committerAustin Clements <[email protected]>2010-09-02 15:18:19 -0400
commitb3cfd7fc372424d754f5478c93f6fbe756d9c80f (patch)
treee7d18ed87e1a7596e00aa8e9f94fc65773f6eec1 /vm.c
parentc7c21467c3d3c9f2a04d6fac3b8ef796470b0448 (diff)
downloadxv6-labs-b3cfd7fc372424d754f5478c93f6fbe756d9c80f.tar.gz
xv6-labs-b3cfd7fc372424d754f5478c93f6fbe756d9c80f.tar.bz2
xv6-labs-b3cfd7fc372424d754f5478c93f6fbe756d9c80f.zip
Simplify freevm using deallocuvm
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c25
1 files changed, 6 insertions, 19 deletions
diff --git a/vm.c b/vm.c
index 8cfac14..12aebe5 100644
--- a/vm.c
+++ b/vm.c
@@ -206,8 +206,7 @@ allocuvm(pde_t *pgdir, char *addr, uint sz)
return 1;
}
-// deallocate some of the user pages, in response to sbrk()
-// with a negative argument. if addr is not page-aligned,
+// deallocate some of the user pages. if addr is not page-aligned,
// then only deallocates starting at the next page boundary.
int
deallocuvm(pde_t *pgdir, char *addr, uint sz)
@@ -235,26 +234,14 @@ deallocuvm(pde_t *pgdir, char *addr, uint sz)
void
freevm(pde_t *pgdir)
{
- uint i, j, da;
+ uint i;
if(!pgdir)
- panic("freevm: no pgdir\n");
+ panic("freevm: no pgdir");
+ deallocuvm(pgdir, 0, USERTOP);
for(i = 0; i < NPDENTRIES; i++){
- da = PTE_ADDR(pgdir[i]);
- if(da != 0){
- pte_t *pgtab = (pte_t*) da;
- for(j = 0; j < NPTENTRIES; j++){
- if(pgtab[j] != 0){
- uint pa = PTE_ADDR(pgtab[j]);
- uint va = PGADDR(i, j, 0);
- if(va < USERTOP) // user memory
- kfree((void *) pa);
- pgtab[j] = 0;
- }
- }
- kfree((void *) da);
- pgdir[i] = 0;
- }
+ if(pgdir[i] & PTE_P)
+ kfree((void *) PTE_ADDR(pgdir[i]));
}
kfree((void *) pgdir);
}