Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/sh3 TLB dump command added to DDB



details:   https://anonhg.NetBSD.org/src/rev/80c5d79a51c3
branches:  trunk
changeset: 521917:80c5d79a51c3
user:      uch <uch%NetBSD.org@localhost>
date:      Fri Feb 08 06:12:00 2002 +0000

description:
TLB dump command added to DDB

diffstat:

 sys/arch/sh3/include/db_machdep.h |    7 +-
 sys/arch/sh3/sh3/db_interface.c   |  139 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 144 insertions(+), 2 deletions(-)

diffs (183 lines):

diff -r 52deb86a2bee -r 80c5d79a51c3 sys/arch/sh3/include/db_machdep.h
--- a/sys/arch/sh3/include/db_machdep.h Fri Feb 08 06:11:38 2002 +0000
+++ b/sys/arch/sh3/include/db_machdep.h Fri Feb 08 06:12:00 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: db_machdep.h,v 1.3 2000/09/08 10:15:23 tsubai Exp $    */
+/*     $NetBSD: db_machdep.h,v 1.4 2002/02/08 06:12:00 uch Exp $       */
 
 /*
  * Mach Operating System
@@ -101,4 +101,9 @@
 #define        DB_ELF_SYMBOLS
 #define        DB_ELFSIZE      32
 
+/*
+ * We have machine-dependent commands.
+ */
+#define DB_MACHINE_COMMANDS
+
 #endif /* _SH3_DB_MACHDEP_H_ */
diff -r 52deb86a2bee -r 80c5d79a51c3 sys/arch/sh3/sh3/db_interface.c
--- a/sys/arch/sh3/sh3/db_interface.c   Fri Feb 08 06:11:38 2002 +0000
+++ b/sys/arch/sh3/sh3/db_interface.c   Fri Feb 08 06:12:00 2002 +0000
@@ -1,6 +1,7 @@
-/*     $NetBSD: db_interface.c,v 1.4 2001/10/16 02:07:46 msaitoh Exp $ */
+/*     $NetBSD: db_interface.c,v 1.5 2002/02/08 06:12:01 uch Exp $     */
 
 /*-
+ * Copyright (C) 2002 UCHIYAMA Yasushi.  All rights reserved.
  * Copyright (c) 2000 Tsubai Masanari.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,11 +48,17 @@
 #include <ddb/ddbvar.h>
 
 void kdb_printtrap(u_int, int);
+void db_tlbdump_cmd(db_expr_t, int, db_expr_t, char *);
 
 extern label_t *db_recover;
 extern char *trap_type[];
 extern int trap_types;
 
+const struct db_command db_machine_command_table[] = {
+       { "tlb",        db_tlbdump_cmd,         0,      0 },
+       { 0 }
+};
+
 int db_active;
 
 void
@@ -175,3 +182,133 @@
 {
        regs->tf_ubc = 0;
 }
+
+void
+db_tlbdump_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
+{
+#define ON(x, c)       ((x) & (c) ? '|' : '.')
+       static const char *pr[] = { ".r", ".w", "rr", "ww" };
+       static const char title[] = 
+           "   VPN    ASID    PFN     VDCGWtPR  SZ";
+       static const char title2[] = "\t\t\t    (user/kernel)";
+       int i, cpu_is_sh4;
+       u_int32_t r, e, a;
+#ifdef SH4
+       cpu_is_sh4 = 1;
+#else
+       cpu_is_sh4 = 0;
+#endif 
+       if (!cpu_is_sh4) {
+               /* MMU configuration. */
+               r = _reg_read_4(SH3_MMUCR);
+               printf("%s-mode, %s virtual storage mode\n",
+                   r & SH3_MMUCR_IX
+                   ? "ASID + VPN" : "VPN only",
+                   r & SH3_MMUCR_SV ? "single" : "multiple");
+               printf("---TLB DUMP---\n%s\n%s\n", title, title2);
+               for (i = 0; i < SH3_MMU_WAY; i++) {
+                       printf(" [way %d]\n", i);
+                       for (e = 0; e < SH3_MMU_ENTRY; e++) {
+                               /* address/data array common offset. */
+                               a = (e << SH3_MMU_VPN_SHIFT) |
+                                   (i << SH3_MMU_WAY_SHIFT);
+
+                               r = _reg_read_4(SH3_MMUAA | a);
+                               printf("0x%08x %3d",
+                                   r & SH3_MMUAA_D_VPN_MASK,
+                                   r & SH3_MMUAA_D_ASID_MASK);
+                               r = _reg_read_4(SH3_MMUDA | a);
+                               printf(" 0x%08x %c%c%c%c_ %s %2dK\n",
+                                   r & SH3_MMUDA_D_PPN_MASK,
+                                   ON(r, SH3_MMUDA_D_V),
+                                   ON(r, SH3_MMUDA_D_D),
+                                   ON(r, SH3_MMUDA_D_C),
+                                   ON(r, SH3_MMUDA_D_SH),
+                                   pr[(r & SH3_MMUDA_D_PR_MASK) >>
+                                       SH3_MMUDA_D_PR_SHIFT],
+                                   r & SH3_MMUDA_D_SZ ? 4 : 1);
+                       }
+               }
+       } else {
+               /* MMU configuration */
+               r = _reg_read_4(SH4_MMUCR);
+               printf("%s virtual storage mode,  SQ access: (kernel%s)\n",
+                   r & SH3_MMUCR_SV ? "single" : "multiple",
+                   r & SH4_MMUCR_SQMD ? "" : "/user");
+
+               /* Dump ITLB */
+               printf("---ITLB DUMP ---\n%s TC SA\n%s\n", title, title2);
+               for (i = 0; i < 4; i++) {
+                       e = i << SH4_ITLB_E_SHIFT;
+                       r = _reg_read_4(SH4_ITLB_AA | e);
+                       printf("0x%08x %3d",
+                           r & SH4_ITLB_AA_VPN_MASK,
+                           r & SH4_ITLB_AA_ASID_MASK);
+                       r = _reg_read_4(SH4_ITLB_DA1 | e);
+                       printf(" 0x%08x %c_%c%c_ %s ",
+                           r & SH4_ITLB_DA1_PPN_MASK,
+                           ON(r, SH4_ITLB_DA1_V),
+                           ON(r, SH4_ITLB_DA1_C),
+                           ON(r, SH4_ITLB_DA1_SH),
+                           pr[(r & SH4_ITLB_DA1_PR) >>
+                               SH4_UTLB_DA1_PR_SHIFT]);
+                       switch (r & SH4_PTEL_SZ_MASK) {
+                       case SH4_PTEL_SZ_1K:
+                               printf(" 1K");
+                               break;
+                       case SH4_PTEL_SZ_4K:
+                               printf(" 4K");
+                               break;
+                       case SH4_PTEL_SZ_64K:
+                               printf("64K");
+                               break;
+                       case SH4_PTEL_SZ_1M:
+                               printf(" 1M");
+                               break;
+                       }
+                       r = _reg_read_4(SH4_ITLB_DA2 | e);
+                       printf(" %c  %d\n",
+                           ON(r, SH4_ITLB_DA2_TC), 
+                           r & SH4_ITLB_DA2_SA_MASK);
+               }
+               /* Dump UTLB */
+               printf("---UTLB DUMP---\n%s TC SA\n%s\n", title, title2);
+               for (i = 0; i < 64; i++) {
+                       e = i << SH4_UTLB_E_SHIFT;
+                       r = _reg_read_4(SH4_UTLB_AA | e);
+                       printf("0x%08x %3d",
+                           r & SH4_UTLB_AA_VPN_MASK,
+                           r & SH4_UTLB_AA_ASID_MASK);
+                       r = _reg_read_4(SH4_UTLB_DA1 | e);
+                       printf(" 0x%08x %c%c%c%c%c %s ",
+                           r & SH4_UTLB_DA1_PPN_MASK,
+                           ON(r, SH4_UTLB_DA1_V),
+                           ON(r, SH4_UTLB_DA1_D),
+                           ON(r, SH4_UTLB_DA1_C),
+                           ON(r, SH4_UTLB_DA1_SH),
+                           ON(r, SH4_UTLB_DA1_WT),
+                           pr[(r & SH4_UTLB_DA1_PR_MASK) >>
+                               SH4_UTLB_DA1_PR_SHIFT]
+                           );
+                       switch (r & SH4_PTEL_SZ_MASK) {
+                       case SH4_PTEL_SZ_1K:
+                               printf(" 1K");
+                               break;
+                       case SH4_PTEL_SZ_4K:
+                               printf(" 4K");
+                               break;
+                       case SH4_PTEL_SZ_64K:
+                               printf("64K");
+                               break;
+                       case SH4_PTEL_SZ_1M:
+                               printf(" 1M");
+                               break;
+                       }
+                       r = _reg_read_4(SH4_UTLB_DA2 | e);
+                       printf(" %c  %d\n",
+                           ON(r, SH4_UTLB_DA2_TC),
+                           r & SH4_UTLB_DA2_SA_MASK);
+               }
+       }
+#undef ON
+}



Home | Main Index | Thread Index | Old Index