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 <rabin@rab.in> Signed-off-by: Michal Marek <mmarek@suse.cz>
This commit is contained in:
parent
8433646601
commit
5358db0b0e
1 changed files with 35 additions and 13 deletions
|
@ -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
|
||||||
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
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue