From owner-p4-projects@FreeBSD.ORG Fri Jun 4 09:14:09 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5E9B716A4D0; Fri, 4 Jun 2004 09:14:09 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 33F6016A4CE for ; Fri, 4 Jun 2004 09:14:09 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 184AC43D3F for ; Fri, 4 Jun 2004 09:14:09 -0700 (PDT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i54GDawh006485 for ; Fri, 4 Jun 2004 09:13:36 -0700 (PDT) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i54GDZMl006482 for perforce@freebsd.org; Fri, 4 Jun 2004 09:13:35 -0700 (PDT) (envelope-from peter@freebsd.org) Date: Fri, 4 Jun 2004 09:13:35 -0700 (PDT) Message-Id: <200406041613.i54GDZMl006482@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 54168 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Jun 2004 16:14:09 -0000 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));