X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=kernel%2Fmem%2Fpagetable.cc;h=2eb7e6996447f138ca7b5e41bcf9b12caa98e8c9;hp=88b97ea35be7d0e073cffaacc29723b9ec05cdfb;hb=1ac390fe1e18444008857b056c947710be9621a8;hpb=b4bfc871337ca32ce83407916a87db2524729ca9 diff --git a/kernel/mem/pagetable.cc b/kernel/mem/pagetable.cc index 88b97ea..2eb7e69 100644 --- a/kernel/mem/pagetable.cc +++ b/kernel/mem/pagetable.cc @@ -157,7 +157,8 @@ namespace Mem { PTE newpte = PTE::addr_to_pte(region.offset) | flags; PTE oldpte = newpte.xchg_pte(ptable, i); - retain_if_phys(region.offset); + if (!newpte.addronly_pte()) + retain_if_phys(region.offset); if (oldpte) { // vaddr is only for process aspaces, so don't worry @@ -167,7 +168,8 @@ namespace Mem { ((i - start) << PTE::page_shift); kill_pte(vaddr, oldpte.pte_to_addr(), - oldpte.dirty_pte(), oldpte.valid_pte()); + oldpte.dirty_pte(), oldpte.valid_pte(), + oldpte.addronly_pte()); } else { page->retain(); } @@ -250,7 +252,8 @@ namespace Mem { ((i - start) << PTE::page_shift); kill_pte(vaddr, oldpte.pte_to_addr(), - oldpte.dirty_pte(), oldpte.valid_pte()); + oldpte.dirty_pte(), oldpte.valid_pte(), + oldpte.addronly_pte()); } assert(page->inuse.refcount > 1);