xref: /utopia/UTPA2-700.0.x/projects/build/scripts/decodecode (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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