[PATCH] scripts: add ARM support to decodecode

Simon Horman horms at verge.net.au
Thu Dec 31 00:18:58 EST 2009


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 <like so>
>    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 <rabin at rab.in>
> ---
> 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' | 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 at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/



More information about the linux-arm-kernel mailing list