Module Name: src Committed By: uebayasi Date: Thu Feb 25 04:11:29 UTC 2010
Modified Files: src/sys/arch/hppa/hppa [uebayasi-xip]: pmap.c src/sys/arch/hppa/include [uebayasi-xip]: pmap.h Log Message: Use VM_PAGE_TO_MD(). Only compile tested. To generate a diff of this commit: cvs rdiff -u -r1.63 -r1.63.2.1 src/sys/arch/hppa/hppa/pmap.c cvs rdiff -u -r1.23 -r1.23.2.1 src/sys/arch/hppa/include/pmap.h 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/hppa/hppa/pmap.c diff -u src/sys/arch/hppa/hppa/pmap.c:1.63 src/sys/arch/hppa/hppa/pmap.c:1.63.2.1 --- src/sys/arch/hppa/hppa/pmap.c:1.63 Fri Dec 18 19:20:35 2009 +++ src/sys/arch/hppa/hppa/pmap.c Thu Feb 25 04:11:29 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.63 2009/12/18 19:20:35 skrll Exp $ */ +/* $NetBSD: pmap.c,v 1.63.2.1 2010/02/25 04:11:29 uebayasi Exp $ */ /*- * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. @@ -65,7 +65,10 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.63 2009/12/18 19:20:35 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.63.2.1 2010/02/25 04:11:29 uebayasi Exp $"); + +#include "opt_device_page.h" +#include "opt_xip.h" #include <sys/param.h> #include <sys/systm.h> @@ -486,16 +489,18 @@ pmap_dump_pv(paddr_t pa) { struct vm_page *pg; + struct vm_page_md *md; struct pv_entry *pve; pg = PHYS_TO_VM_PAGE(pa); - mutex_enter(&pg->mdpage.pvh_lock); - printf("pg %p attr 0x%08x aliases %d\n", pg, pg->mdpage.pvh_attrs, - pg->mdpage.pvh_aliases); - for (pve = pg->mdpage.pvh_list; pve; pve = pve->pv_next) + md = VM_PAGE_TO_MD(pg); + mutex_enter(&md->pvh_lock); + printf("pg %p attr 0x%08x aliases %d\n", pg, md->pvh_attrs, + md->pvh_aliases); + for (pve = md->pvh_list; pve; pve = pve->pv_next) printf("%x:%lx\n", pve->pv_pmap->pm_space, pve->pv_va & PV_VAMASK); - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); } #endif @@ -507,12 +512,13 @@ * * - Shouldn't be called for pages that have been marked uncacheable by * pmap_kenter_pa. - * - Must be called with pg->mdpage.pvh_lock held. + * - Must be called with md->pvh_lock held. */ void pmap_check_alias(struct vm_page *pg, struct pv_entry *pve, vaddr_t va, pt_entry_t *ptep) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); bool nonequiv = false; struct pv_entry *tpve; u_int attrs; @@ -521,8 +527,8 @@ ("%s(%p, %p, 0x%lx, %p)\n", __func__, pg, pve, va, ptep)); /* we should only be looking if we're not PVF_NC */ - KASSERT((pg->mdpage.pvh_attrs & PVF_NC) == 0); - KASSERT(mutex_owned(&pg->mdpage.pvh_lock)); + KASSERT((md->pvh_attrs & PVF_NC) == 0); + KASSERT(mutex_owned(&md->pvh_lock)); if (ptep) { attrs = pmap_pvh_attrs(*ptep); @@ -578,7 +584,7 @@ * mark all mappings as uncacheable (if they're not * already marked as such). */ - pg->mdpage.pvh_aliases++; + md->pvh_aliases++; if ((attrs & PVF_UNCACHEABLE) == 0) __changebit(pg, PVF_UNCACHEABLE, 0); @@ -595,8 +601,8 @@ * it cacheable if all non-equiv aliases are gone. */ - pg->mdpage.pvh_aliases--; - if (pg->mdpage.pvh_aliases == 0) { + md->pvh_aliases--; + if (md->pvh_aliases == 0) { __changebit(pg, 0, PVF_UNCACHEABLE); DPRINTF(PDB_FOLLOW|PDB_ALIAS, @@ -639,26 +645,29 @@ pmap_pv_enter(struct vm_page *pg, struct pv_entry *pve, pmap_t pm, vaddr_t va, struct vm_page *pdep, u_int flags) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); + DPRINTF(PDB_FOLLOW|PDB_PV, ("%s(%p, %p, %p, 0x%lx, %p, 0x%x)\n", __func__, pg, pve, pm, va, pdep, flags)); - KASSERT(mutex_owned(&pg->mdpage.pvh_lock)); + KASSERT(mutex_owned(&md->pvh_lock)); pve->pv_pmap = pm; pve->pv_va = va | flags; pve->pv_ptp = pdep; - pve->pv_next = pg->mdpage.pvh_list; - pg->mdpage.pvh_list = pve; + pve->pv_next = md->pvh_list; + md->pvh_list = pve; } static inline struct pv_entry * pmap_pv_remove(struct vm_page *pg, pmap_t pmap, vaddr_t va) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); struct pv_entry **pve, *pv; - KASSERT(mutex_owned(&pg->mdpage.pvh_lock)); + KASSERT(mutex_owned(&md->pvh_lock)); - for (pv = *(pve = &pg->mdpage.pvh_list); + for (pv = *(pve = &md->pvh_list); pv; pv = *(pve = &(*pve)->pv_next)) if (pv->pv_pmap == pmap && (pv->pv_va & PV_VAMASK) == va) { *pve = pv->pv_next; @@ -1182,7 +1191,8 @@ continue; sheep = PHYS_TO_VM_PAGE(PTE_PAGE(*pde)); - for (haggis = sheep->mdpage.pvh_list; haggis != NULL; ) + struct vm_page_md * const md = VM_PAGE_TO_MD(sheap); + for (haggis = md->pvh_list; haggis != NULL; ) if (haggis->pv_pmap == pmap) { DPRINTF(PDB_FOLLOW, (" 0x%lx", @@ -1196,7 +1206,7 @@ * exploit the sacred knowledge of * lambeous ozzmosis */ - haggis = sheep->mdpage.pvh_list; + haggis = md->pvh_list; } else haggis = haggis->pv_next; } @@ -1279,10 +1289,11 @@ } pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)); - mutex_enter(&pg->mdpage.pvh_lock); + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); + mutex_enter(&md->pvh_lock); pve = pmap_pv_remove(pg, pmap, va); - pg->mdpage.pvh_attrs |= pmap_pvh_attrs(pte); - mutex_exit(&pg->mdpage.pvh_lock); + md->pvh_attrs |= pmap_pvh_attrs(pte); + mutex_exit(&md->pvh_lock); } else { DPRINTF(PDB_ENTER, ("%s: new mapping 0x%lx -> 0x%lx\n", __func__, va, pa)); @@ -1296,11 +1307,12 @@ } if (pmap_initialized && (pg = PHYS_TO_VM_PAGE(pa))) { - mutex_enter(&pg->mdpage.pvh_lock); + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); + mutex_enter(&md->pvh_lock); if (!pve && !(pve = pmap_pv_alloc())) { if (flags & PMAP_CANFAIL) { - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); PMAP_UNLOCK(pmap); return (ENOMEM); } @@ -1309,7 +1321,7 @@ pmap_pv_enter(pg, pve, pmap, va, ptp, 0); pmap_check_alias(pg, pve, va, &pte); - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); } else if (pve) { pmap_pv_free(pve); } @@ -1378,17 +1390,18 @@ if (pmap_initialized && (pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)))) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - mutex_enter(&pg->mdpage.pvh_lock); + mutex_enter(&md->pvh_lock); pve = pmap_pv_remove(pg, pmap, sva); - pmap_check_alias(pg, pg->mdpage.pvh_list, + pmap_check_alias(pg, md->pvh_list, sva, NULL); - pg->mdpage.pvh_attrs |= pmap_pvh_attrs(pte); + md->pvh_attrs |= pmap_pvh_attrs(pte); - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); if (pve != NULL) pmap_pv_free(pve); @@ -1438,9 +1451,10 @@ continue; pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)); - mutex_enter(&pg->mdpage.pvh_lock); - pg->mdpage.pvh_attrs |= pmap_pvh_attrs(pte); - mutex_exit(&pg->mdpage.pvh_lock); + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); + mutex_enter(&md->pvh_lock); + md->pvh_attrs |= pmap_pvh_attrs(pte); + mutex_exit(&md->pvh_lock); pmap_pte_flush(pmap, sva, pte); pte &= ~PTE_PROT(TLB_AR_MASK); @@ -1455,16 +1469,17 @@ void pmap_page_remove(struct vm_page *pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); struct pv_entry *pve, *npve, **pvp; DPRINTF(PDB_FOLLOW|PDB_PV, ("%s(%p)\n", __func__, pg)); - if (pg->mdpage.pvh_list == NULL) + if (md->pvh_list == NULL) return; - mutex_enter(&pg->mdpage.pvh_lock); - pvp = &pg->mdpage.pvh_list; - for (pve = pg->mdpage.pvh_list; pve; pve = npve) { + mutex_enter(&md->pvh_lock); + pvp = &md->pvh_list; + for (pve = md->pvh_list; pve; pve = npve) { pmap_t pmap = pve->pv_pmap; vaddr_t va = pve->pv_va & PV_VAMASK; volatile pt_entry_t *pde; @@ -1486,7 +1501,7 @@ continue; } - pg->mdpage.pvh_attrs |= pmap_pvh_attrs(pte); + md->pvh_attrs |= pmap_pvh_attrs(pte); pmap_pte_flush(pmap, va, pte); if (pte & PTE_PROT(TLB_WIRED)) @@ -1498,7 +1513,7 @@ PMAP_UNLOCK(pmap); } *pvp = NULL; - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); DPRINTF(PDB_FOLLOW|PDB_PV, ("%s: leaving\n", __func__)); } @@ -1541,36 +1556,38 @@ bool pmap_changebit(struct vm_page *pg, u_int set, u_int clear) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); bool rv; DPRINTF(PDB_FOLLOW|PDB_BITS, ("%s(%p, %x, %x)\n", __func__, pg, set, clear)); - mutex_enter(&pg->mdpage.pvh_lock); + mutex_enter(&md->pvh_lock); rv = __changebit(pg, set, clear); - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); return rv; } /* - * Must be called with pg->mdpage.pvh_lock held. + * Must be called with md->pvh_lock held. */ static bool __changebit(struct vm_page *pg, u_int set, u_int clear) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); struct pv_entry *pve; int res; - KASSERT(mutex_owned(&pg->mdpage.pvh_lock)); + KASSERT(mutex_owned(&md->pvh_lock)); KASSERT(((set | clear) & ~(PVF_MOD|PVF_REF|PVF_UNCACHEABLE|PVF_WRITE)) == 0); /* preserve other bits */ - res = pg->mdpage.pvh_attrs & (set | clear); - pg->mdpage.pvh_attrs ^= res; + res = md->pvh_attrs & (set | clear); + md->pvh_attrs ^= res; - for (pve = pg->mdpage.pvh_list; pve; pve = pve->pv_next) { + for (pve = md->pvh_list; pve; pve = pve->pv_next) { pmap_t pmap = pve->pv_pmap; vaddr_t va = pve->pv_va & PV_VAMASK; volatile pt_entry_t *pde; @@ -1590,7 +1607,7 @@ pte |= set; if (!(pve->pv_va & PV_KENTER)) { - pg->mdpage.pvh_attrs |= pmap_pvh_attrs(pte); + md->pvh_attrs |= pmap_pvh_attrs(pte); res |= pmap_pvh_attrs(opte); } @@ -1607,15 +1624,16 @@ bool pmap_testbit(struct vm_page *pg, u_int bit) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); struct pv_entry *pve; pt_entry_t pte; int ret; DPRINTF(PDB_FOLLOW|PDB_BITS, ("%s(%p, %x)\n", __func__, pg, bit)); - mutex_enter(&pg->mdpage.pvh_lock); + mutex_enter(&md->pvh_lock); - for (pve = pg->mdpage.pvh_list; !(pg->mdpage.pvh_attrs & bit) && pve; + for (pve = md->pvh_list; !(md->pvh_attrs & bit) && pve; pve = pve->pv_next) { pmap_t pm = pve->pv_pmap; @@ -1623,10 +1641,10 @@ if (pve->pv_va & PV_KENTER) continue; - pg->mdpage.pvh_attrs |= pmap_pvh_attrs(pte); + md->pvh_attrs |= pmap_pvh_attrs(pte); } - ret = ((pg->mdpage.pvh_attrs & bit) != 0); - mutex_exit(&pg->mdpage.pvh_lock); + ret = ((md->pvh_attrs & bit) != 0); + mutex_exit(&md->pvh_lock); return ret; } @@ -1687,15 +1705,16 @@ static inline void pmap_flush_page(struct vm_page *pg, bool purge) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); struct pv_entry *pve; DPRINTF(PDB_FOLLOW|PDB_CACHE, ("%s(%p, %d)\n", __func__, pg, purge)); - KASSERT(!(pg->mdpage.pvh_attrs & PVF_NC)); + KASSERT(!(md->pvh_attrs & PVF_NC)); /* purge cache for all possible mappings for the pa */ - mutex_enter(&pg->mdpage.pvh_lock); - for (pve = pg->mdpage.pvh_list; pve; pve = pve->pv_next) { + mutex_enter(&md->pvh_lock); + for (pve = md->pvh_list; pve; pve = pve->pv_next) { vaddr_t va = pve->pv_va & PV_VAMASK; if (purge) @@ -1703,7 +1722,7 @@ else fdcache(pve->pv_pmap->pm_space, va, PAGE_SIZE); } - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); } /* @@ -1717,7 +1736,7 @@ DPRINTF(PDB_FOLLOW|PDB_PHYS, ("%s(%lx)\n", __func__, pa)); - KASSERT(PHYS_TO_VM_PAGE(pa)->mdpage.pvh_list == NULL); + KASSERT(VM_PAGE_TO_MD(PHYS_TO_VM_PAGE(pa))->pvh_list == NULL); memset((void *)pa, 0, PAGE_SIZE); fdcache(HPPA_SID_KERNEL, pa, PAGE_SIZE); @@ -1735,7 +1754,7 @@ DPRINTF(PDB_FOLLOW|PDB_PHYS, ("%s(%lx, %lx)\n", __func__, spa, dpa)); - KASSERT(PHYS_TO_VM_PAGE(dpa)->mdpage.pvh_list == NULL); + KASSERT(VM_PAGE_TO_MD(PHYS_TO_VM_PAGE(dpa))->pvh_list == NULL); pmap_flush_page(srcpg, false); @@ -1784,13 +1803,14 @@ pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)); if (pg != NULL) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); KASSERT(pa < HPPA_IOBEGIN); - mutex_enter(&pg->mdpage.pvh_lock); + mutex_enter(&md->pvh_lock); if (flags & PMAP_NOCACHE) - pg->mdpage.pvh_attrs |= PVF_NC; + md->pvh_attrs |= PVF_NC; else { struct pv_entry *pve; @@ -1807,7 +1827,7 @@ pmap_check_alias(pg, pve, va, &pte); } - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); } } pmap_pte_set(pde, va, pte); @@ -1876,18 +1896,19 @@ pmap_pte_flush(pmap, va, pte); pmap_pte_set(pde, va, 0); if (pmap_initialized && (pg = PHYS_TO_VM_PAGE(PTE_PAGE(pte)))) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); - mutex_enter(&pg->mdpage.pvh_lock); + mutex_enter(&md->pvh_lock); pve = pmap_pv_remove(pg, pmap, va); - if ((pg->mdpage.pvh_attrs & PVF_NC) == 0) - pmap_check_alias(pg, pg->mdpage.pvh_list, va, + if ((md->pvh_attrs & PVF_NC) == 0) + pmap_check_alias(pg, md->pvh_list, va, NULL); - pg->mdpage.pvh_attrs &= ~PVF_NC; + md->pvh_attrs &= ~PVF_NC; - mutex_exit(&pg->mdpage.pvh_lock); + mutex_exit(&md->pvh_lock); if (pve != NULL) pmap_pv_free(pve); } Index: src/sys/arch/hppa/include/pmap.h diff -u src/sys/arch/hppa/include/pmap.h:1.23 src/sys/arch/hppa/include/pmap.h:1.23.2.1 --- src/sys/arch/hppa/include/pmap.h:1.23 Sun Nov 15 12:26:02 2009 +++ src/sys/arch/hppa/include/pmap.h Thu Feb 25 04:11:29 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.23 2009/11/15 12:26:02 skrll Exp $ */ +/* $NetBSD: pmap.h,v 1.23.2.1 2010/02/25 04:11:29 uebayasi Exp $ */ /* $OpenBSD: pmap.h,v 1.35 2007/12/14 18:32:23 deraadt Exp $ */ @@ -83,8 +83,8 @@ /* pg/mp is uncacheable */ #define pmap_is_aliased(pg) \ - (((pg)->mdpage.pvh_attrs & PVF_NC) == 0 && \ - ((pg)->mdpage.pvh_attrs & PVF_UNCACHEABLE) != 0) + ((VM_PAGE_TO_MD(pg)->pvh_attrs & PVF_NC) == 0 && \ + (VM_PAGE_TO_MD(pg)->pvh_attrs & PVF_UNCACHEABLE) != 0) #define HPPA_MAX_PID 0xfffa #define HPPA_SID_MAX 0x7ffd