Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/powerpc New machine commands for PPC OEA:
details: https://anonhg.NetBSD.org/src/rev/675fd8b588f4
branches: trunk
changeset: 751225:675fd8b588f4
user: phx <phx%NetBSD.org@localhost>
date: Thu Jan 28 21:10:48 2010 +0000
description:
New machine commands for PPC OEA:
bat: prints the BAT registers and translations
mmu: prints MMU registers (sdr1, sr0..15)
diffstat:
sys/arch/powerpc/include/db_machdep.h | 4 +-
sys/arch/powerpc/powerpc/db_interface.c | 246 +++++++++++++++++++++++++++----
2 files changed, 214 insertions(+), 36 deletions(-)
diffs (truncated from 317 to 300 lines):
diff -r 226117c1937e -r 675fd8b588f4 sys/arch/powerpc/include/db_machdep.h
--- a/sys/arch/powerpc/include/db_machdep.h Thu Jan 28 19:01:32 2010 +0000
+++ b/sys/arch/powerpc/include/db_machdep.h Thu Jan 28 21:10:48 2010 +0000
@@ -1,5 +1,5 @@
/* $OpenBSD: db_machdep.h,v 1.2 1997/03/21 00:48:48 niklas Exp $ */
-/* $NetBSD: db_machdep.h,v 1.20 2009/03/14 14:46:05 dsl Exp $ */
+/* $NetBSD: db_machdep.h,v 1.21 2010/01/28 21:10:48 phx Exp $ */
/*
* Mach Operating System
@@ -150,12 +150,10 @@
void kdb_kintr(void *);
int kdb_trap(int, void *);
-#ifdef PPC_IBM4XX
/*
* We have machine-dependent commands.
*/
#define DB_MACHINE_COMMANDS
-#endif
#endif /* _KERNEL */
diff -r 226117c1937e -r 675fd8b588f4 sys/arch/powerpc/powerpc/db_interface.c
--- a/sys/arch/powerpc/powerpc/db_interface.c Thu Jan 28 19:01:32 2010 +0000
+++ b/sys/arch/powerpc/powerpc/db_interface.c Thu Jan 28 21:10:48 2010 +0000
@@ -1,8 +1,8 @@
-/* $NetBSD: db_interface.c,v 1.42 2010/01/28 12:45:01 phx Exp $ */
+/* $NetBSD: db_interface.c,v 1.43 2010/01/28 21:10:49 phx Exp $ */
/* $OpenBSD: db_interface.c,v 1.2 1996/12/28 06:21:50 rahnds Exp $ */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.42 2010/01/28 12:45:01 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.43 2010/01/28 21:10:49 phx Exp $");
#define USERACC
@@ -18,9 +18,13 @@
#include <machine/db_machdep.h>
#include <machine/frame.h>
+#include <powerpc/spr.h>
+#include <powerpc/cpu.h>
+#include <powerpc/bat.h>
+#include <powerpc/pte.h>
+
#ifdef PPC_IBM4XX
#include <machine/tlb.h>
-#include <powerpc/spr.h>
#include <uvm/uvm_extern.h>
#endif
@@ -47,6 +51,10 @@
void ddb_trap(void); /* Call into trap_subr.S */
int ddb_trap_glue(struct trapframe *); /* Called from trap_subr.S */
+#if defined (PPC_OEA) || defined(PPC_OEA64) || defined (PPC_OEA64_BRIDGE)
+static void db_show_bat(db_expr_t, bool, db_expr_t, const char *);
+static void db_show_mmu(db_expr_t, bool, db_expr_t, const char *);
+#endif /* PPC_OEA || PPC_OEA64 || PPC_OEA64_BRIDGE */
#ifdef PPC_IBM4XX
static void db_ppc4xx_ctx(db_expr_t, bool, db_expr_t, const char *);
static void db_ppc4xx_pv(db_expr_t, bool, db_expr_t, const char *);
@@ -62,6 +70,44 @@
#endif /* PPC_IBM4XX */
#ifdef DDB
+const struct db_command db_machine_command_table[] = {
+#if defined (PPC_OEA) || defined(PPC_OEA64) || defined (PPC_OEA64_BRIDGE)
+ { DDB_ADD_CMD("bat", db_show_bat, 0,
+ "Print BAT register translations", NULL,NULL) },
+ { DDB_ADD_CMD("mmu", db_show_mmu, 0,
+ "Print MMU registers", NULL,NULL) },
+#endif /* PPC_OEA || PPC_OEA64 || PPC_OEA64_BRIDGE */
+#ifdef PPC_IBM4XX
+ { DDB_ADD_CMD("ctx", db_ppc4xx_ctx, 0,
+ "Print process MMU context information", NULL,NULL) },
+ { DDB_ADD_CMD("pv", db_ppc4xx_pv, 0,
+ "Print PA->VA mapping information",
+ "address",
+ " address:\tphysical address to look up") },
+ { DDB_ADD_CMD("reset", db_ppc4xx_reset, 0,
+ "Reset the system ", NULL,NULL) },
+ { DDB_ADD_CMD("tf", db_ppc4xx_tf, 0,
+ "Display the contents of the trapframe",
+ "address",
+ " address:\tthe struct trapframe to print") },
+ { DDB_ADD_CMD("tlb", db_ppc4xx_dumptlb, 0,
+ "Display instruction translation storage buffer information.",
+ NULL,NULL) },
+ { DDB_ADD_CMD("dcr", db_ppc4xx_dcr, CS_MORE|CS_SET_DOT,
+ "Set the DCR register",
+ "dcr",
+ " dcr:\tNew DCR value (between 0x0 and 0x3ff)") },
+#ifdef USERACC
+ { DDB_ADD_CMD("user", db_ppc4xx_useracc, 0,
+ "Display user memory.", "[address][,count]",
+ " address:\tuserspace address to start\n"
+ " count:\tnumber of bytes to display") },
+#endif
+#endif /* PPC_IBM4XX */
+ { DDB_ADD_CMD(NULL, NULL, 0,
+ NULL,NULL,NULL) }
+};
+
void
cpu_Debugger(void)
{
@@ -164,6 +210,169 @@
return 1;
}
+#if defined (PPC_OEA) || defined(PPC_OEA64) || defined (PPC_OEA64_BRIDGE)
+static void
+print_battranslation(struct bat *bat, unsigned int blidx)
+{
+ static const char *const batsizes[] = {
+ "128kB",
+ "256kB",
+ "512kB",
+ "1MB",
+ "2MB",
+ "4MB",
+ "8MB",
+ "16MB",
+ "32MB",
+ "64MB",
+ "128MB",
+ "256MB"
+ };
+ vsize_t len;
+
+ len = (0x20000L << blidx) - 1;
+ db_printf("\t%08lx %08lx %5s: 0x%08lx..0x%08lx -> 0x%08lx physical\n",
+ bat->batu, bat->batl, batsizes[blidx], bat->batu & ~len,
+ (bat->batu & ~len) + len, bat->batl & ~len);
+}
+
+static void
+print_batmodes(register_t super, register_t user, register_t pp)
+{
+ static const char *const accessmodes[] = {
+ "none",
+ "ro soft",
+ "read/write",
+ "read only"
+ };
+
+ db_printf("\tvalid: %c%c access: %-10s memory:",
+ super ? 'S' : '-', user ? 'U' : '-', accessmodes[pp]);
+}
+
+static void
+print_wimg(register_t wimg)
+{
+ if (wimg & BAT_W)
+ db_printf(" wrthrough");
+ if (wimg & BAT_I)
+ db_printf(" nocache");
+ if (wimg & BAT_M)
+ db_printf(" coherent");
+ if (wimg & BAT_G)
+ db_printf(" guard");
+}
+
+static void
+print_bat(struct bat *bat)
+{
+ if ((bat->batu & BAT_V) == 0) {
+ db_printf("\tdisabled\n\n");
+ return;
+ }
+ print_battranslation(bat, 30 - __builtin_clz((bat->batu & BAT_BL)|2));
+ print_batmodes(bat->batu & BAT_Vs, bat->batu & BAT_Vu,
+ bat->batl & BAT_PP);
+ print_wimg(bat->batl & BAT_WIMG);
+ db_printf("\n");
+}
+
+#ifdef PPC_OEA601
+static void
+print_bat601(struct bat *bat)
+{
+ if ((bat->batl & BAT601_V) == 0) {
+ db_printf("\tdisabled\n\n");
+ return;
+ }
+ print_battranslation(bat, 32 - __builtin_clz(bat->batl & BAT601_BSM));
+ print_batmodes(bat->batu & BAT601_Ks, bat->batu & BAT601_Ku,
+ bat->batu & BAT601_PP);
+ print_wimg(bat->batu & (BAT601_W | BAT601_I | BAT601_M));
+ db_printf("\n");
+}
+#endif
+
+static void
+db_show_bat(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif)
+{
+ struct bat ibat[4];
+ struct bat dbat[4];
+ unsigned int cpuvers;
+ int i;
+
+ cpuvers = mfpvr() >> 16;
+
+ __asm volatile ("mfibatu %0,0" : "=r"(ibat[0].batu));
+ __asm volatile ("mfibatl %0,0" : "=r"(ibat[0].batl));
+ __asm volatile ("mfibatu %0,1" : "=r"(ibat[1].batu));
+ __asm volatile ("mfibatl %0,1" : "=r"(ibat[1].batl));
+ __asm volatile ("mfibatu %0,2" : "=r"(ibat[2].batu));
+ __asm volatile ("mfibatl %0,2" : "=r"(ibat[2].batl));
+ __asm volatile ("mfibatu %0,3" : "=r"(ibat[3].batu));
+ __asm volatile ("mfibatl %0,3" : "=r"(ibat[3].batl));
+
+ if (cpuvers != MPC601) {
+ /* The 601 has only four unified BATs */
+ __asm volatile ("mfdbatu %0,0" : "=r"(dbat[0].batu));
+ __asm volatile ("mfdbatl %0,0" : "=r"(dbat[0].batl));
+ __asm volatile ("mfdbatu %0,1" : "=r"(dbat[1].batu));
+ __asm volatile ("mfdbatl %0,1" : "=r"(dbat[1].batl));
+ __asm volatile ("mfdbatu %0,2" : "=r"(dbat[2].batu));
+ __asm volatile ("mfdbatl %0,2" : "=r"(dbat[2].batl));
+ __asm volatile ("mfdbatu %0,3" : "=r"(dbat[3].batu));
+ __asm volatile ("mfdbatl %0,3" : "=r"(dbat[3].batl));
+ }
+
+ for (i = 0; i < 4; i++) {
+#ifdef PPC_OEA601
+ if (cpuvers == MPC601) {
+ db_printf("bat%d:", i);
+ print_bat601(&ibat[i]);
+ } else
+#endif
+ {
+ db_printf("ibat%d:", i);
+ print_bat(&ibat[i]);
+ }
+ }
+ if (cpuvers != MPC601) {
+ for (i = 0; i < 4; i++) {
+ db_printf("dbat%d:", i);
+ print_bat(&dbat[i]);
+ }
+ }
+}
+
+static void
+db_show_mmu(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif)
+{
+ paddr_t sdr1;
+#if !defined(PPC_OEA64) && !defined(PPC_OEA64_BRIDGE)
+ register_t sr;
+ vaddr_t saddr;
+ int i;
+#endif
+
+ __asm volatile ("mfsdr1 %0" : "=r"(sdr1));
+ db_printf("sdr1\t\t0x%08lx\n", sdr1);
+
+#if defined(PPC_OEA64) || defined(PPC_OEA64_BRIDGE)
+ __asm volatile ("mfasr %0" : "=r"(sdr1));
+ db_printf("asr\t\t0x%08lx\n", sdr1);
+#else
+ saddr = 0;
+ for (i = 0; i<= 0xf; i++) {
+ if ((i & 3) == 0)
+ db_printf("sr%d-%d\t\t", i, i+3);
+ __asm volatile ("mfsrin %0,%1" : "=r"(sr) : "r"(saddr));
+ db_printf("0x%08lx %c", sr, (i&3) == 3 ? '\n' : ' ');
+ saddr += 1 << ADDR_SR_SHFT;
+ }
+#endif
+}
+#endif /* PPC_OEA || PPC_OEA64 || PPC_OEA64_BRIDGE */
+
#ifdef PPC_IBM4XX
db_addr_t
branch_taken(int inst, db_addr_t pc, db_regs_t *regs)
@@ -192,37 +401,8 @@
return (0);
}
+
#ifdef DDB
-const struct db_command db_machine_command_table[] = {
- { DDB_ADD_CMD("ctx", db_ppc4xx_ctx, 0,
- "Print process MMU context information", NULL,NULL) },
- { DDB_ADD_CMD("pv", db_ppc4xx_pv, 0,
- "Print PA->VA mapping information",
- "address",
- " address:\tphysical address to look up") },
- { DDB_ADD_CMD("reset", db_ppc4xx_reset, 0,
- "Reset the system ", NULL,NULL) },
- { DDB_ADD_CMD("tf", db_ppc4xx_tf, 0,
- "Display the contents of the trapframe",
- "address",
- " address:\tthe struct trapframe to print") },
- { DDB_ADD_CMD("tlb", db_ppc4xx_dumptlb, 0,
- "Display instruction translation storage buffer information.",
- NULL,NULL) },
Home |
Main Index |
Thread Index |
Old Index