Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 Jun 2004 09:13:35 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 54168 for review
Message-ID:  <200406041613.i54GDZMl006482@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=54168

Change 54168 by peter@peter_daintree on 2004/06/04 09:12:38

	oops.  If we have bit 63 set (PG_NX), then atop() in PHYS_TO_VM_PAGE() in vm/vm_page.h
	does very unhelpful things.  If we extract a pa from a pte, then be sure to mask off the
	non-pa bits.  I'm not sure if I've got them all yet, but here's a start.

Affected files ...

.. //depot/projects/hammer/sys/amd64/amd64/pmap.c#72 edit

Differences ...

==== //depot/projects/hammer/sys/amd64/amd64/pmap.c#72 (text+ko) ====

@@ -808,7 +808,7 @@
 	m = NULL;
 	mtx_lock(&Giant);
 	if ((pa = pmap_extract(pmap, va)) != 0) {
-		m = PHYS_TO_VM_PAGE(pa);
+		m = PHYS_TO_VM_PAGE(pa & PG_FRAME);
 		vm_page_lock_queues();
 		vm_page_hold(m);
 		vm_page_unlock_queues();
@@ -972,7 +972,7 @@
 			/* We just released a PT, unhold the matching PD */
 			vm_page_t pdpg;
 
-			pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va));
+			pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & PG_FRAME);
 			vm_page_unhold(pdpg);
 			if (pdpg->hold_count == 0)
 				_pmap_unwire_pte_hold(pmap, va, pdpg);
@@ -981,7 +981,7 @@
 			/* We just released a PD, unhold the matching PDP */
 			vm_page_t pdppg;
 
-			pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va));
+			pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va) & PG_FRAME);
 			vm_page_unhold(pdppg);
 			if (pdppg->hold_count == 0)
 				_pmap_unwire_pte_hold(pmap, va, pdppg);
@@ -1163,7 +1163,7 @@
 			}
 		} else {
 			/* Add reference to pdp page */
-			pdppg = PHYS_TO_VM_PAGE(*pml4);
+			pdppg = PHYS_TO_VM_PAGE(*pml4 & PG_FRAME);
 			pdppg->hold_count++;
 		}
 		pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
@@ -1210,7 +1210,7 @@
 				}
 			} else {
 				/* Add reference to the pd page */
-				pdpg = PHYS_TO_VM_PAGE(*pdp);
+				pdpg = PHYS_TO_VM_PAGE(*pdp & PG_FRAME);
 				pdpg->hold_count++;
 			}
 		}
@@ -1260,7 +1260,7 @@
 	 * hold count, and activate it.
 	 */
 	if (pd != 0 && (*pd & PG_V) != 0) {
-		m = PHYS_TO_VM_PAGE(*pd);
+		m = PHYS_TO_VM_PAGE(*pd & PG_FRAME);
 		m->hold_count++;
 	} else {
 		/*
@@ -1297,7 +1297,7 @@
 	LIST_REMOVE(pmap, pm_list);
 	mtx_unlock_spin(&allpmaps_lock);
 
-	m = PHYS_TO_VM_PAGE(pmap->pm_pml4[PML4PML4I]);
+	m = PHYS_TO_VM_PAGE(pmap->pm_pml4[PML4PML4I] & PG_FRAME);
 
 	pmap->pm_pml4[KPML4I] = 0;	/* KVA */
 	pmap->pm_pml4[DMPML4I] = 0;	/* Direct Map */
@@ -1517,7 +1517,7 @@
 		pmap_invalidate_page(kernel_pmap, va);
 	pmap->pm_stats.resident_count -= 1;
 	if (oldpte & PG_MANAGED) {
-		m = PHYS_TO_VM_PAGE(oldpte);
+		m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME);
 		if (oldpte & PG_M) {
 #if defined(PMAP_DIAGNOSTIC)
 			if (pmap_nw_modified((pt_entry_t) oldpte)) {
@@ -1533,7 +1533,7 @@
 			vm_page_flag_set(m, PG_REFERENCED);
 		return pmap_remove_entry(pmap, m, va);
 	} else {
-		mpte = PHYS_TO_VM_PAGE(*pmap_pde(pmap, va));
+		mpte = PHYS_TO_VM_PAGE(*pmap_pde(pmap, va) & PG_FRAME);
 		return pmap_unuse_pt(pmap, va, mpte);
 	}
 }
@@ -1772,14 +1772,14 @@
 			if (pbits & PG_MANAGED) {
 				m = NULL;
 				if (pbits & PG_A) {
-					m = PHYS_TO_VM_PAGE(pbits);
+					m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
 					vm_page_flag_set(m, PG_REFERENCED);
 					pbits &= ~PG_A;
 				}
 				if ((pbits & PG_M) != 0 &&
 				    pmap_track_modified(sva)) {
 					if (m == NULL)
-						m = PHYS_TO_VM_PAGE(pbits);
+						m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
 					vm_page_dirty(m);
 					pbits &= ~PG_M;
 				}
@@ -1900,7 +1900,7 @@
 		if (origpte & PG_MANAGED) {
 			if ((origpte & PG_M) && pmap_track_modified(va)) {
 				vm_page_t om;
-				om = PHYS_TO_VM_PAGE(opa);
+				om = PHYS_TO_VM_PAGE(opa & PG_FRAME);
 				vm_page_dirty(om);
 			}
 			pa |= PG_MANAGED;
@@ -2011,7 +2011,7 @@
 			if (ptepa && (*ptepa & PG_V) != 0) {
 				if (*ptepa & PG_PS)
 					panic("pmap_enter_quick: unexpected mapping into 2MB page");
-				mpte = PHYS_TO_VM_PAGE(*ptepa);
+				mpte = PHYS_TO_VM_PAGE(*ptepa & PG_FRAME);
 				mpte->hold_count++;
 			} else {
 				mpte = _pmap_allocpte(pmap, ptepindex);
@@ -2249,7 +2249,7 @@
 			continue;
 		}
 
-		srcmpte = PHYS_TO_VM_PAGE(srcptepaddr);
+		srcmpte = PHYS_TO_VM_PAGE(srcptepaddr & PG_FRAME);
 		if (srcmpte->hold_count == 0 || (srcmpte->flags & PG_BUSY))
 			continue;
 
@@ -2277,7 +2277,7 @@
 					 * accessed (referenced) bits
 					 * during the copy.
 					 */
-					m = PHYS_TO_VM_PAGE(ptetemp);
+					m = PHYS_TO_VM_PAGE(ptetemp & PG_FRAME);
 					*dst_pte = ptetemp & ~(PG_M | PG_A);
 					dst_pmap->pm_stats.resident_count++;
 					pmap_insert_entry(dst_pmap, addr,
@@ -2443,7 +2443,7 @@
 			continue;
 		}
 
-		m = PHYS_TO_VM_PAGE(tpte);
+		m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
 		KASSERT(m->phys_addr == (tpte & PG_FRAME),
 		    ("vm_page_t %p phys_addr mismatch %016jx %016jx",
 		    m, (uintmax_t)m->phys_addr, (uintmax_t)tpte));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200406041613.i54GDZMl006482>