summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Shalayeff <mickey@cvs.openbsd.org>2003-01-29 17:06:06 +0000
committerMichael Shalayeff <mickey@cvs.openbsd.org>2003-01-29 17:06:06 +0000
commit63cc2ee48d178f01825b92b3a7a26f32a6eafdf0 (patch)
tree5841adcd0c6507920e93fa38a4cb6e4a256f95fe
parenta5646539ef5b30683e2a4d2bfd94cdd46e6e4117 (diff)
ref bit is reverse meaning in the pte, therefore should be
set on initial mapping (both enter and kenter), this seems to repair numerous userland issues. do not play DIRTY games either. repair border condition on the batch unmap (as well).
-rw-r--r--sys/arch/hppa/hppa/pmap.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/sys/arch/hppa/hppa/pmap.c b/sys/arch/hppa/hppa/pmap.c
index e349a8ba263..a9e73a05c68 100644
--- a/sys/arch/hppa/hppa/pmap.c
+++ b/sys/arch/hppa/hppa/pmap.c
@@ -1,7 +1,7 @@
-/* $OpenBSD: pmap.c,v 1.95 2003/01/22 23:56:33 mickey Exp $ */
+/* $OpenBSD: pmap.c,v 1.96 2003/01/29 17:06:05 mickey Exp $ */
/*
- * Copyright (c) 1998-2002 Michael Shalayeff
+ * Copyright (c) 1998-2003 Michael Shalayeff
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -758,7 +758,7 @@ pmap_enter(pmap, va, pa, prot, flags)
} else {
DPRINTF(PDB_ENTER,
("pmap_enter: new mapping 0x%x -> 0x%x\n", va, pa));
- pte = PTE_PROT(0);
+ pte = PTE_PROT(TLB_REFTRAP);
pve = NULL;
pmap->pm_stats.resident_count++;
if (wired)
@@ -819,7 +819,7 @@ pmap_remove(pmap, sva, eva)
sva += ~PDE_MASK + 1 - PAGE_SIZE;
continue;
}
- batch = pdemask == sva && sva + ~PDE_MASK + 1 < eva;
+ batch = pdemask == sva && sva + ~PDE_MASK + 1 <= eva;
}
if ((pte = pmap_pte_get(pde, sva))) {
@@ -900,8 +900,6 @@ pmap_write_protect(pmap, sva, eva, prot)
simple_unlock(&pg->mdpage.pvh_lock);
pmap_pte_flush(pmap, sva, pte);
- if (!(tlbprot & TLB_WRITE))
- pte &= ~PTE_PROT(TLB_DIRTY);
pte &= ~PTE_PROT(TLB_AR_MASK);
pte |= tlbprot;
pmap_pte_set(pde, sva, pte);
@@ -1146,7 +1144,8 @@ pmap_kenter_pa(va, pa, prot)
va, pde, pte);
#endif
- pte = pa | PTE_PROT(TLB_WIRED|pmap_prot(pmap_kernel(), prot));
+ pte = pa | PTE_PROT(TLB_WIRED | TLB_REFTRAP |
+ pmap_prot(pmap_kernel(), prot));
if (pa >= HPPA_IOSPACE)
pte |= PTE_PROT(TLB_UNCACHABLE);
pmap_pte_set(pde, va, pte);