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 10cleanup() { 11 rm -f $T $T.s $T.o $T.oo $T.aa $T.dis 12 exit 1 13} 14 15die() { 16 echo "$@" 17 exit 1 18} 19 20trap cleanup EXIT 21 22T=`mktemp` || die "cannot create temp file" 23code= 24 25while read i ; do 26 27case "$i" in 28*Code:*) 29 code=$i 30 ;; 31esac 32 33done 34 35if [ -z "$code" ]; then 36 rm $T 37 exit 38fi 39 40echo $code 41code=`echo $code | sed -e 's/.*Code: //'` 42 43width=`expr index "$code" ' '` 44width=$((($width-1)/2)) 45case $width in 461) type=byte ;; 472) type=2byte ;; 484) type=4byte ;; 49esac 50 51disas() { 52 ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s > /dev/null 2>&1 53 54 if [ "$ARCH" = "arm" ]; then 55 if [ $width -eq 2 ]; then 56 OBJDUMPFLAGS="-M force-thumb" 57 fi 58 59 ${CROSS_COMPILE}strip $1.o 60 fi 61 62 ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \ 63 grep -v "/tmp\|Disassembly\|\.text\|^$" > $1.dis 2>&1 64} 65 66marker=`expr index "$code" "\<"` 67if [ $marker -eq 0 ]; then 68 marker=`expr index "$code" "\("` 69fi 70 71touch $T.oo 72if [ $marker -ne 0 ]; then 73 echo All code >> $T.oo 74 echo ======== >> $T.oo 75 beforemark=`echo "$code"` 76 echo -n " .$type 0x" > $T.s 77 echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s 78 disas $T 79 cat $T.dis >> $T.oo 80 rm -f $T.o $T.s $T.dis 81 82# and fix code at-and-after marker 83 code=`echo "$code" | cut -c$((${marker} + 1))-` 84fi 85echo Code starting with the faulting instruction > $T.aa 86echo =========================================== >> $T.aa 87code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'` 88echo -n " .$type 0x" > $T.s 89echo $code >> $T.s 90disas $T 91cat $T.dis >> $T.aa 92 93# (lines of whole $T.oo) - (lines of $T.aa, i.e. "Code starting") + 3, 94# i.e. the title + the "===..=" line (sed is counting from 1, 0 address is 95# special) 96faultlinenum=$(( $(wc -l $T.oo | cut -d" " -f1) - \ 97 $(wc -l $T.aa | cut -d" " -f1) + 3)) 98 99faultline=`cat $T.dis | head -1 | cut -d":" -f2-` 100faultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'` 101 102cat $T.oo | sed -e "${faultlinenum}s/^\(.*:\)\(.*\)/\1\*\2\t\t<-- trapping instruction/" 103echo 104cat $T.aa 105cleanup 106