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

From: Anton Blanchard
Date: Mon Jan 10 2005 - 06:46:58 EST



Ive 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.

Anton

Signed-off-by: Anton Blanchard <anton@xxxxxxxxx>

diff -puN arch/ppc64/kernel/traps.c~xmon_catch_bug arch/ppc64/kernel/traps.c
--- foobar2/arch/ppc64/kernel/traps.c~xmon_catch_bug 2005-01-10 20:49:11.211206318 +1100
+++ foobar2-anton/arch/ppc64/kernel/traps.c 2005-01-10 20:49:11.246203663 +1100
@@ -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~xmon_catch_bug arch/ppc64/xmon/xmon.c
--- foobar2/arch/ppc64/xmon/xmon.c~xmon_catch_bug 2005-01-10 20:49:11.215206014 +1100
+++ foobar2-anton/arch/ppc64/xmon/xmon.c 2005-01-10 20:49:11.244203814 +1100
@@ -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~xmon_catch_bug include/asm-ppc64/bug.h
--- foobar2/include/asm-ppc64/bug.h~xmon_catch_bug 2005-01-10 20:49:11.221205559 +1100
+++ foobar2-anton/include/asm-ppc64/bug.h 2005-01-10 20:49:11.247203587 +1100
@@ -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.
_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/