]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] ppc64: make xmon print BUG() warnings
authorAnton Blanchard <anton@samba.org>
Tue, 11 Jan 2005 09:43:28 +0000 (01:43 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 11 Jan 2005 09:43:28 +0000 (01:43 -0800)
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>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/ppc64/kernel/traps.c
arch/ppc64/xmon/xmon.c
include/asm-ppc64/bug.h

index c37af43a7a62337d253cf8d3e13fe120fcd293f8..418aff49933ed129a5e46972a7263c2569e3cebe 100644 (file)
@@ -344,7 +344,7 @@ extern struct bug_entry __start___bug_table[], __stop___bug_table[];
 #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(unsigned long bugaddr)
        return module_find_bug(bugaddr);
 }
 
-int
+static int
 check_bug_trap(struct pt_regs *regs)
 {
        struct bug_entry *bug;
index c53046d52e6c1bea89352d1110cf7cd03b15b9e5..2be270592fb3996ef24226791c65144fea19c2c3 100644 (file)
@@ -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 *excp)
        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)
index 790bc56091d612b236eabe41541041329f3dc146..db31dd22233c6927f0f6dd8bb9682784d9b0f47e 100644 (file)
@@ -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.