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