svn commit: r355275 - head/sys/powerpc/powerpc

Justin Hibbits jhibbits at FreeBSD.org
Sun Dec 1 21:29:35 UTC 2019


Author: jhibbits
Date: Sun Dec  1 21:29:34 2019
New Revision: 355275
URL: https://svnweb.freebsd.org/changeset/base/355275

Log:
  powerpc: Add 'show frame <addr>' to show an arbitrary trap frame
  
  This lets us print, for example, the user's trap frame when a panic occurs.
  The frame address is given in the backtrace at the trap point, which can
  then be passed to 'show frame'.  This is useful for debugging as it can show
  inputs that lead to a panic or fault.  It can also be used to print trap
  frames from other CPUs that get stuck.
  
  i386 already has a similar command, but no others do.

Modified:
  head/sys/powerpc/powerpc/machdep.c

Modified: head/sys/powerpc/powerpc/machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/machdep.c	Sun Dec  1 21:27:09 2019	(r355274)
+++ head/sys/powerpc/powerpc/machdep.c	Sun Dec  1 21:29:34 2019	(r355275)
@@ -557,6 +557,50 @@ DB_SHOW_COMMAND(spr, db_show_spr)
 	db_printf("SPR %d(%x): %lx\n", saved_sprno, saved_sprno,
 	    (unsigned long)spr);
 }
+
+DB_SHOW_COMMAND(frame, db_show_frame)
+{
+	struct trapframe *tf;
+	long reg;
+	int i;
+
+	tf = have_addr ? (struct trapframe *)addr : curthread->td_frame;
+
+	/*
+	 * Everything casts through long to simplify the printing.
+	 * 'long' is native register size anyway.
+	 */
+	db_printf("trap frame %p\n", tf);
+	for (i = 0; i < nitems(tf->fixreg); i++) {
+		reg = tf->fixreg[i];
+		db_printf("  r%d:\t%#lx (%ld)\n", i, reg, reg);
+	}
+	reg = tf->lr;
+	db_printf("  lr:\t%#lx\n", reg);
+	reg = tf->cr;
+	db_printf("  cr:\t%#lx\n", reg);
+	reg = tf->xer;
+	db_printf("  xer:\t%#lx\n", reg);
+	reg = tf->ctr;
+	db_printf("  ctr:\t%#lx (%ld)\n", reg, reg);
+	reg = tf->srr0;
+	db_printf("  srr0:\t%#lx\n", reg);
+	reg = tf->srr1;
+	db_printf("  srr1:\t%#lx\n", reg);
+	reg = tf->exc;
+	db_printf("  exc:\t%#lx\n", reg);
+	reg = tf->dar;
+	db_printf("  dar:\t%#lx\n", reg);
+#ifdef AIM
+	reg = tf->cpu.aim.dsisr;
+	db_printf("  dsisr:\t%#lx\n", reg);
+#else
+	reg = tf->cpu.booke.esr;
+	db_printf("  esr:\t%#lx\n", reg);
+	reg = tf->cpu.booke.dbcr0;
+	db_printf("  dbcr0:\t%#lx\n", reg);
+#endif
+}
 #endif
 
 #undef bzero


More information about the svn-src-head mailing list