summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2004-12-12 19:27:58 +0000
committermarcel <marcel@FreeBSD.org>2004-12-12 19:27:58 +0000
commit8944146336baa793540971bfe7b1262ccd13f2cd (patch)
tree859da573fdd1a4a5860cb9fbdc21a5e07ac8ebf3 /sys/ia64
parent8e56111fcd115097003ae63d5e513e78f8f465d2 (diff)
downloadFreeBSD-src-8944146336baa793540971bfe7b1262ccd13f2cd.zip
FreeBSD-src-8944146336baa793540971bfe7b1262ccd13f2cd.tar.gz
Fix the last of the instability and the cause of the annoying
"vm_fault: fault on nofault entry, addr: %lx" panic. The problem was a stale PTE in the TLB that marked the page as not present, even though we had a good PTE in the VHPT. We typically don't yet insert PTEs in the TLB. We do that lazily. The CPU will look for the PTE in the VHPT when there's no PTE in the TLB. Unfortunately this doesn't handle the case of the stale PTE in the TLB. The quick fix is to invalidate the TLB (sloppily) when the VHPT doesn't contain a valid PTE. This is also the only case that may cause a PTE in the TLB that marks a page as non-present.
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/pmap.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index ab37b87..da1bcf1 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -787,8 +787,10 @@ pmap_enter_vhpt(struct ia64_lpte *pte, vm_offset_t va)
vhpte->chain = ia64_tpa((vm_offset_t)pte);
ia64_mf();
- if (!pmap_lpte_present(vhpte) && pmap_lpte_present(pte))
+ if (!pmap_lpte_present(vhpte) && pmap_lpte_present(pte)) {
+ ia64_ptc_g(va, PAGE_SHIFT << 2);
pmap_install_pte(vhpte, pte);
+ }
mtx_unlock(&pmap_vhptmutex);
}
@@ -806,8 +808,10 @@ pmap_update_vhpt(struct ia64_lpte *pte, vm_offset_t va)
mtx_lock(&pmap_vhptmutex);
if ((!pmap_lpte_present(vhpte) || vhpte->tag == pte->tag) &&
- pmap_lpte_present(pte))
+ pmap_lpte_present(pte)) {
+ ia64_ptc_g(va, PAGE_SHIFT << 2);
pmap_install_pte(vhpte, pte);
+ }
mtx_unlock(&pmap_vhptmutex);
}
OpenPOWER on IntegriCloud