diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2010-03-16 17:12:51 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2010-03-16 17:12:51 +0000 |
commit | e5607f886b5f9d19e6348d4ed71a19dabe5eb63c (patch) | |
tree | 8b80e8df713f02adda73c9d4bb85493617198ba8 /sys/arch | |
parent | d424582d72e123f5994724c53e6fb3610cf70ee4 (diff) |
PCXS processors (really, all PA-RISC processors with separate I and D tlb
entries) may use the DTLB to resolve an address in ficache(), so make sure
pdtlb() always happens after ficache(), not before.
This problem was exposed with revision 1.145 of pmap.c.
ok kettenis@
Diffstat (limited to 'sys/arch')
-rw-r--r-- | sys/arch/hppa/hppa/pmap.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/sys/arch/hppa/hppa/pmap.c b/sys/arch/hppa/hppa/pmap.c index 515604f4baa..500afce5632 100644 --- a/sys/arch/hppa/hppa/pmap.c +++ b/sys/arch/hppa/hppa/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.147 2010/01/03 19:23:49 kettenis Exp $ */ +/* $OpenBSD: pmap.c,v 1.148 2010/03/16 17:12:50 miod Exp $ */ /* * Copyright (c) 1998-2004 Michael Shalayeff @@ -276,11 +276,12 @@ void pmap_pte_flush(struct pmap *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); + pdtlb(pmap->pm_space, va); pitlb(pmap->pm_space, va); - } + } else + pdtlb(pmap->pm_space, va); #ifdef USE_HPT if (pmap_hpt) { struct vp_entry *hpt; @@ -1170,9 +1171,9 @@ pmap_flush_page(struct vm_page *pg, int purge) pdcache(pve->pv_pmap->pm_space, pve->pv_va, PAGE_SIZE); else fdcache(pve->pv_pmap->pm_space, pve->pv_va, PAGE_SIZE); - pdtlb(pve->pv_pmap->pm_space, pve->pv_va); /* XXX Conditionalize ficache on PTE_PROT(TLB_EXECUTE)? */ ficache(pve->pv_pmap->pm_space, pve->pv_va, PAGE_SIZE); + pdtlb(pve->pv_pmap->pm_space, pve->pv_va); pitlb(pve->pv_pmap->pm_space, pve->pv_va); } simple_unlock(&pg->mdpage.pvh_lock); @@ -1188,8 +1189,8 @@ pmap_zero_page(struct vm_page *pg) pmap_flush_page(pg, 1); bzero((void *)pa, PAGE_SIZE); fdcache(HPPA_SID_KERNEL, pa, PAGE_SIZE); - pdtlb(HPPA_SID_KERNEL, pa); ficache(HPPA_SID_KERNEL, pa, PAGE_SIZE); + pdtlb(HPPA_SID_KERNEL, pa); pitlb(HPPA_SID_KERNEL, pa); } @@ -1205,10 +1206,10 @@ pmap_copy_page(struct vm_page *srcpg, struct vm_page *dstpg) bcopy((void *)spa, (void *)dpa, PAGE_SIZE); pdcache(HPPA_SID_KERNEL, spa, PAGE_SIZE); fdcache(HPPA_SID_KERNEL, dpa, PAGE_SIZE); - pdtlb(HPPA_SID_KERNEL, spa); - pdtlb(HPPA_SID_KERNEL, dpa); ficache(HPPA_SID_KERNEL, spa, PAGE_SIZE); ficache(HPPA_SID_KERNEL, dpa, PAGE_SIZE); + pdtlb(HPPA_SID_KERNEL, spa); + pdtlb(HPPA_SID_KERNEL, dpa); pitlb(HPPA_SID_KERNEL, spa); pitlb(HPPA_SID_KERNEL, dpa); } @@ -1329,8 +1330,8 @@ struct vm_page * pmap_unmap_direct(vaddr_t va) { fdcache(HPPA_SID_KERNEL, va, PAGE_SIZE); - pdtlb(HPPA_SID_KERNEL, va); ficache(HPPA_SID_KERNEL, va, PAGE_SIZE); + pdtlb(HPPA_SID_KERNEL, va); pitlb(HPPA_SID_KERNEL, va); return (PHYS_TO_VM_PAGE(va)); } |