diff options
author | Austin Clements <[email protected]> | 2010-09-02 15:18:19 -0400 |
---|---|---|
committer | Austin Clements <[email protected]> | 2010-09-02 15:18:19 -0400 |
commit | b3cfd7fc372424d754f5478c93f6fbe756d9c80f (patch) | |
tree | e7d18ed87e1a7596e00aa8e9f94fc65773f6eec1 /vm.c | |
parent | c7c21467c3d3c9f2a04d6fac3b8ef796470b0448 (diff) | |
download | xv6-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.c | 25 |
1 files changed, 6 insertions, 19 deletions
@@ -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); } |