Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751912AbZLaFTE (ORCPT ); Thu, 31 Dec 2009 00:19:04 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750817AbZLaFTA (ORCPT ); Thu, 31 Dec 2009 00:19:00 -0500 Received: from kirsty.vergenet.net ([202.4.237.240]:56383 "EHLO kirsty.vergenet.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750802AbZLaFTA (ORCPT ); Thu, 31 Dec 2009 00:19:00 -0500 Date: Thu, 31 Dec 2009 16:18:58 +1100 From: Simon Horman To: Rabin Vincent Cc: mmarek@suse.cz, arjan@linux.intel.com, wangcong@zeuux.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH] scripts: add ARM support to decodecode Message-ID: <20091231051858.GA31256@verge.net.au> References: <1262184839-24497-1-git-send-email-rabin@rab.in> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262184839-24497-1-git-send-email-rabin@rab.in> User-Agent: Mutt/1.5.20 (2009-06-14) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4422 Lines: 132 On Wed, Dec 30, 2009 at 08:23:59PM +0530, Rabin Vincent wrote: > This patch adds support for decoding ARM oopses to scripts/decodecode. > The following things are handled: > > - ARCH and CROSS_COMPILE environment variables are respected. > > - The Code: in x86 oopses is in bytes, while it is in either words (4 > bytes) or halfwords for ARM. > > - Some versions of ARM objdump refuse to disassemble instructions > generated by literal constants (".word 0x..."). The workaround is to > strip the object file first. > > - The faulting instruction is marked (liked so) in ARM, but > in x86. > > - ARM mnemonics may include characters such as [] which need to be > escaped before being passed to sed for the "<- trapping instruction" > substitution. > > Signed-off-by: Rabin Vincent > --- > I didn't think it was necessary to split this up into separate patches, let me > know if you would prefer that. > > scripts/decodecode | 47 +++++++++++++++++++++++++++++++++++------------ > 1 files changed, 35 insertions(+), 12 deletions(-) > > diff --git a/scripts/decodecode b/scripts/decodecode > index 4b00647..4d025c9 100755 > --- a/scripts/decodecode > +++ b/scripts/decodecode > @@ -7,7 +7,7 @@ > # AFLAGS=--32 decodecode < 386.oops > > cleanup() { > - rm -f $T $T.s $T.o $T.oo $T.aa $T.aaa > + rm -f $T $T.s $T.o $T.oo $T.aa $T.dis > exit 1 > } > > @@ -39,6 +39,29 @@ fi > echo $code > code=`echo $code | sed -e 's/.*Code: //'` > > +width=`expr index "$code" ' '` > +width=$[($width-1)/2] > +case $width in > +1) type=byte ;; > +2) type=2byte ;; > +4) type=4byte ;; > +esac > + > +disas() { > + ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s &> /dev/null > + > + if [ "$ARCH" == "arm" ]; then > + if [ $width == 2 ]; then > + OBJDUMPFLAGS="-M force-thumb" > + fi > + > + ${CROSS_COMPILE}strip $1.o > + fi > + > + ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | grep -v "/tmp" | \ > + grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $1.dis > +} > + > marker=`expr index "$code" "\<"` > if [ $marker -eq 0 ]; then > marker=`expr index "$code" "\("` > @@ -49,12 +72,11 @@ if [ $marker -ne 0 ]; then > echo All code >> $T.oo > echo ======== >> $T.oo > beforemark=`echo "$code"` > - echo -n " .byte 0x" > $T.s > - echo $beforemark | sed -e 's/ /,0x/g' | sed -e 's///g' >> $T.s > - as $AFLAGS -o $T.o $T.s &> /dev/null > - objdump -S $T.o | grep -v "/tmp" | grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $T.ooo > - cat $T.ooo >> $T.oo > - rm -f $T.o $T.s $T.ooo > + echo -n " .$type 0x" > $T.s > + echo $beforemark | sed -e 's/ /,0x/g' | sed -e "s/[<(]//g" | sed -e "s/[>)]//g" >> $T.s It should be possible to combine all these sed invocations into one (untested): echo $beforemark | sed -e 's/ /,0x/g; s/[<(]//g; s/[>)]//g' >> $T.s or perhaps even echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s > + disas $T > + cat $T.dis >> $T.oo > + rm -f $T.o $T.s $T.dis > > # and fix code at-and-after marker > code=`echo "$code" | cut -c$((${marker} + 1))-` > @@ -62,13 +84,14 @@ fi > echo Code starting with the faulting instruction > $T.aa > echo =========================================== >> $T.aa > code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'` > -echo -n " .byte 0x" > $T.s > +code=`echo $code | sed -e 's/[>)]$//'` > +echo -n " .$type 0x" > $T.s > echo $code >> $T.s > -as $AFLAGS -o $T.o $T.s &> /dev/null > -objdump -S $T.o | grep -v "Disassembly" | grep -v "/tmp" | grep -v "\.text" | grep -v "^$" &> $T.aaa > -cat $T.aaa >> $T.aa > +disas $T > +cat $T.dis >> $T.aa > > -faultline=`cat $T.aaa | head -1 | cut -d":" -f2` > +faultline=`cat $T.dis | head -1 | cut -d":" -f2` > +faultline=`echo "$faultline" | sed -e 's/\[/\\\[/' | sed -e 's/\]/\\\]/'` > > cat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g" > echo > -- > 1.6.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/