Commit 02c3a3d09ef86dd7da574b8725c0ea49dda9d277
Committed by
Tom Rini
1 parent
bd2a13f329
Exists in
smarc_8mq_lf_v2020.04
and in
13 other branches
scripts: add decodecode from Linux
The script decodecode can be used to disassemble the 'Code:' line written when an exception occurs. The script is copied from Linux v4.16. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Showing 1 changed file with 125 additions and 0 deletions Side-by-side Diff
scripts/decodecode
1 | +#!/bin/sh | |
2 | +# SPDX-License-Identifier: GPL-2.0 | |
3 | +# Disassemble the Code: line in Linux oopses | |
4 | +# usage: decodecode < oops.file | |
5 | +# | |
6 | +# options: set env. variable AFLAGS=options to pass options to "as"; | |
7 | +# e.g., to decode an i386 oops on an x86_64 system, use: | |
8 | +# AFLAGS=--32 decodecode < 386.oops | |
9 | + | |
10 | +cleanup() { | |
11 | + rm -f $T $T.s $T.o $T.oo $T.aa $T.dis | |
12 | + exit 1 | |
13 | +} | |
14 | + | |
15 | +die() { | |
16 | + echo "$@" | |
17 | + exit 1 | |
18 | +} | |
19 | + | |
20 | +trap cleanup EXIT | |
21 | + | |
22 | +T=`mktemp` || die "cannot create temp file" | |
23 | +code= | |
24 | +cont= | |
25 | + | |
26 | +while read i ; do | |
27 | + | |
28 | +case "$i" in | |
29 | +*Code:*) | |
30 | + code=$i | |
31 | + cont=yes | |
32 | + ;; | |
33 | +*) | |
34 | + [ -n "$cont" ] && { | |
35 | + xdump="$(echo $i | grep '^[[:xdigit:]<>[:space:]]\+$')" | |
36 | + if [ -n "$xdump" ]; then | |
37 | + code="$code $xdump" | |
38 | + else | |
39 | + cont= | |
40 | + fi | |
41 | + } | |
42 | + ;; | |
43 | +esac | |
44 | + | |
45 | +done | |
46 | + | |
47 | +if [ -z "$code" ]; then | |
48 | + rm $T | |
49 | + exit | |
50 | +fi | |
51 | + | |
52 | +echo $code | |
53 | +code=`echo $code | sed -e 's/.*Code: //'` | |
54 | + | |
55 | +width=`expr index "$code" ' '` | |
56 | +width=$((($width-1)/2)) | |
57 | +case $width in | |
58 | +1) type=byte ;; | |
59 | +2) type=2byte ;; | |
60 | +4) type=4byte ;; | |
61 | +esac | |
62 | + | |
63 | +disas() { | |
64 | + ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s > /dev/null 2>&1 | |
65 | + | |
66 | + if [ "$ARCH" = "arm" ]; then | |
67 | + if [ $width -eq 2 ]; then | |
68 | + OBJDUMPFLAGS="-M force-thumb" | |
69 | + fi | |
70 | + | |
71 | + ${CROSS_COMPILE}strip $1.o | |
72 | + fi | |
73 | + | |
74 | + if [ "$ARCH" = "arm64" ]; then | |
75 | + if [ $width -eq 4 ]; then | |
76 | + type=inst | |
77 | + fi | |
78 | + | |
79 | + ${CROSS_COMPILE}strip $1.o | |
80 | + fi | |
81 | + | |
82 | + ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \ | |
83 | + grep -v "/tmp\|Disassembly\|\.text\|^$" > $1.dis 2>&1 | |
84 | +} | |
85 | + | |
86 | +marker=`expr index "$code" "\<"` | |
87 | +if [ $marker -eq 0 ]; then | |
88 | + marker=`expr index "$code" "\("` | |
89 | +fi | |
90 | + | |
91 | +touch $T.oo | |
92 | +if [ $marker -ne 0 ]; then | |
93 | + echo All code >> $T.oo | |
94 | + echo ======== >> $T.oo | |
95 | + beforemark=`echo "$code"` | |
96 | + echo -n " .$type 0x" > $T.s | |
97 | + echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s | |
98 | + disas $T | |
99 | + cat $T.dis >> $T.oo | |
100 | + rm -f $T.o $T.s $T.dis | |
101 | + | |
102 | +# and fix code at-and-after marker | |
103 | + code=`echo "$code" | cut -c$((${marker} + 1))-` | |
104 | +fi | |
105 | +echo Code starting with the faulting instruction > $T.aa | |
106 | +echo =========================================== >> $T.aa | |
107 | +code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'` | |
108 | +echo -n " .$type 0x" > $T.s | |
109 | +echo $code >> $T.s | |
110 | +disas $T | |
111 | +cat $T.dis >> $T.aa | |
112 | + | |
113 | +# (lines of whole $T.oo) - (lines of $T.aa, i.e. "Code starting") + 3, | |
114 | +# i.e. the title + the "===..=" line (sed is counting from 1, 0 address is | |
115 | +# special) | |
116 | +faultlinenum=$(( $(wc -l $T.oo | cut -d" " -f1) - \ | |
117 | + $(wc -l $T.aa | cut -d" " -f1) + 3)) | |
118 | + | |
119 | +faultline=`cat $T.dis | head -1 | cut -d":" -f2-` | |
120 | +faultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'` | |
121 | + | |
122 | +cat $T.oo | sed -e "${faultlinenum}s/^\(.*:\)\(.*\)/\1\*\2\t\t<-- trapping instruction/" | |
123 | +echo | |
124 | +cat $T.aa | |
125 | +cleanup |