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