diff options
author | marcel <marcel@FreeBSD.org> | 2004-12-12 19:27:58 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2004-12-12 19:27:58 +0000 |
commit | 8944146336baa793540971bfe7b1262ccd13f2cd (patch) | |
tree | 859da573fdd1a4a5860cb9fbdc21a5e07ac8ebf3 /sys/ia64 | |
parent | 8e56111fcd115097003ae63d5e513e78f8f465d2 (diff) | |
download | FreeBSD-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.c | 8 |
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); } |