diff mbox

powerpc: fix kernel log of oops/panic instruction dump

Message ID 1325889247-17205-1-git-send-email-iws@ovro.caltech.edu (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Ira Snyder Jan. 6, 2012, 10:34 p.m. UTC
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 actualy text of
the printed message.

Comments

Benjamin Herrenschmidt Jan. 6, 2012, 10:50 p.m. UTC | #1
On Fri, 2012-01-06 at 14:34 -0800, Ira W. Snyder wrote:
> 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 actualy text of
> the printed message.

Nice one, thanks.

Cheers,
Ben.

> === 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
> ---
> 
> In the above examples, the first block is what is shown on the serial
> console as the machine dies. The second block is the dump as captured by
> mtdoops.
> 
>  arch/powerpc/kernel/process.c |    6 +++---
>  1 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> index 6457574..271f809 100644
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -566,12 +566,12 @@ static void show_instructions(struct pt_regs *regs)
>  		 */
>  		if (!__kernel_text_address(pc) ||
>  		     __get_user(instr, (unsigned int __user *)pc)) {
> -			printk("XXXXXXXX ");
> +			printk(KERN_CONT "XXXXXXXX ");
>  		} else {
>  			if (regs->nip == pc)
> -				printk("<%08x> ", instr);
> +				printk(KERN_CONT "<%08x> ", instr);
>  			else
> -				printk("%08x ", instr);
> +				printk(KERN_CONT "%08x ", instr);
>  		}
>  
>  		pc += sizeof(int);
Ira Snyder Jan. 6, 2012, 11:26 p.m. UTC | #2
On Sat, Jan 07, 2012 at 09:50:10AM +1100, Benjamin Herrenschmidt wrote:
> On Fri, 2012-01-06 at 14:34 -0800, Ira W. Snyder wrote:
> > 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 actualy text of

If you could fix the text above to say 'actual' (instead of 'actualy')
when you commit this, that would be great. Darn typos. :)

> > the printed message.
> 
> Nice one, thanks.
> 
> Cheers,
> Ben.
> 
> > === 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
> > ---
> > 
> > In the above examples, the first block is what is shown on the serial
> > console as the machine dies. The second block is the dump as captured by
> > mtdoops.
> > 
> >  arch/powerpc/kernel/process.c |    6 +++---
> >  1 files changed, 3 insertions(+), 3 deletions(-)
> > 
> > diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> > index 6457574..271f809 100644
> > --- a/arch/powerpc/kernel/process.c
> > +++ b/arch/powerpc/kernel/process.c
> > @@ -566,12 +566,12 @@ static void show_instructions(struct pt_regs *regs)
> >  		 */
> >  		if (!__kernel_text_address(pc) ||
> >  		     __get_user(instr, (unsigned int __user *)pc)) {
> > -			printk("XXXXXXXX ");
> > +			printk(KERN_CONT "XXXXXXXX ");
> >  		} else {
> >  			if (regs->nip == pc)
> > -				printk("<%08x> ", instr);
> > +				printk(KERN_CONT "<%08x> ", instr);
> >  			else
> > -				printk("%08x ", instr);
> > +				printk(KERN_CONT "%08x ", instr);
> >  		}
> >  
> >  		pc += sizeof(int);
> 
>
diff mbox

Patch

=== 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
---

In the above examples, the first block is what is shown on the serial
console as the machine dies. The second block is the dump as captured by
mtdoops.

 arch/powerpc/kernel/process.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 6457574..271f809 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -566,12 +566,12 @@  static void show_instructions(struct pt_regs *regs)
 		 */
 		if (!__kernel_text_address(pc) ||
 		     __get_user(instr, (unsigned int __user *)pc)) {
-			printk("XXXXXXXX ");
+			printk(KERN_CONT "XXXXXXXX ");
 		} else {
 			if (regs->nip == pc)
-				printk("<%08x> ", instr);
+				printk(KERN_CONT "<%08x> ", instr);
 			else
-				printk("%08x ", instr);
+				printk(KERN_CONT "%08x ", instr);
 		}
 
 		pc += sizeof(int);