
From: Anton Blanchard <anton@samba.org>

I've had to explain to a number of people that a 0x700 exception is often a
BUG().  Make this crystal clear by printing the BUG information in the xmon
exception printout.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/ppc64/kernel/traps.c |    4 ++--
 25-akpm/arch/ppc64/xmon/xmon.c    |   24 ++++++++++++++++++++++++
 25-akpm/include/asm-ppc64/bug.h   |    2 ++
 3 files changed, 28 insertions(+), 2 deletions(-)

diff -puN arch/ppc64/kernel/traps.c~ppc64-make-xmon-print-bug-warnings arch/ppc64/kernel/traps.c
--- 25/arch/ppc64/kernel/traps.c~ppc64-make-xmon-print-bug-warnings	2005-01-10 19:59:22.103318736 -0800
+++ 25-akpm/arch/ppc64/kernel/traps.c	2005-01-10 19:59:22.110317672 -0800
@@ -344,7 +344,7 @@ extern struct bug_entry __start___bug_ta
 #define module_find_bug(x)	NULL
 #endif
 
-static struct bug_entry *find_bug(unsigned long bugaddr)
+struct bug_entry *find_bug(unsigned long bugaddr)
 {
 	struct bug_entry *bug;
 
@@ -354,7 +354,7 @@ static struct bug_entry *find_bug(unsign
 	return module_find_bug(bugaddr);
 }
 
-int
+static int
 check_bug_trap(struct pt_regs *regs)
 {
 	struct bug_entry *bug;
diff -puN arch/ppc64/xmon/xmon.c~ppc64-make-xmon-print-bug-warnings arch/ppc64/xmon/xmon.c
--- 25/arch/ppc64/xmon/xmon.c~ppc64-make-xmon-print-bug-warnings	2005-01-10 19:59:22.104318584 -0800
+++ 25-akpm/arch/ppc64/xmon/xmon.c	2005-01-10 19:59:22.112317368 -0800
@@ -31,6 +31,7 @@
 #include <asm/cputable.h>
 #include <asm/rtas.h>
 #include <asm/sstep.h>
+#include <asm/bug.h>
 
 #include "nonstdio.h"
 #include "privinst.h"
@@ -1319,6 +1320,26 @@ static void backtrace(struct pt_regs *ex
 	scannl();
 }
 
+static void print_bug_trap(struct pt_regs *regs)
+{
+	struct bug_entry *bug;
+	unsigned long addr;
+
+	if (regs->msr & MSR_PR)
+		return;		/* not in kernel */
+	addr = regs->nip;	/* address of trap instruction */
+	if (addr < PAGE_OFFSET)
+		return;
+	bug = find_bug(regs->nip);
+	if (bug == NULL)
+		return;
+	if (bug->line & BUG_WARNING_TRAP)
+		return;
+
+	printf("kernel BUG in %s at %s:%d!\n",
+	       bug->function, bug->file, (unsigned int)bug->line);
+}
+
 void excprint(struct pt_regs *fp)
 {
 	unsigned long trap;
@@ -1350,6 +1371,9 @@ void excprint(struct pt_regs *fp)
 		printf("    pid   = %ld, comm = %s\n",
 		       current->pid, current->comm);
 	}
+
+	if (trap == 0x700)
+		print_bug_trap(fp);
 }
 
 void prregs(struct pt_regs *fp)
diff -puN include/asm-ppc64/bug.h~ppc64-make-xmon-print-bug-warnings include/asm-ppc64/bug.h
--- 25/include/asm-ppc64/bug.h~ppc64-make-xmon-print-bug-warnings	2005-01-10 19:59:22.106318280 -0800
+++ 25-akpm/include/asm-ppc64/bug.h	2005-01-10 19:59:22.113317216 -0800
@@ -18,6 +18,8 @@ struct bug_entry {
 	const char	*function;
 };
 
+struct bug_entry *find_bug(unsigned long bugaddr);
+
 /*
  * If this bit is set in the line number it means that the trap
  * is for WARN_ON rather than BUG or BUG_ON.
_
