Author: neel
Date: Fri Mar 12 03:49:17 2010
New Revision: 205064
URL: http://svn.freebsd.org/changeset/base/205064

Log:
  Make the ddb command "show tlb" SMP friendly.
  
  It now accepts an argument to dump out the tlb of a particular cpu.

Modified:
  head/sys/mips/include/cpuregs.h
  head/sys/mips/include/pmap.h
  head/sys/mips/mips/mp_machdep.c
  head/sys/mips/mips/pmap.c

Modified: head/sys/mips/include/cpuregs.h
==============================================================================
--- head/sys/mips/include/cpuregs.h     Fri Mar 12 03:08:47 2010        
(r205063)
+++ head/sys/mips/include/cpuregs.h     Fri Mar 12 03:49:17 2010        
(r205064)
@@ -577,6 +577,8 @@
 
 #define MIPS_CONFIG1_TLBSZ_MASK                0x7E000000      /* bits 30..25 
# tlb entries minus one */
 #define MIPS_CONFIG1_TLBSZ_SHIFT       25
+#define        MIPS_MAX_TLB_ENTRIES            64
+
 #define MIPS_CONFIG1_IS_MASK           0x01C00000      /* bits 24..22 icache 
sets per way */
 #define MIPS_CONFIG1_IS_SHIFT          22
 #define MIPS_CONFIG1_IL_MASK           0x00380000      /* bits 21..19 icache 
line size */

Modified: head/sys/mips/include/pmap.h
==============================================================================
--- head/sys/mips/include/pmap.h        Fri Mar 12 03:08:47 2010        
(r205063)
+++ head/sys/mips/include/pmap.h        Fri Mar 12 03:49:17 2010        
(r205064)
@@ -219,6 +219,11 @@ pmap_map_fpage(vm_paddr_t pa, struct fpa
     boolean_t check_unmaped);
 void pmap_unmap_fpage(vm_paddr_t pa, struct fpage *fp);
 
+/*
+ * Function to save TLB contents so that they may be inspected in the debugger.
+ */
+extern void pmap_save_tlb(void);
+
 #endif                         /* _KERNEL */
 
 #endif                         /* !LOCORE */

Modified: head/sys/mips/mips/mp_machdep.c
==============================================================================
--- head/sys/mips/mips/mp_machdep.c     Fri Mar 12 03:08:47 2010        
(r205063)
+++ head/sys/mips/mips/mp_machdep.c     Fri Mar 12 03:49:17 2010        
(r205064)
@@ -128,6 +128,7 @@ mips_ipi_handler(void *arg)
                        CTR0(KTR_SMP, "IPI_STOP or IPI_STOP_HARD");
 
                        savectx(&stoppcbs[cpu]);
+                       pmap_save_tlb();
 
                        /* Indicate we are stopped */
                        atomic_set_int(&stopped_cpus, cpumask);

Modified: head/sys/mips/mips/pmap.c
==============================================================================
--- head/sys/mips/mips/pmap.c   Fri Mar 12 03:08:47 2010        (r205063)
+++ head/sys/mips/mips/pmap.c   Fri Mar 12 03:49:17 2010        (r205064)
@@ -76,6 +76,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/msgbuf.h>
 #include <sys/vmmeter.h>
 #include <sys/mman.h>
+#include <sys/smp.h>
 
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -149,6 +150,8 @@ unsigned pmap_max_asid;             /* max ASID sup
 
 vm_offset_t kernel_vm_end;
 
+static struct tlb tlbstash[MAXCPU][MIPS_MAX_TLB_ENTRIES];
+
 static void pmap_asid_alloc(pmap_t pmap);
 
 /*
@@ -3284,17 +3287,6 @@ db_dump_tlb(int first, int last)
        }
 }
 
-#ifdef DDB
-#include <sys/kernel.h>
-#include <ddb/ddb.h>
-
-DB_SHOW_COMMAND(tlb, ddb_dump_tlb)
-{
-       db_dump_tlb(0, num_tlbentries - 1);
-}
-
-#endif
-
 /*
  *     Routine:        pmap_kextract
  *     Function:
@@ -3377,3 +3369,61 @@ pmap_flush_pvcache(vm_page_t m)
                }
        }
 }
+
+void
+pmap_save_tlb(void)
+{
+       int tlbno, cpu;
+
+       cpu = PCPU_GET(cpuid);
+
+       for (tlbno = 0; tlbno < num_tlbentries; ++tlbno)
+               MachTLBRead(tlbno, &tlbstash[cpu][tlbno]);
+}
+
+#ifdef DDB
+#include <ddb/ddb.h>
+
+DB_SHOW_COMMAND(tlb, ddb_dump_tlb)
+{
+       int cpu, tlbno;
+       struct tlb *tlb;
+
+       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 %d\n", cpu);
+               return;
+       } else
+               db_printf("CPU %d:\n", cpu);
+
+       if (cpu == PCPU_GET(cpuid))
+               pmap_save_tlb();
+
+       for (tlbno = 0; tlbno < num_tlbentries; ++tlbno) {
+               tlb = &tlbstash[cpu][tlbno];
+               if (tlb->tlb_lo0 & PTE_V || tlb->tlb_lo1 & PTE_V) {
+                       printf("TLB %2d vad 0x%0lx ",
+                               tlbno, (long)(tlb->tlb_hi & 0xffffff00));
+               } else {
+                       printf("TLB*%2d vad 0x%0lx ",
+                               tlbno, (long)(tlb->tlb_hi & 0xffffff00));
+               }
+               printf("0=0x%0lx ", pfn_to_vad((long)tlb->tlb_lo0));
+               printf("%c", tlb->tlb_lo0 & PTE_V ? 'V' : '-');
+               printf("%c", tlb->tlb_lo0 & PTE_M ? 'M' : '-');
+               printf("%c", tlb->tlb_lo0 & PTE_G ? 'G' : '-');
+               printf(" atr %x ", (tlb->tlb_lo0 >> 3) & 7);
+               printf("1=0x%0lx ", pfn_to_vad((long)tlb->tlb_lo1));
+               printf("%c", tlb->tlb_lo1 & PTE_V ? 'V' : '-');
+               printf("%c", tlb->tlb_lo1 & PTE_M ? 'M' : '-');
+               printf("%c", tlb->tlb_lo1 & PTE_G ? 'G' : '-');
+               printf(" atr %x ", (tlb->tlb_lo1 >> 3) & 7);
+               printf(" sz=%x pid=%x\n", tlb->tlb_mask,
+                      (tlb->tlb_hi & 0x000000ff));
+       }
+}
+#endif /* DDB */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to