svn commit: r256029 - projects/bhyve_npt_pmap/sys/amd64/amd64

Neel Natu neel at FreeBSD.org
Thu Oct 3 18:58:36 UTC 2013


Author: neel
Date: Thu Oct  3 18:58:35 2013
New Revision: 256029
URL: http://svnweb.freebsd.org/changeset/base/256029

Log:
  Delay the initialization of the PG_xx bits until the point that it is actually
  needed.
  
  The PG_M bit can be set gratuitously for all unmanaged, writeable mappings
  regardless of the pmap type.
  
  Verify that the 'dst_pmap' and 'src_pmap' are of the same type in pmap_copy().
  
  Pointed out by:	alc@

Modified:
  projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c

Modified: projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c	Thu Oct  3 18:53:13 2013	(r256028)
+++ projects/bhyve_npt_pmap/sys/amd64/amd64/pmap.c	Thu Oct  3 18:58:35 2013	(r256029)
@@ -3836,11 +3836,6 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
 	pt_entry_t *pte, PG_G, PG_M, PG_RW, PG_V;
 	boolean_t anychanged, pv_lists_locked;
 
-	PG_G = pmap_global_bit(pmap);
-	PG_M = pmap_modified_bit(pmap);
-	PG_V = pmap_valid_bit(pmap);
-	PG_RW = pmap_rw_bit(pmap);
-
 	if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
 		pmap_remove(pmap, sva, eva);
 		return;
@@ -3850,6 +3845,10 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
 	    (VM_PROT_WRITE|VM_PROT_EXECUTE))
 		return;
 
+	PG_G = pmap_global_bit(pmap);
+	PG_M = pmap_modified_bit(pmap);
+	PG_V = pmap_valid_bit(pmap);
+	PG_RW = pmap_rw_bit(pmap);
 	pv_lists_locked = FALSE;
 resume:
 	anychanged = FALSE;
@@ -4154,16 +4153,14 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 		newpte |= PG_G;
 	newpte |= pmap_cache_bits(pmap, m->md.pat_mode, 0);
 
-	if (pmap_emulate_ad_bits(pmap)) {
-		/*
-		 * Set modified bit gratuitously for writeable mappings if
-		 * the page is unmanaged. We do not want to take a fault
-		 * to do the dirty bit accounting for these mappings.
-		 */
-		if ((m->oflags & VPO_UNMANAGED) != 0) {
-			if ((newpte & PG_RW) != 0)
-				newpte |= PG_M;
-		}
+	/*
+	 * Set modified bit gratuitously for writeable mappings if
+	 * the page is unmanaged. We do not want to take a fault
+	 * to do the dirty bit accounting for these mappings.
+	 */
+	if ((m->oflags & VPO_UNMANAGED) != 0) {
+		if ((newpte & PG_RW) != 0)
+			newpte |= PG_M;
 	}
 
 	mpte = NULL;
@@ -4762,6 +4759,9 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pm
 	if (dst_addr != src_addr)
 		return;
 
+	if (dst_pmap->pm_type != src_pmap->pm_type)
+		return;
+
 	if (pmap_emulate_ad_bits(dst_pmap))
 		return;
 


More information about the svn-src-projects mailing list