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