Commit 9aaf64a0 authored by Anton Blanchard's avatar Anton Blanchard Committed by Linus Torvalds

[PATCH] ppc64: make xmon print BUG() warnings

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: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 61542216
...@@ -344,7 +344,7 @@ extern struct bug_entry __start___bug_table[], __stop___bug_table[]; ...@@ -344,7 +344,7 @@ extern struct bug_entry __start___bug_table[], __stop___bug_table[];
#define module_find_bug(x) NULL #define module_find_bug(x) NULL
#endif #endif
static struct bug_entry *find_bug(unsigned long bugaddr) struct bug_entry *find_bug(unsigned long bugaddr)
{ {
struct bug_entry *bug; struct bug_entry *bug;
...@@ -354,7 +354,7 @@ static struct bug_entry *find_bug(unsigned long bugaddr) ...@@ -354,7 +354,7 @@ static struct bug_entry *find_bug(unsigned long bugaddr)
return module_find_bug(bugaddr); return module_find_bug(bugaddr);
} }
int static int
check_bug_trap(struct pt_regs *regs) check_bug_trap(struct pt_regs *regs)
{ {
struct bug_entry *bug; struct bug_entry *bug;
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <asm/cputable.h> #include <asm/cputable.h>
#include <asm/rtas.h> #include <asm/rtas.h>
#include <asm/sstep.h> #include <asm/sstep.h>
#include <asm/bug.h>
#include "nonstdio.h" #include "nonstdio.h"
#include "privinst.h" #include "privinst.h"
...@@ -1319,6 +1320,26 @@ static void backtrace(struct pt_regs *excp) ...@@ -1319,6 +1320,26 @@ static void backtrace(struct pt_regs *excp)
scannl(); 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) void excprint(struct pt_regs *fp)
{ {
unsigned long trap; unsigned long trap;
...@@ -1350,6 +1371,9 @@ void excprint(struct pt_regs *fp) ...@@ -1350,6 +1371,9 @@ void excprint(struct pt_regs *fp)
printf(" pid = %ld, comm = %s\n", printf(" pid = %ld, comm = %s\n",
current->pid, current->comm); current->pid, current->comm);
} }
if (trap == 0x700)
print_bug_trap(fp);
} }
void prregs(struct pt_regs *fp) void prregs(struct pt_regs *fp)
......
...@@ -18,6 +18,8 @@ struct bug_entry { ...@@ -18,6 +18,8 @@ struct bug_entry {
const char *function; 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 * If this bit is set in the line number it means that the trap
* is for WARN_ON rather than BUG or BUG_ON. * is for WARN_ON rather than BUG or BUG_ON.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment