1*53ee8cc1Swenshuai.xi#!/bin/sh 2*53ee8cc1Swenshuai.xi# Disassemble the Code: line in Linux oopses 3*53ee8cc1Swenshuai.xi# usage: decodecode < oops.file 4*53ee8cc1Swenshuai.xi# 5*53ee8cc1Swenshuai.xi# options: set env. variable AFLAGS=options to pass options to "as"; 6*53ee8cc1Swenshuai.xi# e.g., to decode an i386 oops on an x86_64 system, use: 7*53ee8cc1Swenshuai.xi# AFLAGS=--32 decodecode < 386.oops 8*53ee8cc1Swenshuai.xi 9*53ee8cc1Swenshuai.xicleanup() { 10*53ee8cc1Swenshuai.xi rm -f $T $T.s $T.o $T.oo $T.aa $T.dis 11*53ee8cc1Swenshuai.xi exit 1 12*53ee8cc1Swenshuai.xi} 13*53ee8cc1Swenshuai.xi 14*53ee8cc1Swenshuai.xidie() { 15*53ee8cc1Swenshuai.xi echo "$@" 16*53ee8cc1Swenshuai.xi exit 1 17*53ee8cc1Swenshuai.xi} 18*53ee8cc1Swenshuai.xi 19*53ee8cc1Swenshuai.xitrap cleanup EXIT 20*53ee8cc1Swenshuai.xi 21*53ee8cc1Swenshuai.xiT=`mktemp` || die "cannot create temp file" 22*53ee8cc1Swenshuai.xicode= 23*53ee8cc1Swenshuai.xi 24*53ee8cc1Swenshuai.xiwhile read i ; do 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xicase "$i" in 27*53ee8cc1Swenshuai.xi*Code:*) 28*53ee8cc1Swenshuai.xi code=$i 29*53ee8cc1Swenshuai.xi ;; 30*53ee8cc1Swenshuai.xiesac 31*53ee8cc1Swenshuai.xi 32*53ee8cc1Swenshuai.xidone 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xiif [ -z "$code" ]; then 35*53ee8cc1Swenshuai.xi rm $T 36*53ee8cc1Swenshuai.xi exit 37*53ee8cc1Swenshuai.xifi 38*53ee8cc1Swenshuai.xi 39*53ee8cc1Swenshuai.xiecho $code 40*53ee8cc1Swenshuai.xicode=`echo $code | sed -e 's/.*Code: //'` 41*53ee8cc1Swenshuai.xi 42*53ee8cc1Swenshuai.xiwidth=`expr index "$code" ' '` 43*53ee8cc1Swenshuai.xiwidth=$((($width-1)/2)) 44*53ee8cc1Swenshuai.xicase $width in 45*53ee8cc1Swenshuai.xi1) type=byte ;; 46*53ee8cc1Swenshuai.xi2) type=2byte ;; 47*53ee8cc1Swenshuai.xi4) type=4byte ;; 48*53ee8cc1Swenshuai.xiesac 49*53ee8cc1Swenshuai.xi 50*53ee8cc1Swenshuai.xidisas() { 51*53ee8cc1Swenshuai.xi ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s > /dev/null 2>&1 52*53ee8cc1Swenshuai.xi 53*53ee8cc1Swenshuai.xi if [ "$ARCH" = "arm" ]; then 54*53ee8cc1Swenshuai.xi if [ $width -eq 2 ]; then 55*53ee8cc1Swenshuai.xi OBJDUMPFLAGS="-M force-thumb" 56*53ee8cc1Swenshuai.xi fi 57*53ee8cc1Swenshuai.xi 58*53ee8cc1Swenshuai.xi ${CROSS_COMPILE}strip $1.o 59*53ee8cc1Swenshuai.xi fi 60*53ee8cc1Swenshuai.xi 61*53ee8cc1Swenshuai.xi ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \ 62*53ee8cc1Swenshuai.xi grep -v "/tmp\|Disassembly\|\.text\|^$" > $1.dis 2>&1 63*53ee8cc1Swenshuai.xi} 64*53ee8cc1Swenshuai.xi 65*53ee8cc1Swenshuai.ximarker=`expr index "$code" "\<"` 66*53ee8cc1Swenshuai.xiif [ $marker -eq 0 ]; then 67*53ee8cc1Swenshuai.xi marker=`expr index "$code" "\("` 68*53ee8cc1Swenshuai.xifi 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xitouch $T.oo 71*53ee8cc1Swenshuai.xiif [ $marker -ne 0 ]; then 72*53ee8cc1Swenshuai.xi echo All code >> $T.oo 73*53ee8cc1Swenshuai.xi echo ======== >> $T.oo 74*53ee8cc1Swenshuai.xi beforemark=`echo "$code"` 75*53ee8cc1Swenshuai.xi echo -n " .$type 0x" > $T.s 76*53ee8cc1Swenshuai.xi echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s 77*53ee8cc1Swenshuai.xi disas $T 78*53ee8cc1Swenshuai.xi cat $T.dis >> $T.oo 79*53ee8cc1Swenshuai.xi rm -f $T.o $T.s $T.dis 80*53ee8cc1Swenshuai.xi 81*53ee8cc1Swenshuai.xi# and fix code at-and-after marker 82*53ee8cc1Swenshuai.xi code=`echo "$code" | cut -c$((${marker} + 1))-` 83*53ee8cc1Swenshuai.xifi 84*53ee8cc1Swenshuai.xiecho Code starting with the faulting instruction > $T.aa 85*53ee8cc1Swenshuai.xiecho =========================================== >> $T.aa 86*53ee8cc1Swenshuai.xicode=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'` 87*53ee8cc1Swenshuai.xiecho -n " .$type 0x" > $T.s 88*53ee8cc1Swenshuai.xiecho $code >> $T.s 89*53ee8cc1Swenshuai.xidisas $T 90*53ee8cc1Swenshuai.xicat $T.dis >> $T.aa 91*53ee8cc1Swenshuai.xi 92*53ee8cc1Swenshuai.xifaultline=`cat $T.dis | head -1 | cut -d":" -f2` 93*53ee8cc1Swenshuai.xifaultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'` 94*53ee8cc1Swenshuai.xi 95*53ee8cc1Swenshuai.xicat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g" 96*53ee8cc1Swenshuai.xiecho 97*53ee8cc1Swenshuai.xicat $T.aa 98*53ee8cc1Swenshuai.xicleanup 99