kbuild: Fix gcc -x syntax
[linux-3.10.git] / scripts / decodecode
old mode 100644 (file)
new mode 100755 (executable)
index 1e1a8f6..18ba881
@@ -6,7 +6,19 @@
 # e.g., to decode an i386 oops on an x86_64 system, use:
 # AFLAGS=--32 decodecode < 386.oops
 
-T=`mktemp`
+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
@@ -20,32 +32,67 @@ 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
+1) type=byte ;;
+2) type=2byte ;;
+4) 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
+
+       ${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
-       beforemark=`echo "$code" | cut -c-$((${marker} - 1))`
-       echo -n "       .byte 0x" > $T.s
-       echo $beforemark | sed -e 's/ /,0x/g' >> $T.s
-       as $AFLAGS -o $T.o $T.s
-       objdump -S $T.o
-       rm $T.o $T.s
+       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
-
-code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'`
-echo -n "      .byte 0x" > $T.s
+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
-as $AFLAGS -o $T.o $T.s
-objdump -S $T.o
-rm $T.o $T.s
+disas $T
+cat $T.dis >> $T.aa
+
+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
+cat $T.aa
+cleanup