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