Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sparc64/sparc64 change print_dtlb() and print_itlb(...



details:   https://anonhg.NetBSD.org/src/rev/1649148a30df
branches:  trunk
changeset: 752323:1649148a30df
user:      mrg <mrg%NetBSD.org@localhost>
date:      Tue Feb 23 05:32:08 2010 +0000

description:
change print_dtlb() and print_itlb() to take (tlb_size, tlb_selectbits).
for cheetah, print the 3 dtlb's and 2 itlb's.

now "mach dtlb" and "mach itlb" work for cheetah.

diffstat:

 sys/arch/sparc64/sparc64/db_interface.c  |  67 +++++++++++++++++++-------
 sys/arch/sparc64/sparc64/db_tlb_access.S |  79 ++++++-------------------------
 2 files changed, 65 insertions(+), 81 deletions(-)

diffs (296 lines):

diff -r 18442c15977b -r 1649148a30df sys/arch/sparc64/sparc64/db_interface.c
--- a/sys/arch/sparc64/sparc64/db_interface.c   Tue Feb 23 05:24:50 2010 +0000
+++ b/sys/arch/sparc64/sparc64/db_interface.c   Tue Feb 23 05:32:08 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: db_interface.c,v 1.121 2010/02/02 04:28:56 mrg Exp $ */
+/*     $NetBSD: db_interface.c,v 1.122 2010/02/23 05:32:08 mrg Exp $ */
 
 /*
  * Copyright (c) 1996-2002 Eduardo Horvath.  All rights reserved.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.121 2010/02/02 04:28:56 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.122 2010/02/23 05:32:08 mrg Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -571,20 +571,49 @@
        prom_abort();
 }
 
+/*
+ * Dump the [ID]TLB's.
+ *
+ * Spitfire has 64 entry TLBs for instruction and data.
+ *
+ * Cheetah has 5 TLBs in total:
+ *     instruction tlbs - it16, it128 -- 16 and 128 entry TLBs
+ *     data tlbs - dt16, dt512_0, dt512_1 -- 16, and 2*512 entry TLBs
+ *
+ * The TLB chosen is chosen depending on the values in bits 16/17,
+ * and the address is the index shifted 3 bits left.
+ *
+ * These are in db_tlb_access.S:
+ *     void print_dtlb(size_t tlbsize, int tlbmask)
+ *     void print_itlb(size_t tlbsize, int tlbmask)
+ */
+
 void
 db_dump_dtlb(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif)
 {
-       extern void print_dtlb(void);
+       extern void print_dtlb(size_t, int);
 
-       print_dtlb();
+       if (CPU_IS_USIII_UP()) {
+               print_dtlb(TLB_SIZE_CHEETAH_D16, TLB_CHEETAH_D16);
+               db_printf("DT512_0:\n");
+               print_dtlb(TLB_SIZE_CHEETAH_D512_0, TLB_CHEETAH_D512_0);
+               db_printf("DT512_1:\n");
+               print_dtlb(TLB_SIZE_CHEETAH_D512_1, TLB_CHEETAH_D512_1);
+       } else
+               print_dtlb(TLB_SIZE_SPITFIRE, 0);
 }
 
 void
 db_dump_itlb(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif)
 {
-       extern void print_itlb(void);
+       extern void print_itlb(size_t, int);
 
-       print_itlb();
+       if (CPU_IS_USIII_UP()) {
+               print_itlb(TLB_SIZE_CHEETAH_I16, TLB_CHEETAH_I16);
+               db_printf("IT128:\n");
+               print_itlb(TLB_SIZE_CHEETAH_I128, TLB_CHEETAH_I128);
+       } else
+               print_itlb(TLB_SIZE_SPITFIRE, 0);
 }
 
 void
@@ -679,7 +708,7 @@
                
                if ((data = pseg_get(pmap_kernel(), (vaddr_t)addr))) {
                        db_printf("pmap_kernel(%p)->pm_segs[%lx][%lx][%lx]=>%qx\n",
-                                 (void *)(uintptr_t)addr, (u_long)va_to_seg(addr), 
+                                 (void *)(uintptr_t)addr, (u_long)va_to_seg(addr),
                                  (u_long)va_to_dir(addr), (u_long)va_to_pte(addr),
                                  (unsigned long long)data);
                } else {
@@ -815,7 +844,7 @@
        struct lwp *l;
 
        l = curlwp;
-       if (have_addr) 
+       if (have_addr)
                l = (struct lwp*)(uintptr_t)addr;
        if (l == NULL) {
                db_printf("no current lwp\n");
@@ -836,7 +865,7 @@
 
        if (curlwp)
                p = curlwp->l_proc;
-       if (have_addr) 
+       if (have_addr)
                p = (struct proc*)(uintptr_t)addr;
        if (p == NULL) {
                db_printf("no current process\n");
@@ -847,7 +876,7 @@
                  p->p_pid, p->p_vmspace, p->p_vmspace->vm_map.pmap,
                  pmap_ctx(p->p_vmspace->vm_map.pmap));
        db_printf("maxsaddr:%p ssiz:%dpg or %llxB\n",
-                 p->p_vmspace->vm_maxsaddr, p->p_vmspace->vm_ssize, 
+                 p->p_vmspace->vm_maxsaddr, p->p_vmspace->vm_ssize,
                  (unsigned long long)ctob(p->p_vmspace->vm_ssize));
        db_printf("profile timer: %" PRId64 " sec %ld nsec\n",
                  p->p_stats->p_timer[ITIMER_PROF].it_value.tv_sec,
@@ -889,7 +918,7 @@
        int i;
 
        pcb = curpcb;
-       if (have_addr) 
+       if (have_addr)
                pcb = (struct pcb*)(uintptr_t)addr;
 
        db_printf("pcb@%p sp:%p pc:%p cwp:%d pil:%d nsaved:%x onfault:%p\nlastcall:%s\nfull windows:\n",
@@ -898,7 +927,7 @@
                  (pcb->lastcall)?pcb->lastcall:"Null");
        
        for (i=0; i<pcb->pcb_nsaved; i++) {
-               db_printf("win %d: at %llx local, in\n", i, 
+               db_printf("win %d: at %llx local, in\n", i,
                          (unsigned long long)pcb->pcb_rw[i+1].rw_in[6]);
                db_printf("%16llx %16llx %16llx %16llx\n",
                          (unsigned long long)pcb->pcb_rw[i].rw_local[0],
@@ -934,7 +963,7 @@
                db_printf("What PID do you want to map in?\n");
                return;
        }
-    
+
        LIST_FOREACH(p, &allproc, p_list) {
                pp = p->p_pptr;
                if (p->p_stat && p->p_pid == addr) {
@@ -976,9 +1005,9 @@
 static void
 db_print_trace_entry(struct traptrace *te, int i)
 {
-       db_printf("%d:%d p:%d tt:%x:%llx:%llx %llx:%llx ", i, 
-                 (int)te->tl, (int)te->pid, 
-                 (int)te->tt, (unsigned long long)te->tstate, 
+       db_printf("%d:%d p:%d tt:%x:%llx:%llx %llx:%llx ", i,
+                 (int)te->tl, (int)te->pid,
+                 (int)te->tt, (unsigned long long)te->tstate,
                  (unsigned long long)te->tfault, (unsigned long long)te->tsp,
                  (unsigned long long)te->tpc);
        db_printsym((u_long)te->tpc, DB_STGY_PROC, db_printf);
@@ -1041,12 +1070,12 @@
        }
 }
 
-/* 
+/*
  * Use physical or virtul watchpoint registers -- ugh
  *
  * UltraSPARC I and II have both a virtual and physical
- * watchpoint register.  They are controlled by the LSU 
- * control register.  
+ * watchpoint register.  They are controlled by the LSU
+ * control register.
  */
 void
 db_watch(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif)
diff -r 18442c15977b -r 1649148a30df sys/arch/sparc64/sparc64/db_tlb_access.S
--- a/sys/arch/sparc64/sparc64/db_tlb_access.S  Tue Feb 23 05:24:50 2010 +0000
+++ b/sys/arch/sparc64/sparc64/db_tlb_access.S  Tue Feb 23 05:32:08 2010 +0000
@@ -1,10 +1,10 @@
-/*     $NetBSD: db_tlb_access.S,v 1.1 2010/02/22 22:28:58 mrg Exp $    */
+/*     $NetBSD: db_tlb_access.S,v 1.2 2010/02/23 05:32:08 mrg Exp $    */
 
 /*
  * Copyright (c) 1996-2002 Eduardo Horvath
+ * Copyright (c) 2010 Matthew R. Green
  * All rights reserved.
  *
- *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -25,65 +25,19 @@
  *
  */
 
-#include "opt_ddb.h"
-
 #include <machine/ctlreg.h>
 #include <machine/asm.h>
 
-#ifdef DDB
-!!!
-!!! Dump the DTLB to phys address in %o0 and print it
-!!!
-!!! Only toast a few %o registers
-!!!
-
-ENTRY_NOPROFILE(dump_dtlb)
-       clr     %o1
-       add     %o1, (64 * 8), %o3              ! XXX TLB_SIZE
-1:
-       ldxa    [%o1] ASI_DMMU_TLB_TAG, %o2
-       membar  #Sync
-       stx     %o2, [%o0]
-       membar  #Sync
-       inc     8, %o0
-       ldxa    [%o1] ASI_DMMU_TLB_DATA, %o4
-       membar  #Sync
-       inc     8, %o1
-       stx     %o4, [%o0]
-       cmp     %o1, %o3
-       membar  #Sync
-       bl      1b
-        inc    8, %o0
-
-       retl
-        nop
-
-ENTRY_NOPROFILE(dump_itlb)
-       clr     %o1
-       add     %o1, (64 * 8), %o3              ! XXX TLB_SIZE
-1:
-       ldxa    [%o1] ASI_IMMU_TLB_TAG, %o2
-       membar  #Sync
-       stx     %o2, [%o0]
-       membar  #Sync
-       inc     8, %o0
-       ldxa    [%o1] ASI_IMMU_TLB_DATA, %o4
-       membar  #Sync
-       inc     8, %o1
-       stx     %o4, [%o0]
-       cmp     %o1, %o3
-       membar  #Sync
-       bl      1b
-        inc    8, %o0
-
-       retl
-        nop
+/*
+ * Basic routines to print the I/D-TLB tag & data info.
+ */
 
 #ifdef _LP64
 ENTRY_NOPROFILE(print_dtlb)
        save    %sp, -CC64FSZ, %sp
-       clr     %l1
-       add     %l1, (64 * 8), %l3              ! XXX TLB_SIZE
+       sll     %i0, 3, %l3
+       or      %l3, %i1, %l3
+       mov     %i1, %l1
        clr     %l2
 1:
        ldxa    [%l1] ASI_DMMU_TLB_TAG, %o2
@@ -113,11 +67,11 @@
        ret
         restore
 
-
 ENTRY_NOPROFILE(print_itlb)
        save    %sp, -CC64FSZ, %sp
-       clr     %l1
-       add     %l1, (64 * 8), %l3              ! XXX TLB_SIZE
+       sll     %i0, 3, %l3
+       or      %l3, %i1, %l3
+       mov     %i1, %l1
        clr     %l2
 1:
        ldxa    [%l1] ASI_IMMU_TLB_TAG, %o2
@@ -156,8 +110,9 @@
 #else
 ENTRY_NOPROFILE(print_dtlb)
        save    %sp, -CC64FSZ, %sp
-       clr     %l1
-       add     %l1, (64 * 8), %l3              ! XXX TLB_SIZE
+       sll     %i0, 3, %l3
+       or      %l3, %i1, %l3
+       mov     %i1, %l1
        clr     %l2
 1:
        ldxa    [%l1] ASI_DMMU_TLB_TAG, %o2
@@ -197,8 +152,9 @@
 
 ENTRY_NOPROFILE(print_itlb)
        save    %sp, -CC64FSZ, %sp
-       clr     %l1
-       add     %l1, (64 * 8), %l3              ! XXX TLB_SIZE
+       sll     %i0, 3, %l3
+       or      %l3, %i1, %l3
+       mov     %i1, %l1
        clr     %l2
 1:
        ldxa    [%l1] ASI_IMMU_TLB_TAG, %o2
@@ -243,4 +199,3 @@
        .asciz  "%2d:%08x:%08x %08x:%08x\r\n"
        .text
 #endif
-#endif



Home | Main Index | Thread Index | Old Index