PERFORCE change 54168 for review
Peter Wemm
peter at FreeBSD.org
Fri Jun 4 16:14:09 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=54168
Change 54168 by peter at 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));
More information about the p4-projects
mailing list