lkml.org 
[lkml]   [2009]   [Dec]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH] scripts: add ARM support to decodecode
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@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@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/


\
 
 \ /
  Last update: 2009-12-31 06:21    [W:0.085 / U:0.064 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site