2009-12-30 14:54:30

by Rabin Vincent

[permalink] [raw]
Subject: [PATCH] scripts: add ARM support to decodecode

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 <[email protected]>
---
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
+ 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


2009-12-31 05:19:04

by Simon Horman

[permalink] [raw]
Subject: Re: [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 <[email protected]>
> ---
> 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 [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

2010-01-01 20:33:54

by Russell King - ARM Linux

[permalink] [raw]
Subject: Re: [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.

I've been debating about changing that so we use () instead of <> to
make things more consistent, but I've been holding off in case there's
still any ksymoops users out there. Opinions?

2010-01-05 14:58:19

by Rabin Vincent

[permalink] [raw]
Subject: [PATCH v2] scripts: add ARM support to decodecode

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 <[email protected]>
---
v2: condensed some sed and grep expressions

scripts/decodecode | 48 +++++++++++++++++++++++++++++++++++-------------
1 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/scripts/decodecode b/scripts/decodecode
index 4b00647..8b30cc3 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\|Disassembly\|\.text\|^$" &> $1.dis
+}
+
marker=`expr index "$code" "\<"`
if [ $marker -eq 0 ]; then
marker=`expr index "$code" "\("`
@@ -49,26 +72,25 @@ 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; 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))-`
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/ [<(]/ /;s/[>)] / /;s/ /,0x/g; 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/\[/\\\[/g; s/\]/\\\]/g'`

cat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g"
echo
--
1.6.5

2010-01-05 15:04:50

by Arjan van de Ven

[permalink] [raw]
Subject: Re: [PATCH v2] scripts: add ARM support to decodecode

On Tue, 5 Jan 2010 20:27:58 +0530
Rabin Vincent <[email protected]> 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.


I'm fine with this, but I wonder if ARM could switch to the <>
convention for the faulting instruction, just to keep things
consistent..

--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org

2010-01-05 15:34:28

by Michal Marek

[permalink] [raw]
Subject: Re: [PATCH v2] scripts: add ARM support to decodecode

On 5.1.2010 16:06, Arjan van de Ven wrote:
> On Tue, 5 Jan 2010 20:27:58 +0530
> Rabin Vincent <[email protected]> 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.
>
>
> I'm fine with this,

Was this an Acked-by? :)


> but I wonder if ARM could switch to the <>
> convention for the faulting instruction, just to keep things
> consistent..

I added the patch to the kbuild tree. () won't appear in the x86 Code:
line, so there should be no problem.

Michal

2010-01-05 17:32:33

by Russell King - ARM Linux

[permalink] [raw]
Subject: Re: [PATCH v2] scripts: add ARM support to decodecode

On Tue, Jan 05, 2010 at 07:06:58AM -0800, Arjan van de Ven wrote:
> I'm fine with this, but I wonder if ARM could switch to the <>
> convention for the faulting instruction, just to keep things
> consistent..

I did mention exactly that on the previous review round on this patch;
the problem is that it won't change older kernels, and if anyone is
still using ksymoops or similar parsing stuff, it could break on
such a change.

2010-01-05 20:01:05

by Daniel Jacobowitz

[permalink] [raw]
Subject: Re: [PATCH v2] scripts: add ARM support to decodecode

On Tue, Jan 05, 2010 at 08:27:58PM +0530, Rabin Vincent wrote:
> - Some versions of ARM objdump refuse to disassemble instructions
> generated by literal constants (".word 0x..."). The workaround is to
> strip the object file first.

FYI, more recent binutils support .iword for this purpose. That
probably doesn't help you in decodecode though.

--
Daniel Jacobowitz
CodeSourcery

2010-01-05 22:14:40

by Simon Horman

[permalink] [raw]
Subject: Re: [PATCH v2] scripts: add ARM support to decodecode

On Tue, Jan 05, 2010 at 08:27:58PM +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 <[email protected]>
> ---
> v2: condensed some sed and grep expressions

Condensation portion Acked-by: Simon Horman <[email protected]>