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
((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();
}
((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);