Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Dec 2019 21:29:34 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r355275 - head/sys/powerpc/powerpc
Message-ID:  <201912012129.xB1LTYMl048789@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912012129.xB1LTYMl048789>