1dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap#!/bin/sh 2dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap# Disassemble the Code: line in Linux oopses 3dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap# usage: decodecode < oops.file 4dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap# 5dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap# options: set env. variable AFLAGS=options to pass options to "as"; 6dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap# e.g., to decode an i386 oops on an x86_64 system, use: 7dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap# AFLAGS=--32 decodecode < 386.oops 8dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 9fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlapcleanup() { 105358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent rm -f $T $T.s $T.o $T.oo $T.aa $T.dis 11fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap exit 1 12fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap} 13fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap 14fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlapdie() { 15fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap echo "$@" 16fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap exit 1 17fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap} 18fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap 19fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlaptrap cleanup EXIT 20fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap 21fa220d89ad050cf5d970c0418ded019a80efedfbRandy DunlapT=`mktemp` || die "cannot create temp file" 22dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapcode= 23dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 24dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapwhile read i ; do 25dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 26dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapcase "$i" in 27dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap*Code:*) 28dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap code=$i 29dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap ;; 30dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapesac 31dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 32dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapdone 33dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 34dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapif [ -z "$code" ]; then 35fa220d89ad050cf5d970c0418ded019a80efedfbRandy Dunlap rm $T 36dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap exit 37dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapfi 38dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 39dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapecho $code 40dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapcode=`echo $code | sed -e 's/.*Code: //'` 41dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 425358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentwidth=`expr index "$code" ' '` 43b396aa03084b51f6822052a8070703287f198360Rabin Vincentwidth=$((($width-1)/2)) 445358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentcase $width in 455358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent1) type=byte ;; 465358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent2) type=2byte ;; 475358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent4) type=4byte ;; 485358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentesac 495358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent 505358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentdisas() { 51b396aa03084b51f6822052a8070703287f198360Rabin Vincent ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s > /dev/null 2>&1 525358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent 53b396aa03084b51f6822052a8070703287f198360Rabin Vincent if [ "$ARCH" = "arm" ]; then 54b396aa03084b51f6822052a8070703287f198360Rabin Vincent if [ $width -eq 2 ]; then 555358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent OBJDUMPFLAGS="-M force-thumb" 565358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent fi 575358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent 585358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent ${CROSS_COMPILE}strip $1.o 595358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent fi 605358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent 615358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \ 62b396aa03084b51f6822052a8070703287f198360Rabin Vincent grep -v "/tmp\|Disassembly\|\.text\|^$" > $1.dis 2>&1 635358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent} 645358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent 65dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapmarker=`expr index "$code" "\<"` 66dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapif [ $marker -eq 0 ]; then 67dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap marker=`expr index "$code" "\("` 68dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapfi 69dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 70846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Ventouch $T.oo 71dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapif [ $marker -ne 0 ]; then 72846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Ven echo All code >> $T.oo 73846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Ven echo ======== >> $T.oo 74846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Ven beforemark=`echo "$code"` 755358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent echo -n " .$type 0x" > $T.s 765358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s 775358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent disas $T 785358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent cat $T.dis >> $T.oo 795358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincent rm -f $T.o $T.s $T.dis 80dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap 81dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap# and fix code at-and-after marker 82dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlap code=`echo "$code" | cut -c$((${marker} + 1))-` 83dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapfi 84846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Venecho Code starting with the faulting instruction > $T.aa 85846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Venecho =========================================== >> $T.aa 865358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentcode=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'` 875358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentecho -n " .$type 0x" > $T.s 88dcecc6c70013e3a5fa81b3081480c03e10670a23Randy Dunlapecho $code >> $T.s 895358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentdisas $T 905358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentcat $T.dis >> $T.aa 91846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Ven 925358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentfaultline=`cat $T.dis | head -1 | cut -d":" -f2` 935358db0b0e16470337c6ec08177deb3f68ed7673Rabin Vincentfaultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'` 94846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Ven 95846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Vencat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g" 96846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Venecho 97846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Vencat $T.aa 98846442c8ddc02e378e7b981f0928449ed1ff1e1fArjan van de Vencleanup 99