scripts/decodecode: add the capability to supply the program counter
[linux-2.6-microblaze.git] / scripts / decodecode
index fbdb325..31d884e 100755 (executable)
@@ -6,6 +6,7 @@
 # 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
+# PC=hex - the PC (program counter) the oops points to
 
 cleanup() {
        rm -f $T $T.s $T.o $T.oo $T.aa $T.dis
@@ -67,15 +68,19 @@ if [ -z "$ARCH" ]; then
     esac
 fi
 
+# Params: (tmp_file, pc_sub)
 disas() {
-       ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s > /dev/null 2>&1
+       t=$1
+       pc_sub=$2
+
+       ${CROSS_COMPILE}as $AFLAGS -o $t.o $t.s > /dev/null 2>&1
 
        if [ "$ARCH" = "arm" ]; then
                if [ $width -eq 2 ]; then
                        OBJDUMPFLAGS="-M force-thumb"
                fi
 
-               ${CROSS_COMPILE}strip $1.o
+               ${CROSS_COMPILE}strip $t.o
        fi
 
        if [ "$ARCH" = "arm64" ]; then
@@ -83,11 +88,18 @@ disas() {
                        type=inst
                fi
 
-               ${CROSS_COMPILE}strip $1.o
+               ${CROSS_COMPILE}strip $t.o
        fi
 
-       ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \
-               grep -v "/tmp\|Disassembly\|\.text\|^$" > $1.dis 2>&1
+       if [ $pc_sub -ne 0 ]; then
+               if [ $PC ]; then
+                       adj_vma=$(( $PC - $pc_sub ))
+                       OBJDUMPFLAGS="$OBJDUMPFLAGS --adjust-vma=$adj_vma"
+               fi
+       fi
+
+       ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $t.o | \
+               grep -v "/tmp\|Disassembly\|\.text\|^$" > $t.dis 2>&1
 }
 
 marker=`expr index "$code" "\<"`
@@ -95,14 +107,17 @@ if [ $marker -eq 0 ]; then
        marker=`expr index "$code" "\("`
 fi
 
+
 touch $T.oo
 if [ $marker -ne 0 ]; then
+       # 2 opcode bytes and a single space
+       pc_sub=$(( $marker / 3 ))
        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
+       disas $T $pc_sub
        cat $T.dis >> $T.oo
        rm -f $T.o $T.s $T.dis
 
@@ -114,7 +129,7 @@ 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
+disas $T 0
 cat $T.dis >> $T.aa
 
 # (lines of whole $T.oo) - (lines of $T.aa, i.e. "Code starting") + 3,