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() { 10*846442c8SArjan van de Ven rm -f $T $T.s $T.o $T.oo $T.aa $T.aaa 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 42dcecc6c7SRandy Dunlapmarker=`expr index "$code" "\<"` 43dcecc6c7SRandy Dunlapif [ $marker -eq 0 ]; then 44dcecc6c7SRandy Dunlap marker=`expr index "$code" "\("` 45dcecc6c7SRandy Dunlapfi 46dcecc6c7SRandy Dunlap 47*846442c8SArjan van de Ventouch $T.oo 48dcecc6c7SRandy Dunlapif [ $marker -ne 0 ]; then 49*846442c8SArjan van de Ven echo All code >> $T.oo 50*846442c8SArjan van de Ven echo ======== >> $T.oo 51*846442c8SArjan van de Ven beforemark=`echo "$code"` 52dcecc6c7SRandy Dunlap echo -n " .byte 0x" > $T.s 53*846442c8SArjan van de Ven echo $beforemark | sed -e 's/ /,0x/g' | sed -e 's/<//g' | sed -e 's/>//g' >> $T.s 54*846442c8SArjan van de Ven as $AFLAGS -o $T.o $T.s &> /dev/null 55*846442c8SArjan van de Ven objdump -S $T.o | grep -v "/tmp" | grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $T.ooo 56*846442c8SArjan van de Ven cat $T.ooo >> $T.oo 57*846442c8SArjan van de Ven rm -f $T.o $T.s $T.ooo 58dcecc6c7SRandy Dunlap 59dcecc6c7SRandy Dunlap# and fix code at-and-after marker 60dcecc6c7SRandy Dunlap code=`echo "$code" | cut -c$((${marker} + 1))-` 61dcecc6c7SRandy Dunlapfi 62*846442c8SArjan van de Venecho Code starting with the faulting instruction > $T.aa 63*846442c8SArjan van de Venecho =========================================== >> $T.aa 64dcecc6c7SRandy Dunlapcode=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'` 65dcecc6c7SRandy Dunlapecho -n " .byte 0x" > $T.s 66dcecc6c7SRandy Dunlapecho $code >> $T.s 67*846442c8SArjan van de Venas $AFLAGS -o $T.o $T.s &> /dev/null 68*846442c8SArjan van de Venobjdump -S $T.o | grep -v "Disassembly" | grep -v "/tmp" | grep -v "\.text" | grep -v "^$" &> $T.aaa 69*846442c8SArjan van de Vencat $T.aaa >> $T.aa 70*846442c8SArjan van de Ven 71*846442c8SArjan van de Venfaultline=`cat $T.aaa | head -1 | cut -d":" -f2` 72*846442c8SArjan van de Ven 73*846442c8SArjan van de Vencat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g" 74*846442c8SArjan van de Venecho 75*846442c8SArjan van de Vencat $T.aa 76*846442c8SArjan van de Vencleanup 77