Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-6]: src/sys/arch/arm/arm32 Pull up revision 1.105 (requested by...
details: https://anonhg.NetBSD.org/src/rev/b9196da5ff28
branches: netbsd-1-6
changeset: 529666:b9196da5ff28
user: he <he%NetBSD.org@localhost>
date: Sat Dec 07 20:43:02 2002 +0000
description:
Pull up revision 1.105 (requested by thorpej in ticket #714):
Add code, conditional on PMAP_ALIAS_DEBUG, which can be
used to hunt for virtual aliases between managed (pmap_enter)
and unmanaged (pmap_kenter_pa) mappings.
diffstat:
sys/arch/arm/arm32/pmap.c | 132 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 129 insertions(+), 3 deletions(-)
diffs (198 lines):
diff -r dd7c49903c9f -r b9196da5ff28 sys/arch/arm/arm32/pmap.c
--- a/sys/arch/arm/arm32/pmap.c Sat Dec 07 20:42:10 2002 +0000
+++ b/sys/arch/arm/arm32/pmap.c Sat Dec 07 20:43:02 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.97.4.3 2002/11/21 20:15:23 he Exp $ */
+/* $NetBSD: pmap.c,v 1.97.4.4 2002/12/07 20:43:02 he Exp $ */
/*
* Copyright (c) 2002 Wasabi Systems, Inc.
@@ -143,7 +143,7 @@
#include <machine/param.h>
#include <arm/arm32/katelib.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.97.4.3 2002/11/21 20:15:23 he Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.97.4.4 2002/12/07 20:43:02 he Exp $");
#ifdef PMAP_DEBUG
#define PDEBUG(_lev_,_stat_) \
if (pmap_debug_level >= (_lev_)) \
@@ -813,6 +813,22 @@
simple_unlock(&pg->mdpage.pvh_slock); /* unlock, done! */
if (pve->pv_flags & PVF_WIRED)
++pmap->pm_stats.wired_count;
+#ifdef PMAP_ALIAS_DEBUG
+ {
+ int s = splhigh();
+ if (pve->pv_flags & PVF_WRITE)
+ pg->mdpage.rw_mappings++;
+ else
+ pg->mdpage.ro_mappings++;
+ if (pg->mdpage.rw_mappings != 0 &&
+ (pg->mdpage.kro_mappings != 0 || pg->mdpage.krw_mappings != 0)) {
+ printf("pmap_enter_pv: rw %u, kro %u, krw %u\n",
+ pg->mdpage.rw_mappings, pg->mdpage.kro_mappings,
+ pg->mdpage.krw_mappings);
+ }
+ splx(s);
+ }
+#endif /* PMAP_ALIAS_DEBUG */
}
/*
@@ -838,6 +854,19 @@
*prevptr = pve->pv_next; /* remove it! */
if (pve->pv_flags & PVF_WIRED)
--pmap->pm_stats.wired_count;
+#ifdef PMAP_ALIAS_DEBUG
+ {
+ int s = splhigh();
+ if (pve->pv_flags & PVF_WRITE) {
+ KASSERT(pg->mdpage.rw_mappings != 0);
+ pg->mdpage.rw_mappings--;
+ } else {
+ KASSERT(pg->mdpage.ro_mappings != 0);
+ pg->mdpage.ro_mappings--;
+ }
+ splx(s);
+ }
+#endif /* PMAP_ALIAS_DEBUG */
break;
}
prevptr = &pve->pv_next; /* previous pointer */
@@ -881,6 +910,31 @@
else
--pmap->pm_stats.wired_count;
}
+#ifdef PMAP_ALIAS_DEBUG
+ {
+ int s = splhigh();
+ if ((flags ^ oflags) & PVF_WRITE) {
+ if (flags & PVF_WRITE) {
+ pg->mdpage.rw_mappings++;
+ pg->mdpage.ro_mappings--;
+ if (pg->mdpage.rw_mappings != 0 &&
+ (pg->mdpage.kro_mappings != 0 ||
+ pg->mdpage.krw_mappings != 0)) {
+ printf("pmap_modify_pv: rw %u, "
+ "kro %u, krw %u\n",
+ pg->mdpage.rw_mappings,
+ pg->mdpage.kro_mappings,
+ pg->mdpage.krw_mappings);
+ }
+ } else {
+ KASSERT(pg->mdpage.rw_mappings != 0);
+ pg->mdpage.rw_mappings--;
+ pg->mdpage.ro_mappings++;
+ }
+ }
+ splx(s);
+ }
+#endif /* PMAP_ALIAS_DEBUG */
return (oflags);
}
}
@@ -1367,6 +1421,13 @@
*pte = L2_S_PROTO | pmap->pm_pptpt |
L2_S_PROT(PTE_KERNEL, VM_PROT_READ|VM_PROT_WRITE);
+#ifdef PMAP_ALIAS_DEBUG
+ {
+ int s = splhigh();
+ pg->mdpage.krw_mappings++;
+ splx(s);
+ }
+#endif /* PMAP_ALIAS_DEBUG */
return (0);
}
@@ -2820,10 +2881,44 @@
pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot)
{
pt_entry_t *pte;
-
+
pte = vtopte(va);
KASSERT(!pmap_pte_v(pte));
+#ifdef PMAP_ALIAS_DEBUG
+ {
+ struct vm_page *pg;
+ int s;
+
+ pg = PHYS_TO_VM_PAGE(pa);
+ if (pg != NULL) {
+ s = splhigh();
+ if (pg->mdpage.ro_mappings == 0 &&
+ pg->mdpage.rw_mappings == 0 &&
+ pg->mdpage.kro_mappings == 0 &&
+ pg->mdpage.krw_mappings == 0) {
+ /* This case is okay. */
+ } else if (pg->mdpage.rw_mappings == 0 &&
+ pg->mdpage.krw_mappings == 0 &&
+ (prot & VM_PROT_WRITE) == 0) {
+ /* This case is okay. */
+ } else {
+ /* Something is awry. */
+ printf("pmap_kenter_pa: ro %u, rw %u, kro %u, krw %u "
+ "prot 0x%x\n", pg->mdpage.ro_mappings,
+ pg->mdpage.rw_mappings, pg->mdpage.kro_mappings,
+ pg->mdpage.krw_mappings, prot);
+ Debugger();
+ }
+ if (prot & VM_PROT_WRITE)
+ pg->mdpage.krw_mappings++;
+ else
+ pg->mdpage.kro_mappings++;
+ splx(s);
+ }
+ }
+#endif /* PMAP_ALIAS_DEBUG */
+
*pte = L2_S_PROTO | pa |
L2_S_PROT(PTE_KERNEL, prot) | pte_l2_s_cache_mode;
}
@@ -2842,6 +2937,25 @@
KASSERT(pmap_pde_page(pmap_pde(pmap_kernel(), va)));
pte = vtopte(va);
+#ifdef PMAP_ALIAS_DEBUG
+ {
+ struct vm_page *pg;
+ int s;
+
+ if ((*pte & L2_TYPE_MASK) != L2_TYPE_INV &&
+ (pg = PHYS_TO_VM_PAGE(*pte & L2_S_FRAME)) != NULL) {
+ s = splhigh();
+ if (*pte & L2_S_PROT_W) {
+ KASSERT(pg->mdpage.krw_mappings != 0);
+ pg->mdpage.krw_mappings--;
+ } else {
+ KASSERT(pg->mdpage.kro_mappings != 0);
+ pg->mdpage.kro_mappings--;
+ }
+ splx(s);
+ }
+ }
+#endif /* PMAP_ALIAS_DEBUG */
cpu_idcache_wbinv_range(va, PAGE_SIZE);
*pte = 0;
cpu_tlb_flushID_SE(va);
@@ -3106,6 +3220,18 @@
* Loop over all current mappings setting/clearing as appropos
*/
for (pv = pg->mdpage.pvh_list; pv; pv = pv->pv_next) {
+#ifdef PMAP_ALIAS_DEBUG
+ {
+ int s = splhigh();
+ if ((maskbits & PVF_WRITE) != 0 &&
+ (pv->pv_flags & PVF_WRITE) != 0) {
+ KASSERT(pg->mdpage.rw_mappings != 0);
+ pg->mdpage.rw_mappings--;
+ pg->mdpage.ro_mappings++;
+ }
+ splx(s);
+ }
+#endif /* PMAP_ALIAS_DEBUG */
va = pv->pv_va;
pv->pv_flags &= ~maskbits;
ptes = pmap_map_ptes(pv->pv_pmap); /* locks pmap */
Home |
Main Index |
Thread Index |
Old Index