Module Name: src Committed By: skrll Date: Mon Feb 22 21:32:55 UTC 2010
Modified Files: src/sys/arch/hppa/hppa: pmap.c src/sys/arch/hppa/include: pmap.h Log Message: Deal with PA2.0 cache move-in rules by purging the TLB as well as flushing/purging the cache. To generate a diff of this commit: cvs rdiff -u -r1.67 -r1.68 src/sys/arch/hppa/hppa/pmap.c cvs rdiff -u -r1.23 -r1.24 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.67 src/sys/arch/hppa/hppa/pmap.c:1.68 --- src/sys/arch/hppa/hppa/pmap.c:1.67 Wed Feb 17 14:16:53 2010 +++ src/sys/arch/hppa/hppa/pmap.c Mon Feb 22 21:32:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.67 2010/02/17 14:16:53 skrll Exp $ */ +/* $NetBSD: pmap.c,v 1.68 2010/02/22 21:32:55 skrll Exp $ */ /*- * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.67 2010/02/17 14:16:53 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.68 2010/02/22 21:32:55 skrll Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -257,7 +257,14 @@ void pmap_pagefree(struct vm_page *pg) { - fdcache(HPPA_SID_KERNEL, VM_PAGE_TO_PHYS(pg), PAGE_SIZE); + paddr_t pa = VM_PAGE_TO_PHYS(pg); + pdcache(HPPA_SID_KERNEL, pa, PAGE_SIZE); + +#if defined(HP8000_CPU) || defined(HP8200_CPU) || \ + defined(HP8500_CPU) || defined(HP8600_CPU) + pdtlb(HPPA_SID_KERNEL, pa); + pitlb(HPPA_SID_KERNEL, pa); +#endif uvm_pagefree(pg); } @@ -415,12 +422,12 @@ pmap_pte_flush(pmap_t pmap, vaddr_t va, pt_entry_t pte) { + fdcache(pmap->pm_space, va, PAGE_SIZE); + pdtlb(pmap->pm_space, va); if (pte & PTE_PROT(TLB_EXECUTE)) { ficache(pmap->pm_space, va, PAGE_SIZE); pitlb(pmap->pm_space, va); } - fdcache(pmap->pm_space, va, PAGE_SIZE); - pdtlb(pmap->pm_space, va); #ifdef USE_HPT if (pmap_hpt) { struct hpt_entry *hpt; @@ -1696,16 +1703,21 @@ KASSERT(!(pg->mdpage.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) { vaddr_t va = pve->pv_va & PV_VAMASK; + pa_space_t sp = pve->pv_pmap->pm_space; if (purge) - pdcache(pve->pv_pmap->pm_space, va, PAGE_SIZE); + pdcache(sp, va, PAGE_SIZE); else - fdcache(pve->pv_pmap->pm_space, va, PAGE_SIZE); + fdcache(sp, va, PAGE_SIZE); +#if defined(HP8000_CPU) || defined(HP8200_CPU) || \ + defined(HP8500_CPU) || defined(HP8600_CPU) + pdtlb(sp, va); + ficache(sp, va, PAGE_SIZE); + pitlb(sp, va); +#endif } - mutex_exit(&pg->mdpage.pvh_lock); } /* @@ -1723,6 +1735,12 @@ memset((void *)pa, 0, PAGE_SIZE); fdcache(HPPA_SID_KERNEL, pa, PAGE_SIZE); +#if defined(HP8000_CPU) || defined(HP8200_CPU) || \ + defined(HP8500_CPU) || defined(HP8600_CPU) + pdtlb(HPPA_SID_KERNEL, pa); + ficache(HPPA_SID_KERNEL, pa, PAGE_SIZE); + pitlb(HPPA_SID_KERNEL, pa); +#endif } /* @@ -1745,6 +1763,15 @@ pdcache(HPPA_SID_KERNEL, spa, PAGE_SIZE); fdcache(HPPA_SID_KERNEL, dpa, PAGE_SIZE); +#if defined(HP8000_CPU) || defined(HP8200_CPU) || \ + defined(HP8500_CPU) || defined(HP8600_CPU) + pdtlb(HPPA_SID_KERNEL, spa); + pdtlb(HPPA_SID_KERNEL, dpa); + ficache(HPPA_SID_KERNEL, spa, PAGE_SIZE); + ficache(HPPA_SID_KERNEL, dpa, PAGE_SIZE); + pitlb(HPPA_SID_KERNEL, spa); + pitlb(HPPA_SID_KERNEL, dpa); +#endif } void 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.24 --- src/sys/arch/hppa/include/pmap.h:1.23 Sun Nov 15 12:26:02 2009 +++ src/sys/arch/hppa/include/pmap.h Mon Feb 22 21:32:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.23 2009/11/15 12:26:02 skrll Exp $ */ +/* $NetBSD: pmap.h,v 1.24 2010/02/22 21:32:55 skrll Exp $ */ /* $OpenBSD: pmap.h,v 1.35 2007/12/14 18:32:23 deraadt Exp $ */ @@ -119,6 +119,12 @@ static inline paddr_t hppa_unmap_poolpage(vaddr_t va) { pdcache(HPPA_SID_KERNEL, va, PAGE_SIZE); +#if defined(HP8000_CPU) || defined(HP8200_CPU) || \ + defined(HP8500_CPU) || defined(HP8600_CPU) + pdtlb(HPPA_SID_KERNEL, va); + ficache(HPPA_SID_KERNEL, va, PAGE_SIZE); + pitlb(HPPA_SID_KERNEL, va); +#endif return (paddr_t)va; }