1*b97fba2cSJoseph Chen#!/bin/bash 2*b97fba2cSJoseph Chen# 3*b97fba2cSJoseph Chen# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd 4*b97fba2cSJoseph Chen# 5*b97fba2cSJoseph Chen# SPDX-License-Identifier: GPL-2.0 6*b97fba2cSJoseph Chen# 7*b97fba2cSJoseph Chen 8*b97fba2cSJoseph Chenset -e 9*b97fba2cSJoseph ChenARGS_N=$# 10*b97fba2cSJoseph ChenINPUT_FILE=$1 11*b97fba2cSJoseph ChenSYMBOL_FILE=`find -name u-boot.sym` 12*b97fba2cSJoseph Chen 13*b97fba2cSJoseph Chenecho 14*b97fba2cSJoseph Chenif [ $ARGS_N -eq 0 ]; then 15*b97fba2cSJoseph Chen echo "Usage: " 16*b97fba2cSJoseph Chen echo " ./scripts/stacktrace.sh <file> // u-boot stacktrace info file" 17*b97fba2cSJoseph Chen exit 1 18*b97fba2cSJoseph Chenelif [ ! -f $INPUT_FILE ]; then 19*b97fba2cSJoseph Chen echo "Can't find input file: $INPUT_FILE" 20*b97fba2cSJoseph Chen exit 1 21*b97fba2cSJoseph Chenelif [ "$SYMBOL_FILE" = '' ] || [ ! -f $SYMBOL_FILE ]; then 22*b97fba2cSJoseph Chen echo "Can't find symbol file: u-boot.sym" 23*b97fba2cSJoseph Chen exit 1 24*b97fba2cSJoseph Chenfi 25*b97fba2cSJoseph Chen 26*b97fba2cSJoseph Chen# Parse PC and LR 27*b97fba2cSJoseph Chenecho "Call trace:" 28*b97fba2cSJoseph Chensed -n "/: \[</p" $INPUT_FILE | while read line 29*b97fba2cSJoseph Chendo 30*b97fba2cSJoseph Chen echo -n " ${line} " 31*b97fba2cSJoseph Chen 32*b97fba2cSJoseph Chen frame_pc_str=`echo $line | awk '{ print "0x"$3 }'` 33*b97fba2cSJoseph Chen frame_pc_dec=`echo $line | awk '{ print strtonum("0x"$3); }'` 34*b97fba2cSJoseph Chen frame_pc_hex=`echo "obase=16;${frame_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 35*b97fba2cSJoseph Chen 36*b97fba2cSJoseph Chen f_pc_dec=`cat u-boot.sym | sort | awk '/\.text/ { if (strtonum("0x"$1) > '$frame_pc_str') { print fpc; exit; } fpc=strtonum("0x"$1); }'` 37*b97fba2cSJoseph Chen f_pc_hex=`echo "obase=16;${f_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 38*b97fba2cSJoseph Chen f_offset_dec=$((frame_pc_dec-f_pc_dec)) 39*b97fba2cSJoseph Chen f_offset_hex=`echo "obase=16;${f_offset_dec}"|bc |tr '[A-Z]' '[a-z]'` 40*b97fba2cSJoseph Chen 41*b97fba2cSJoseph Chen cat u-boot.sym | sort | 42*b97fba2cSJoseph Chen awk -v foffset=$f_offset_hex '/\.text/ { 43*b97fba2cSJoseph Chen if (strtonum("0x"$1) > '$frame_pc_str') { 44*b97fba2cSJoseph Chen printf("%s+0x%s/0x%x\n", fname, foffset, fsize); 45*b97fba2cSJoseph Chen exit 46*b97fba2cSJoseph Chen } 47*b97fba2cSJoseph Chen fname=$NF; 48*b97fba2cSJoseph Chen fsize=strtonum("0x"$5); 49*b97fba2cSJoseph Chen fpc=strtonum("0x"$1); 50*b97fba2cSJoseph Chen }' 51*b97fba2cSJoseph Chendone 52*b97fba2cSJoseph Chenecho 53*b97fba2cSJoseph Chen 54*b97fba2cSJoseph Chen# Parse stack 55*b97fba2cSJoseph Chenecho "Stack:" 56*b97fba2cSJoseph Chensed -n "/ \[</p" $INPUT_FILE | while read line 57*b97fba2cSJoseph Chendo 58*b97fba2cSJoseph Chen echo -n " ${line} " 59*b97fba2cSJoseph Chen 60*b97fba2cSJoseph Chen frame_pc_str=`echo $line | awk '{ print "0x"$2 }'` 61*b97fba2cSJoseph Chen frame_pc_dec=`echo $line | awk '{ print strtonum("0x"$2); }'` 62*b97fba2cSJoseph Chen frame_pc_hex=`echo "obase=16;${frame_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 63*b97fba2cSJoseph Chen 64*b97fba2cSJoseph Chen f_pc_dec=`cat u-boot.sym | sort | awk '/\.text/ { if (strtonum("0x"$1) > '$frame_pc_str') { print fpc; exit; } fpc=strtonum("0x"$1); }'` 65*b97fba2cSJoseph Chen f_pc_hex=`echo "obase=16;${f_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 66*b97fba2cSJoseph Chen f_offset_dec=$((frame_pc_dec-f_pc_dec)) 67*b97fba2cSJoseph Chen f_offset_hex=`echo "obase=16;${f_offset_dec}"|bc |tr '[A-Z]' '[a-z]'` 68*b97fba2cSJoseph Chen 69*b97fba2cSJoseph Chen cat u-boot.sym | sort | 70*b97fba2cSJoseph Chen awk -v foffset=$f_offset_hex '/\.text/ { 71*b97fba2cSJoseph Chen if (strtonum("0x"$1) > '$frame_pc_str') { 72*b97fba2cSJoseph Chen printf("%s+0x%s/0x%x\n", fname, foffset, fsize); 73*b97fba2cSJoseph Chen exit 74*b97fba2cSJoseph Chen } 75*b97fba2cSJoseph Chen fname=$NF; 76*b97fba2cSJoseph Chen fsize=strtonum("0x"$5); 77*b97fba2cSJoseph Chen fpc=strtonum("0x"$1); 78*b97fba2cSJoseph Chen }' 79*b97fba2cSJoseph Chendone 80*b97fba2cSJoseph Chenecho 81