diff options
author | 1999-01-03 04:01:35 +0000 | |
---|---|---|
committer | 1999-01-03 04:01:35 +0000 | |
commit | 094e401c13e9e8bb943051992bcf66f7fb499d90 (patch) | |
tree | 04958f217803e25f1b61f2544ab59f977013eb4b | |
parent | unused var (diff) | |
download | wireguard-openbsd-094e401c13e9e8bb943051992bcf66f7fb499d90.tar.xz wireguard-openbsd-094e401c13e9e8bb943051992bcf66f7fb499d90.zip |
add pmap_changebit(); fix pmap_enter() so it handles mapping's PA changes
-rw-r--r-- | sys/arch/hppa/hppa/pmap.c | 47 | ||||
-rw-r--r-- | sys/arch/hppa/include/pmap.h | 3 |
2 files changed, 42 insertions, 8 deletions
diff --git a/sys/arch/hppa/hppa/pmap.c b/sys/arch/hppa/hppa/pmap.c index 3c15947787b..7d989236bb4 100644 --- a/sys/arch/hppa/hppa/pmap.c +++ b/sys/arch/hppa/hppa/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.8 1998/12/30 02:11:52 mickey Exp $ */ +/* $OpenBSD: pmap.c,v 1.9 1999/01/03 04:01:36 mickey Exp $ */ /* * Copyright (c) 1998 Michael Shalayeff @@ -1073,15 +1073,28 @@ pmap_enter(pmap, va, pa, prot, wired) pmap->pmap_stats.resident_count++; } else { - /* - * We are just changing the protection. - * Flush the current TLB entry to force a fault and reload. - */ + /* see if we are remapping the page to another PA */ + if (ppv->pv_tlbpage != tlbpage) { #ifdef PMAPDEBUG - if (pmapdebug & PDB_ENTER) - printf("pmap_enter: changing protection\n"); + if (pmapdebug & PDB_ENTER) + printf("pmap_enter: moving pa %x -> %x\n", + ppv->pv_tlbpage, tlbpage); #endif + tlbprot = ppv->pv_tlbprot; + pmap_remove_pv(pmap, va, ppv); + pmap_enter_pv(pmap, va, tlbprot, tlbpage, 0, pv); + } else { + /* We are just changing the protection. */ +#ifdef PMAPDEBUG + if (pmapdebug & PDB_ENTER) + printf("pmap_enter: changing protection\n"); +#endif + } pv = ppv; + /* + * Flush the current TLB entry to force + * a fault and reload. + */ pdtlb(space, va); pitlb(space, va); } @@ -1550,6 +1563,26 @@ pmap_is_referenced(pa) return pv != NULL; } +void +pmap_changebit(pa, set, reset) + vm_offset_t pa; + u_int set, reset; +{ + register struct pv_entry *pv; + int s; + + pv = pmap_find_pv(pa); + + s = splimp(); + while (pv) { + pv->pv_tlbprot |= set; + pv->vp_tlbprot &= ~reset; + pv = pv->pv_next; + } + pmap_clear_pv(pv, NULL); + splx(s); +} + int kvtop(va) caddr_t va; diff --git a/sys/arch/hppa/include/pmap.h b/sys/arch/hppa/include/pmap.h index f3aa126db36..51fcdb0f786 100644 --- a/sys/arch/hppa/include/pmap.h +++ b/sys/arch/hppa/include/pmap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.h,v 1.4 1998/11/23 03:28:22 mickey Exp $ */ +/* $OpenBSD: pmap.h,v 1.5 1999/01/03 04:01:35 mickey Exp $ */ /* * Copyright 1996 1995 by Open Software Foundation, Inc. @@ -168,6 +168,7 @@ pmap_prot(struct pmap *pmap, int prot) } void pmap_bootstrap __P((vm_offset_t *, vm_offset_t *)); +void pmap_changebit __P((vm_offset_t, u_int, u_int)); #endif /* _KERNEL */ #endif /* _MACHINE_PMAP_H_ */ |