summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormickey <mickey@openbsd.org>1999-01-03 04:01:35 +0000
committermickey <mickey@openbsd.org>1999-01-03 04:01:35 +0000
commit094e401c13e9e8bb943051992bcf66f7fb499d90 (patch)
tree04958f217803e25f1b61f2544ab59f977013eb4b
parentunused var (diff)
downloadwireguard-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.c47
-rw-r--r--sys/arch/hppa/include/pmap.h3
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_ */