Module Name: src Committed By: reinoud Date: Tue Aug 30 11:53:22 UTC 2011
Modified Files: src/sys/arch/usermode/usermode: pmap.c Log Message: Cleanup PV_UNMAGED handling in pmap_do_enter To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/arch/usermode/usermode/pmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/usermode/usermode/pmap.c diff -u src/sys/arch/usermode/usermode/pmap.c:1.45 src/sys/arch/usermode/usermode/pmap.c:1.46 --- src/sys/arch/usermode/usermode/pmap.c:1.45 Tue Aug 30 11:40:46 2011 +++ src/sys/arch/usermode/usermode/pmap.c Tue Aug 30 11:53:22 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.45 2011/08/30 11:40:46 reinoud Exp $ */ +/* $NetBSD: pmap.c,v 1.46 2011/08/30 11:53:22 reinoud Exp $ */ /*- * Copyright (c) 2011 Reinoud Zandijk <rein...@netbsd.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.45 2011/08/30 11:40:46 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.46 2011/08/30 11:53:22 reinoud Exp $"); #include "opt_memsize.h" #include "opt_kmempages.h" @@ -508,11 +508,12 @@ static void pv_update(struct pv_entry *pv) { - int pflags; + int pflags, vflags; int mmap_ppl; /* get our per-physical-page flags */ pflags = pv_table[pv->pv_ppn].pv_pflags; + vflags = pv_table[pv->pv_ppn].pv_vflags; /* create referenced/modified emulation */ if ((pv->pv_prot & VM_PROT_WRITE) && @@ -523,6 +524,11 @@ mmap_ppl = PROT_READ; else mmap_ppl = PROT_NONE; + + /* unmanaged pages are special; they dont track r/m */ + if (vflags & PV_UNMANAGED) + mmap_ppl = PROT_READ | PROT_WRITE; + pv->pv_mmap_ppl = mmap_ppl; } @@ -588,9 +594,7 @@ if (unmanaged) { /* dont track r/m */ pv->pv_vflags |= PV_UNMANAGED; - ppv->pv_pflags |= PV_MODIFIED | PV_REFERENCED; /* XXX */ } else { - /* XXX flag it dirty(?) if prot write? */ if (flags & VM_PROT_WRITE) ppv->pv_pflags |= PV_REFERENCED | PV_MODIFIED; else if (flags & (VM_PROT_ALL))