Module Name: src
Committed By: matt
Date: Wed Dec 22 06:05:42 UTC 2010
Modified Files:
src/sys/arch/mips/include [matt-nb5-mips64]: pmap.h
src/sys/arch/mips/mips [matt-nb5-mips64]: pmap_tlb.c
Log Message:
Add a pmap_asid_check which verifies the current ASID is in COP0 ENTRY_HI
To generate a diff of this commit:
cvs rdiff -u -r1.54.26.14 -r1.54.26.15 src/sys/arch/mips/include/pmap.h
cvs rdiff -u -r1.1.2.12 -r1.1.2.13 src/sys/arch/mips/mips/pmap_tlb.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/include/pmap.h
diff -u src/sys/arch/mips/include/pmap.h:1.54.26.14 src/sys/arch/mips/include/pmap.h:1.54.26.15
--- src/sys/arch/mips/include/pmap.h:1.54.26.14 Mon Aug 16 18:01:13 2010
+++ src/sys/arch/mips/include/pmap.h Wed Dec 22 06:05:41 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.54.26.14 2010/08/16 18:01:13 matt Exp $ */
+/* $NetBSD: pmap.h,v 1.54.26.15 2010/12/22 06:05:41 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -263,6 +263,7 @@
void pmap_tlb_info_init(struct pmap_tlb_info *);
void pmap_tlb_asid_acquire(pmap_t pmap, struct lwp *l);
void pmap_tlb_asid_deactivate(pmap_t pmap);
+void pmap_tlb_asid_check(void);
void pmap_tlb_asid_release_all(pmap_t pmap);
int pmap_tlb_update_addr(pmap_t pmap, vaddr_t, uint32_t, bool);
void pmap_tlb_invalidate_addr(pmap_t pmap, vaddr_t);
Index: src/sys/arch/mips/mips/pmap_tlb.c
diff -u src/sys/arch/mips/mips/pmap_tlb.c:1.1.2.12 src/sys/arch/mips/mips/pmap_tlb.c:1.1.2.13
--- src/sys/arch/mips/mips/pmap_tlb.c:1.1.2.12 Thu Jun 10 00:38:11 2010
+++ src/sys/arch/mips/mips/pmap_tlb.c Wed Dec 22 06:05:42 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_tlb.c,v 1.1.2.12 2010/06/10 00:38:11 cliff Exp $ */
+/* $NetBSD: pmap_tlb.c,v 1.1.2.13 2010/12/22 06:05:42 matt Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.1.2.12 2010/06/10 00:38:11 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.1.2.13 2010/12/22 06:05:42 matt Exp $");
/*
* Manages address spaces in a TLB.
@@ -371,8 +371,10 @@
* and clear the ASID bitmap. That will force everyone to
* allocate a new ASID.
*/
+ pmap_tlb_asid_check();
const u_int asids_found = tlb_record_asids(ti->ti_asid_bitmap,
ti->ti_asid_mask);
+ pmap_tlb_asid_check();
KASSERT(asids_found == pmap_tlb_asid_count(ti));
if (__predict_false(asids_found >= ti->ti_asid_max / 2)) {
tlb_invalidate_asids(1, ti->ti_asid_mask);
@@ -446,7 +448,9 @@
* invalidate its TLB entries.
*/
KASSERT(pai->pai_asid != 0);
+ pmap_tlb_asid_check();
tlb_invalidate_asids(pai->pai_asid, pai->pai_asid + 1);
+ pmap_tlb_asid_check();
} else if (pai->pai_asid) {
/*
* The victim is no longer an active pmap for this TLB.
@@ -469,7 +473,9 @@
/*
* We need to invalidate all global TLB entries.
*/
+ pmap_tlb_asid_check();
tlb_invalidate_globals();
+ pmap_tlb_asid_check();
break;
case TLBINV_ALL:
/*
@@ -609,7 +615,9 @@
TLBINFO_LOCK(ti);
if (pm == pmap_kernel() || PMAP_PAI_ASIDVALID_P(pai, ti)) {
va |= pai->pai_asid << MIPS_TLB_PID_SHIFT;
+ pmap_tlb_asid_check();
rv = tlb_update(va, pt_entry);
+ pmap_tlb_asid_check();
}
#ifdef MULTIPROCESSOR
pm->pm_shootdown_pending = need_ipi;
@@ -630,7 +638,9 @@
TLBINFO_LOCK(ti);
if (pm == pmap_kernel() || PMAP_PAI_ASIDVALID_P(pai, ti)) {
va |= pai->pai_asid << MIPS_TLB_PID_SHIFT;
+ pmap_tlb_asid_check();
tlb_invalidate_addr(va);
+ pmap_tlb_asid_check();
}
#ifdef MULTIPROCESSOR
pm->pm_shootdown_pending = 1;
@@ -762,13 +772,17 @@
}
atomic_or_ulong(&ci->ci_flags, CPUF_USERPMAP);
#endif /* MULTIPROCESSOR */
+ ci->ci_pmap_asid_cur = pai->pai_asid;
tlb_set_asid(pai->pai_asid);
+ pmap_tlb_asid_check();
+ } else {
+ printf("%s: l (%p) != curlwp %p\n", __func__, l, curlwp);
}
TLBINFO_UNLOCK(ti);
#ifdef DEBUGXX
if (pmapdebug & (PDB_FOLLOW|PDB_TLBPID)) {
- printf("pmap_tlb_asid_alloc: curlwp %d.%d '%s' ",
+ printf("%s: curlwp %d.%d '%s' ", __func__,
curlwp->l_proc->p_pid, curlwp->l_lid,
curlwp->l_proc->p_comm);
printf("segtab %p asid %d\n", pm->pm_segtab, pai->pai_asid);
@@ -798,7 +812,9 @@
atomic_and_ulong(&ci->ci_flags, ~CPUF_USERPMAP);
}
#elif defined(DEBUG)
+ curcpu()->ci_pmap_asid_cur = 0;
tlb_set_asid(0);
+ pmap_tlb_asid_check();
#endif
}
@@ -987,3 +1003,15 @@
}
#endif /* MULTIPROCESSOR */
+
+void
+pmap_tlb_asid_check(void)
+{
+#ifdef DEBUG
+ register_t tlb_hi;
+ __asm("mfc0 %0,$%1" : "=r"(tlb_hi) : "n"(MIPS_COP_0_TLB_HI));
+ KASSERTMSG((tlb_hi & 0xff) != curcpu()->ci_pmap_asid_cur,
+ ("tlb_hi (%#x) asid != current asid (%#x)",
+ (uint8_t)tlb_hi, curcpu()->ci_pmap_asid_cur));
+#endif
+}