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
+}

Reply via email to