Module Name:    src
Committed By:   uebayasi
Date:           Wed Feb 10 13:23:57 UTC 2010

Modified Files:
        src/sys/arch/arm/arm32 [uebayasi-xip]: pmap.c

Log Message:
Convert pmap_remove_pv() / pmap_modify_pv() to take struct vm_page_md *.


To generate a diff of this commit:
cvs rdiff -u -r1.211.2.1 -r1.211.2.2 src/sys/arch/arm/arm32/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/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.211.2.1 src/sys/arch/arm/arm32/pmap.c:1.211.2.2
--- src/sys/arch/arm/arm32/pmap.c:1.211.2.1	Wed Feb 10 12:53:26 2010
+++ src/sys/arch/arm/arm32/pmap.c	Wed Feb 10 13:23:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.211.2.1 2010/02/10 12:53:26 uebayasi Exp $	*/
+/*	$NetBSD: pmap.c,v 1.211.2.2 2010/02/10 13:23:57 uebayasi Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -211,7 +211,7 @@
 #include <machine/param.h>
 #include <arm/arm32/katelib.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211.2.1 2010/02/10 12:53:26 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211.2.2 2010/02/10 13:23:57 uebayasi Exp $");
 
 #ifdef PMAP_DEBUG
 
@@ -639,8 +639,8 @@
 static void		pmap_enter_pv(struct vm_page *, struct pv_entry *,
 			    pmap_t, vaddr_t, u_int);
 static struct pv_entry *pmap_find_pv(struct vm_page_md *, pmap_t, vaddr_t);
-static struct pv_entry *pmap_remove_pv(struct vm_page *, pmap_t, vaddr_t);
-static u_int		pmap_modify_pv(struct vm_page *, pmap_t, vaddr_t,
+static struct pv_entry *pmap_remove_pv(struct vm_page_md *, paddr_t, pmap_t, vaddr_t);
+static u_int		pmap_modify_pv(struct vm_page_md *, paddr_t, pmap_t, vaddr_t,
 			    u_int, u_int);
 
 static void		pmap_pinit(pmap_t);
@@ -960,20 +960,20 @@
  * => we return the removed pv
  */
 static struct pv_entry *
-pmap_remove_pv(struct vm_page *pg, pmap_t pm, vaddr_t va)
+pmap_remove_pv(struct vm_page_md *md, paddr_t pa, pmap_t pm, vaddr_t va)
 {
 	struct pv_entry *pv, **prevptr;
 
 	NPDEBUG(PDB_PVDUMP,
-	    printf("pmap_remove_pv: pm %p, pg %p, va 0x%08lx\n", pm, pg, va));
+	    printf("pmap_remove_pv: pm %p, md %p, va 0x%08lx\n", pm, md, va));
 
-	prevptr = &SLIST_FIRST(&pg->mdpage.pvh_list); /* prev pv_entry ptr */
+	prevptr = &SLIST_FIRST(&md->pvh_list); /* prev pv_entry ptr */
 	pv = *prevptr;
 
 	while (pv) {
 		if (pv->pv_pmap == pm && pv->pv_va == va) {	/* match? */
-			NPDEBUG(PDB_PVDUMP, printf("pmap_remove_pv: pm %p, pg "
-			    "%p, flags 0x%x\n", pm, pg, pv->pv_flags));
+			NPDEBUG(PDB_PVDUMP, printf("pmap_remove_pv: pm %p, md "
+			    "%p\n", pm, md));
 			if (pv->pv_flags & PVF_WIRED) {
 				--pm->pm_stats.wired_count;
 			}
@@ -981,14 +981,14 @@
 			if (pm == pmap_kernel()) {
 				PMAPCOUNT(kernel_unmappings);
 				if (pv->pv_flags & PVF_WRITE)
-					pg->mdpage.krw_mappings--;
+					md->krw_mappings--;
 				else
-					pg->mdpage.kro_mappings--;
+					md->kro_mappings--;
 			} else {
 				if (pv->pv_flags & PVF_WRITE)
-					pg->mdpage.urw_mappings--;
+					md->urw_mappings--;
 				else
-					pg->mdpage.uro_mappings--;
+					md->uro_mappings--;
 			}
 
 			PMAPCOUNT(unmappings);
@@ -1000,12 +1000,12 @@
 			 * this was the last mapping, discard the contents,
 			 * otherwise sync the i-cache for this page.
 			 */
-			if (PV_IS_EXEC_P(pg->mdpage.pvh_attrs)) {
-				if (SLIST_EMPTY(&pg->mdpage.pvh_list)) {
-					pg->mdpage.pvh_attrs &= ~PVF_EXEC;
+			if (PV_IS_EXEC_P(md->pvh_attrs)) {
+				if (SLIST_EMPTY(&md->pvh_list)) {
+					md->pvh_attrs &= ~PVF_EXEC;
 					PMAPCOUNT(exec_discarded_unmap);
 				} else {
-					pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
+					pmap_syncicache_page(md, pa);
 					PMAPCOUNT(exec_synced_unmap);
 				}
 			}
@@ -1021,18 +1021,18 @@
 	 * If we no longer have a WRITEABLE KENTRY at the head of list,
 	 * clear the KMOD attribute from the page.
 	 */
-	if (SLIST_FIRST(&pg->mdpage.pvh_list) == NULL
-	    || (SLIST_FIRST(&pg->mdpage.pvh_list)->pv_flags & PVF_KWRITE) != PVF_KWRITE)
-		pg->mdpage.pvh_attrs &= ~PVF_KMOD;
+	if (SLIST_FIRST(&md->pvh_list) == NULL
+	    || (SLIST_FIRST(&md->pvh_list)->pv_flags & PVF_KWRITE) != PVF_KWRITE)
+		md->pvh_attrs &= ~PVF_KMOD;
 
 	/*
 	 * If this was a writeable page and there are no more writeable
 	 * mappings (ignoring KMPAGE), clear the WRITE flag and writeback
 	 * the contents to memory.
 	 */
-	if (pg->mdpage.krw_mappings + pg->mdpage.urw_mappings == 0)
-		pg->mdpage.pvh_attrs &= ~PVF_WRITE;
-	KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
+	if (md->krw_mappings + md->urw_mappings == 0)
+		md->pvh_attrs &= ~PVF_WRITE;
+	KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
 #endif /* PMAP_CACHE_VIPT */
 
 	return(pv);				/* return removed pv */
@@ -1051,7 +1051,7 @@
  * Modify a physical-virtual mapping in the pv table
  */
 static u_int
-pmap_modify_pv(struct vm_page *pg, pmap_t pm, vaddr_t va,
+pmap_modify_pv(struct vm_page_md *md, paddr_t pa, pmap_t pm, vaddr_t va,
     u_int clr_mask, u_int set_mask)
 {
 	struct pv_entry *npv;
@@ -1060,22 +1060,22 @@
 	KASSERT((clr_mask & PVF_KENTRY) == 0);
 	KASSERT((set_mask & PVF_KENTRY) == 0);
 
-	if ((npv = pmap_find_pv(&pg->mdpage, pm, va)) == NULL)
+	if ((npv = pmap_find_pv(md, pm, va)) == NULL)
 		return (0);
 
 	NPDEBUG(PDB_PVDUMP,
-	    printf("pmap_modify_pv: pm %p, pg %p, clr 0x%x, set 0x%x, flags 0x%x\n", pm, pg, clr_mask, set_mask, npv->pv_flags));
+	    printf("pmap_modify_pv: pm %p, md %p, clr 0x%x, set 0x%x, flags 0x%x\n", pm, md, clr_mask, set_mask, npv->pv_flags));
 
 	/*
 	 * There is at least one VA mapping this page.
 	 */
 
 	if (clr_mask & (PVF_REF | PVF_MOD)) {
-		pg->mdpage.pvh_attrs |= set_mask & (PVF_REF | PVF_MOD);
+		md->pvh_attrs |= set_mask & (PVF_REF | PVF_MOD);
 #ifdef PMAP_CACHE_VIPT
-		if ((pg->mdpage.pvh_attrs & (PVF_DMOD|PVF_NC)) != PVF_NC)
-			pg->mdpage.pvh_attrs |= PVF_DIRTY;
-		KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
+		if ((md->pvh_attrs & (PVF_DMOD|PVF_NC)) != PVF_NC)
+			md->pvh_attrs |= PVF_DIRTY;
+		KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
 #endif
 	}
 
@@ -1092,38 +1092,38 @@
 	if ((flags ^ oflags) & PVF_WRITE) {
 		if (pm == pmap_kernel()) {
 			if (flags & PVF_WRITE) {
-				pg->mdpage.krw_mappings++;
-				pg->mdpage.kro_mappings--;
+				md->krw_mappings++;
+				md->kro_mappings--;
 			} else {
-				pg->mdpage.kro_mappings++;
-				pg->mdpage.krw_mappings--;
+				md->kro_mappings++;
+				md->krw_mappings--;
 			}
 		} else {
 			if (flags & PVF_WRITE) {
-				pg->mdpage.urw_mappings++;
-				pg->mdpage.uro_mappings--;
+				md->urw_mappings++;
+				md->uro_mappings--;
 			} else {
-				pg->mdpage.uro_mappings++;
-				pg->mdpage.urw_mappings--;
+				md->uro_mappings++;
+				md->urw_mappings--;
 			}
 		}
 	}
 #ifdef PMAP_CACHE_VIPT
-	if (pg->mdpage.urw_mappings + pg->mdpage.krw_mappings == 0)
-		pg->mdpage.pvh_attrs &= ~PVF_WRITE;
+	if (md->urw_mappings + md->krw_mappings == 0)
+		md->pvh_attrs &= ~PVF_WRITE;
 	/*
 	 * We have two cases here: the first is from enter_pv (new exec
 	 * page), the second is a combined pmap_remove_pv/pmap_enter_pv.
 	 * Since in latter, pmap_enter_pv won't do anything, we just have
 	 * to do what pmap_remove_pv would do.
 	 */
-	if ((PV_IS_EXEC_P(flags) && !PV_IS_EXEC_P(pg->mdpage.pvh_attrs))
-	    || (PV_IS_EXEC_P(pg->mdpage.pvh_attrs)
+	if ((PV_IS_EXEC_P(flags) && !PV_IS_EXEC_P(md->pvh_attrs))
+	    || (PV_IS_EXEC_P(md->pvh_attrs)
 		|| (!(flags & PVF_WRITE) && (oflags & PVF_WRITE)))) {
-		pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
+		pmap_syncicache_page(md, pa);
 		PMAPCOUNT(exec_synced_remap);
 	}
-	KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
+	KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
 #endif
 
 	PMAPCOUNT(remappings);
@@ -2866,7 +2866,7 @@
 			 * We're changing the attrs of an existing mapping.
 			 */
 			simple_lock(&pg->mdpage.pvh_slock);
-			oflags = pmap_modify_pv(pg, pm, va,
+			oflags = pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, va,
 			    PVF_WRITE | PVF_EXEC | PVF_WIRED |
 			    PVF_MOD | PVF_REF, nflags);
 			simple_unlock(&pg->mdpage.pvh_slock);
@@ -2894,7 +2894,7 @@
 				 * must remove it from the PV list
 				 */
 				simple_lock(&opg->mdpage.pvh_slock);
-				pv = pmap_remove_pv(opg, pm, va);
+				pv = pmap_remove_pv(&opg->mdpage, VM_PAGE_TO_PHYS(opg), pm, va);
 				pmap_vac_me_harder(opg, pm, 0);
 				simple_unlock(&opg->mdpage.pvh_slock);
 				oflags = pv->pv_flags;
@@ -2957,7 +2957,7 @@
 			 * at this address.
 			 */
 			simple_lock(&opg->mdpage.pvh_slock);
-			pv = pmap_remove_pv(opg, pm, va);
+			pv = pmap_remove_pv(&opg->mdpage, VM_PAGE_TO_PHYS(opg), pm, va);
 			pmap_vac_me_harder(opg, pm, 0);
 			simple_unlock(&opg->mdpage.pvh_slock);
 			oflags = pv->pv_flags;
@@ -3151,7 +3151,7 @@
 			if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) {
 				struct pv_entry *pv;
 				simple_lock(&pg->mdpage.pvh_slock);
-				pv = pmap_remove_pv(pg, pm, sva);
+				pv = pmap_remove_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, sva);
 				pmap_vac_me_harder(pg, pm, 0);
 				simple_unlock(&pg->mdpage.pvh_slock);
 				if (pv != NULL) {
@@ -3279,7 +3279,7 @@
 	KASSERT(arm_cache_prefer_mask == 0 || pg->mdpage.pvh_attrs & (PVF_COLORED|PVF_NC));
 	KASSERT((pg->mdpage.pvh_attrs & PVF_KMPAGE) == 0);
 
-	pv = pmap_remove_pv(pg, pmap_kernel(), va);
+	pv = pmap_remove_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pmap_kernel(), va);
 	KASSERT(pv);
 	KASSERT(pv->pv_flags & PVF_KENTRY);
 
@@ -3625,7 +3625,7 @@
 
 				if (pg != NULL) {
 					simple_lock(&pg->mdpage.pvh_slock);
-					f = pmap_modify_pv(pg, pm, sva,
+					f = pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, sva,
 					    clr_mask, 0);
 					pmap_vac_me_harder(pg, pm, sva);
 					simple_unlock(&pg->mdpage.pvh_slock);
@@ -4077,7 +4077,7 @@
 	if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) {
 		/* Update the wired bit in the pv entry for this page. */
 		simple_lock(&pg->mdpage.pvh_slock);
-		(void) pmap_modify_pv(pg, pm, va, PVF_WIRED, 0);
+		(void) pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, va, PVF_WIRED, 0);
 		simple_unlock(&pg->mdpage.pvh_slock);
 	}
 

Reply via email to