diff options
author | peter <peter@FreeBSD.org> | 1999-06-28 09:38:09 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1999-06-28 09:38:09 +0000 |
commit | 9a460a1161cdb29d62c4bb61a7cd61acb99f778e (patch) | |
tree | 67d023146e2cc8020e1a0657501171882e2a0e88 /sys/alpha | |
parent | b86772ac109ea7fce28171edeac05dde01f498b3 (diff) | |
download | FreeBSD-src-9a460a1161cdb29d62c4bb61a7cd61acb99f778e.zip FreeBSD-src-9a460a1161cdb29d62c4bb61a7cd61acb99f778e.tar.gz |
Add some extra alpha_pal_imb()'s in overkill mode. This makes this PC164SX
run quite reliably now. I've explicitly tagged them as /* XXX overkill? */
although one does actually check for VM_PROT_EXECUTE.
Based on a suggestion by: Dmitrij Tejblum <tejblum@arc.hq.cti.ru>
Diffstat (limited to 'sys/alpha')
-rw-r--r-- | sys/alpha/alpha/pmap.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c index abc565c..75eb9d0 100644 --- a/sys/alpha/alpha/pmap.c +++ b/sys/alpha/alpha/pmap.c @@ -43,7 +43,7 @@ * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 * from: i386 Id: pmap.c,v 1.193 1998/04/19 15:22:48 bde Exp * with some ideas from NetBSD's alpha pmap - * $Id: pmap.c,v 1.25 1999/06/08 17:14:07 dt Exp $ + * $Id: pmap.c,v 1.26 1999/06/10 20:40:55 dt Exp $ */ /* @@ -728,18 +728,20 @@ pmap_invalidate_asn(pmap_t pmap) static void pmap_invalidate_page(pmap_t pmap, vm_offset_t va) { - if (pmap_isactive(pmap)) + if (pmap_isactive(pmap)) { ALPHA_TBIS(va); - else + alpha_pal_imb(); /* XXX overkill? */ + } else pmap_invalidate_asn(pmap); } static void pmap_invalidate_all(pmap_t pmap) { - if (pmap_isactive(pmap)) + if (pmap_isactive(pmap)) { ALPHA_TBIA(); - else + alpha_pal_imb(); /* XXX overkill? */ + } else pmap_invalidate_asn(pmap); } @@ -785,7 +787,7 @@ pmap_get_asn(pmap_t pmap) * with the ASN. */ ALPHA_TBIAP(); - alpha_pal_imb(); + alpha_pal_imb(); /* XXX overkill? */ } pmap->pm_asn = pmap_nextasn++; pmap->pm_asngen = pmap_current_asngen; @@ -2176,6 +2178,8 @@ validate: *pte = newpte; if (origpte) pmap_invalidate_page(pmap, va); + if (prot & VM_PROT_EXECUTE) + alpha_pal_imb(); } } @@ -2250,6 +2254,7 @@ retry: if (*pte) { if (mpte) pmap_unwire_pte_hold(pmap, va, mpte); + alpha_pal_imb(); /* XXX overkill? */ return 0; } @@ -2271,6 +2276,7 @@ retry: */ *pte = pmap_phys_to_pte(pa) | PG_V | PG_KRE | PG_URE | PG_MANAGED; + alpha_pal_imb(); /* XXX overkill? */ return mpte; } |