powerpc: Fix kernel log of oops/panic instruction dump

A kernel oops/panic prints an instruction dump showing several
instructions before and after the instruction which caused the
oops/panic.

The code intended that the faulting instruction be enclosed in angle
brackets, however a bug caused the faulting instruction to be
interpreted by printk() as the message log level.

To fix this, the KERN_CONT log level is added before the actual text of
the printed message.

=== Before the patch ===

[ 1081.587266] Instruction dump:
[ 1081.590236] 7c000110 7c0000f8 5400077c 552907f6 7d290378 992b0003 4e800020 38000001
[ 1081.598034] 3d20c03a 9009a114 7c0004ac 39200000
[ 1081.602500]  4e800020 3803ffd0 2b800009

<4>[ 1081.587266] Instruction dump:
<4>[ 1081.590236] 7c000110 7c0000f8 5400077c 552907f6 7d290378 992b0003 4e800020 38000001
<4>[ 1081.598034] 3d20c03a 9009a114 7c0004ac 39200000
<98090000>[ 1081.602500]  4e800020 3803ffd0 2b800009

=== After the patch ===

[   51.385216] Instruction dump:
[   51.388186] 7c000110 7c0000f8 5400077c 552907f6 7d290378 992b0003 4e800020 38000001
[   51.395986] 3d20c03a 9009a114 7c0004ac 39200000 <98090000> 4e800020 3803ffd0 2b800009

<4>[   51.385216] Instruction dump:
<4>[   51.388186] 7c000110 7c0000f8 5400077c 552907f6 7d290378 992b0003 4e800020 38000001
<4>[   51.395986] 3d20c03a 9009a114 7c0004ac 39200000 <98090000> 4e800020 3803ffd0 2b800009

Signed-off-by: Ira W. Snyder <iws@ovro.caltech.edu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Ira Snyder 2012-01-06 12:34:07 +00:00 committed by Benjamin Herrenschmidt
parent 778a785f02
commit 40c8cefaaf
1 changed files with 3 additions and 3 deletions

View File

@ -566,12 +566,12 @@ static void show_instructions(struct pt_regs *regs)
*/ */
if (!__kernel_text_address(pc) || if (!__kernel_text_address(pc) ||
__get_user(instr, (unsigned int __user *)pc)) { __get_user(instr, (unsigned int __user *)pc)) {
printk("XXXXXXXX "); printk(KERN_CONT "XXXXXXXX ");
} else { } else {
if (regs->nip == pc) if (regs->nip == pc)
printk("<%08x> ", instr); printk(KERN_CONT "<%08x> ", instr);
else else
printk("%08x ", instr); printk(KERN_CONT "%08x ", instr);
} }
pc += sizeof(int); pc += sizeof(int);