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

Juli Mallett jmallett at FreeBSD.org
Sun Apr 18 22:02:56 UTC 2010


Author: jmallett
Date: Sun Apr 18 22:02:55 2010
New Revision: 206816
URL: http://svn.freebsd.org/changeset/base/206816

Log:
  Add support for showing a remote CPU's TLB entries back.

Modified:
  user/jmallett/octeon/sys/mips/include/tlb.h
  user/jmallett/octeon/sys/mips/mips/mp_machdep.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	Sun Apr 18 21:36:34 2010	(r206815)
+++ user/jmallett/octeon/sys/mips/include/tlb.h	Sun Apr 18 22:02:55 2010	(r206816)
@@ -33,6 +33,7 @@ void tlb_insert_wired(unsigned, vm_offse
 void tlb_invalidate_address(struct pmap *, vm_offset_t);
 void tlb_invalidate_all(void);
 void tlb_invalidate_all_user(struct pmap *);
+void tlb_save(void);
 void tlb_update(struct pmap *, vm_offset_t, pt_entry_t);
 
 #endif /* !_MACHINE_TLB_H_ */

Modified: user/jmallett/octeon/sys/mips/mips/mp_machdep.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/mp_machdep.c	Sun Apr 18 21:36:34 2010	(r206815)
+++ user/jmallett/octeon/sys/mips/mips/mp_machdep.c	Sun Apr 18 22:02:55 2010	(r206816)
@@ -129,6 +129,7 @@ mips_ipi_handler(void *arg)
 			CTR0(KTR_SMP, "IPI_STOP or IPI_STOP_HARD");
 
 			savectx(&stoppcbs[cpu]);
+			tlb_save();
 
 			/* Indicate we are stopped */
 			atomic_set_int(&stopped_cpus, cpumask);

Modified: user/jmallett/octeon/sys/mips/mips/tlb.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/tlb.c	Sun Apr 18 21:36:34 2010	(r206815)
+++ user/jmallett/octeon/sys/mips/mips/tlb.c	Sun Apr 18 22:02:55 2010	(r206816)
@@ -32,6 +32,7 @@
 #include <sys/kernel.h>
 #include <sys/systm.h>
 #include <sys/pcpu.h>
+#include <sys/smp.h>
 
 #include <vm/vm.h>
 #include <vm/vm_page.h>
@@ -39,6 +40,17 @@
 #include <machine/pte.h>
 #include <machine/tlb.h>
 
+struct tlb_state {
+	unsigned wired;
+	struct tlb_entry {
+		register_t entryhi;
+		register_t entrylo0;
+		register_t entrylo1;
+	} entry[MIPS_MAX_TLB_ENTRIES];
+};
+
+static struct tlb_state tlb_state[MAXCPU];
+
 #if 0
 /*
  * PageMask must increment in steps of 2 bits.
@@ -183,6 +195,25 @@ tlb_invalidate_all_user(struct pmap *pma
 	intr_restore(s);
 }
 
+/* XXX Only if DDB?  */
+void
+tlb_save(void)
+{
+	unsigned i, cpu;
+
+	cpu = PCPU_GET(cpuid);
+
+	tlb_state[cpu].wired = mips_rd_wired();
+	for (i = 0; i < num_tlbentries; i++) {
+		mips_wr_index(i);
+		tlb_read();
+
+		tlb_state[cpu].entry[i].entryhi = mips_rd_entryhi();
+		tlb_state[cpu].entry[i].entrylo0 = mips_rd_entrylo0();
+		tlb_state[cpu].entry[i].entrylo1 = mips_rd_entrylo1();
+	}
+}
+
 void
 tlb_update(struct pmap *pmap, vm_offset_t va, pt_entry_t pte)
 {
@@ -235,22 +266,38 @@ tlb_invalidate_one(unsigned i)
 DB_SHOW_COMMAND(tlb, ddb_dump_tlb)
 {
 	register_t ehi, elo0, elo1;
-	unsigned i;
+	unsigned i, cpu;
 
-	db_printf("Beginning TLB dump...\n");
+	/*
+	 * XXX
+	 * The worst conversion from hex to decimal ever.
+	 */
+	if (have_addr)
+		cpu = ((addr >> 4) % 16) * 10 + (addr % 16);
+	else
+		cpu = PCPU_GET(cpuid);
+
+	if (cpu < 0 || cpu >= mp_ncpus) {
+		db_printf("Invalid CPU %u\n", cpu);
+		return;
+	}
+
+	if (cpu == PCPU_GET(cpuid))
+		tlb_save();
+
+	db_printf("Beginning TLB dump for CPU %u...\n", cpu);
 	for (i = 0; i < num_tlbentries; i++) {
-		if (i == mips_rd_wired()) {
+		if (i == tlb_state[cpu].wired) {
 			if (i != 0)
 				db_printf("^^^ WIRED ENTRIES ^^^\n");
 			else
 				db_printf("(No wired entries.)\n");
 		}
-		mips_wr_index(i);
-		tlb_read();
 
-		ehi = mips_rd_entryhi();
-		elo0 = mips_rd_entrylo0();
-		elo1 = mips_rd_entrylo1();
+		/* XXX PageMask.  */
+		ehi = tlb_state[cpu].entry[i].entryhi;
+		elo0 = tlb_state[cpu].entry[i].entrylo0;
+		elo1 = tlb_state[cpu].entry[i].entrylo1;
 
 		if (elo0 == 0 && elo1 == 0)
 			continue;


More information about the svn-src-user mailing list