
There are a couple of problems with the decodecode script and arm64: 1. AArch64 objdump refuses to disassemble .4byte directives as instructions, insisting that they are data values and displaying them as: a94153f3 .word 0xa94153f3 <-- trapping instruction This is resolved by using the .inst directive instead. 2. Disassembly of branch instructions attempts to provide the target as an offset from a symbol, e.g.: 0: 34000082 cbz w2, 10 <.text+0x10> however this falls foul of the grep -v, which matches lines containing ".text" and ends up removing all branch instructions from the dump. This patch resolves both issues by using the .inst directive for 4-byte quantities on arm64 and stripping the resulting binaries (as is done on arm already) to remove the mapping symbols. Link: http://lkml.kernel.org/r/1506596147-23630-1-git-send-email-will.deacon@arm.com Signed-off-by: Will Deacon <will.deacon@arm.com> Reviewed-by: Dave Martin <Dave.Martin@arm.com> Cc: Michal Marek <mmarek@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2.3 KiB
Executable File
#!/bin/sh
SPDX-License-Identifier: GPL-2.0
Disassemble the Code: line in Linux oopses
usage: decodecode < oops.file
options: set env. variable AFLAGS=options to pass options to "as";
e.g., to decode an i386 oops on an x86_64 system, use:
AFLAGS=--32 decodecode < 386.oops
cleanup() { rm -f $T $T.s $T.o $T.oo $T.aa $T.dis exit 1 }
die() { echo "$@" exit 1 }
trap cleanup EXIT
T=mktemp
|| die "cannot create temp file"
code=
while read i ; do
case "$i" in Code:) code=$i ;; esac
done
if [ -z "$code" ]; then rm $T exit fi
echo $code
code=echo $code | sed -e 's/.*Code: //'
width=expr index "$code" ' '
width=$((($width-1)/2))
case $width in
- type=byte ;;
- type=2byte ;;
- type=4byte ;; esac
disas() { ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s > /dev/null 2>&1
if [ "$ARCH" = "arm" ]; then
if [ $width -eq 2 ]; then
OBJDUMPFLAGS="-M force-thumb"
fi
${CROSS_COMPILE}strip $1.o
fi
if [ "$ARCH" = "arm64" ]; then
if [ $width -eq 4 ]; then
type=inst
fi
${CROSS_COMPILE}strip $1.o
fi
${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \
grep -v "/tmp\|Disassembly\|\.text\|^$" > $1.dis 2>&1
}
marker=expr index "$code" "\<"
if [ $marker -eq 0 ]; then
marker=expr index "$code" "\("
fi
touch $T.oo
if [ $marker -ne 0 ]; then
echo All code >> $T.oo
echo ======== >> $T.oo
beforemark=echo "$code"
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; s/[>)]$//'
echo -n " .$type 0x" > $T.s
echo $code >> $T.s
disas $T
cat $T.dis >> $T.aa
(lines of whole $T.oo) - (lines of $T.aa, i.e. "Code starting") + 3,
i.e. the title + the "===..=" line (sed is counting from 1, 0 address is
special)
faultlinenum=$(( $(wc -l $T.oo | cut -d" " -f1) -
$(wc -l $T.aa | cut -d" " -f1) + 3))
faultline=cat $T.dis | head -1 | cut -d":" -f2-
faultline=echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'
cat $T.oo | sed -e "${faultlinenum}s/^(.:)(.)/\1*\2\t\t<-- trapping instruction/" echo cat $T.aa cleanup