Commit 5358db0b authored by Rabin Vincent's avatar Rabin Vincent Committed by Michal Marek

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: default avatarRabin Vincent <rabin@rab.in>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent 84336466
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
# AFLAGS=--32 decodecode < 386.oops # AFLAGS=--32 decodecode < 386.oops
cleanup() { 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 exit 1
} }
...@@ -39,6 +39,29 @@ fi ...@@ -39,6 +39,29 @@ fi
echo $code echo $code
code=`echo $code | sed -e 's/.*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" "\<"` marker=`expr index "$code" "\<"`
if [ $marker -eq 0 ]; then if [ $marker -eq 0 ]; then
marker=`expr index "$code" "\("` marker=`expr index "$code" "\("`
...@@ -49,26 +72,25 @@ if [ $marker -ne 0 ]; then ...@@ -49,26 +72,25 @@ if [ $marker -ne 0 ]; then
echo All code >> $T.oo echo All code >> $T.oo
echo ======== >> $T.oo echo ======== >> $T.oo
beforemark=`echo "$code"` beforemark=`echo "$code"`
echo -n " .byte 0x" > $T.s echo -n " .$type 0x" > $T.s
echo $beforemark | sed -e 's/ /,0x/g' | sed -e 's/<//g' | sed -e 's/>//g' >> $T.s echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s
as $AFLAGS -o $T.o $T.s &> /dev/null disas $T
objdump -S $T.o | grep -v "/tmp" | grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $T.ooo cat $T.dis >> $T.oo
cat $T.ooo >> $T.oo rm -f $T.o $T.s $T.dis
rm -f $T.o $T.s $T.ooo
# and fix code at-and-after marker # and fix code at-and-after marker
code=`echo "$code" | cut -c$((${marker} + 1))-` code=`echo "$code" | cut -c$((${marker} + 1))-`
fi fi
echo Code starting with the faulting instruction > $T.aa echo Code starting with the faulting instruction > $T.aa
echo =========================================== >> $T.aa echo =========================================== >> $T.aa
code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'` code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'`
echo -n " .byte 0x" > $T.s echo -n " .$type 0x" > $T.s
echo $code >> $T.s echo $code >> $T.s
as $AFLAGS -o $T.o $T.s &> /dev/null disas $T
objdump -S $T.o | grep -v "Disassembly" | grep -v "/tmp" | grep -v "\.text" | grep -v "^$" &> $T.aaa cat $T.dis >> $T.aa
cat $T.aaa >> $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" cat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g"
echo echo
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment