#include <kern/mem.h>
#include <kern/pagealloc.h>
-#include <kern/pagetable.h>
+#include <kern/generic-pagetable.h>
#include <kern/generic-pte.h>
#include <lowlevel/atomic.h>
#include <util/misc.h>
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);