svn commit: r206590 - in user/jmallett/octeon/sys/mips: include mips

Juli Mallett jmallett at FreeBSD.org
Wed Apr 14 05:54:00 UTC 2010


Author: jmallett
Date: Wed Apr 14 05:53:59 2010
New Revision: 206590
URL: http://svn.freebsd.org/changeset/base/206590

Log:
  o) Add a routine to invalidate all TLB entries associated with a specific or
     any non-kernel pmap.

Modified:
  user/jmallett/octeon/sys/mips/include/tlb.h
  user/jmallett/octeon/sys/mips/mips/pmap.c
  user/jmallett/octeon/sys/mips/mips/tlb.c

Modified: user/jmallett/octeon/sys/mips/include/tlb.h
==============================================================================
--- user/jmallett/octeon/sys/mips/include/tlb.h	Wed Apr 14 05:44:02 2010	(r206589)
+++ user/jmallett/octeon/sys/mips/include/tlb.h	Wed Apr 14 05:53:59 2010	(r206590)
@@ -31,6 +31,7 @@
 
 void tlb_invalidate_address(struct pmap *, vm_offset_t);
 void tlb_invalidate_all(void);
+void tlb_invalidate_all_user(struct pmap *);
 void tlb_update(struct pmap *, vm_offset_t, pt_entry_t);
 
 #endif /* !_MACHINE_TLB_H_ */

Modified: user/jmallett/octeon/sys/mips/mips/pmap.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/pmap.c	Wed Apr 14 05:44:02 2010	(r206589)
+++ user/jmallett/octeon/sys/mips/mips/pmap.c	Wed Apr 14 05:53:59 2010	(r206590)
@@ -588,13 +588,14 @@ pmap_invalidate_all_action(void *arg)
 
 #endif
 
-	if (pmap->pm_active & PCPU_GET(cpumask)) {
-		/*
-		 * XXX/juli
-		 * Add something like TBIAP.
-		 */
+	if (pmap == kernel_pmap) {
 		tlb_invalidate_all();
-	} else
+		return;
+	}
+
+	if (pmap->pm_active & PCPU_GET(cpumask))
+		tlb_invalidate_all_user(pmap);
+	else
 		pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
 }
 
@@ -2907,11 +2908,7 @@ pmap_asid_alloc(pmap)
 	    pmap->pm_asid[PCPU_GET(cpuid)].gen == PCPU_GET(asid_generation));
 	else {
 		if (PCPU_GET(next_asid) == pmap_max_asid) {
-			/*
-			 * XXX/juli
-			 * Add something like TBIAP.
-			 */
-			tlb_invalidate_all();
+			tlb_invalidate_all_user(NULL);
 			PCPU_SET(asid_generation,
 			    (PCPU_GET(asid_generation) + 1) & ASIDGEN_MASK);
 			if (PCPU_GET(asid_generation) == 0) {

Modified: user/jmallett/octeon/sys/mips/mips/tlb.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/tlb.c	Wed Apr 14 05:44:02 2010	(r206589)
+++ user/jmallett/octeon/sys/mips/mips/tlb.c	Wed Apr 14 05:53:59 2010	(r206590)
@@ -127,6 +127,43 @@ tlb_invalidate_all(void)
 }
 
 void
+tlb_invalidate_all_user(struct pmap *pmap)
+{
+	register_t mask, asid;
+	register_t s;
+	unsigned i;
+
+	s = intr_disable();
+	mask = mips_rd_pagemask();
+	asid = mips_rd_entryhi() & TLBHI_ASID_MASK;
+	for (i = mips_rd_wired(); i < num_tlbentries; i++) {
+		register_t uasid;
+
+		mips_wr_index(i);
+		tlb_read();
+
+		uasid = mips_rd_entryhi() & TLBHI_ASID_MASK;
+		if (pmap == NULL) {
+			/*
+			 * Invalidate all non-kernel entries.
+			 */
+			if (uasid == 0)
+				continue;
+		} else {
+			/*
+			 * Invalidate this pmap's entries.
+			 */
+			if (uasid != pmap_asid(pmap))
+				continue;
+		}
+		tlb_invalidate_one(i);
+	}
+	mips_wr_entryhi(asid);
+	mips_wr_pagemask(mask);
+	intr_restore(s);
+}
+
+void
 tlb_update(struct pmap *pmap, vm_offset_t va, pt_entry_t pte)
 {
 	register_t mask, asid;


More information about the svn-src-user mailing list