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 11*73251fc2SJoseph ChenTPL_SPL=$2 12*73251fc2SJoseph Chen 13*73251fc2SJoseph Chen 14*73251fc2SJoseph Chenif [ "$TPL_SPL" = "tpl" ]; then 15*73251fc2SJoseph Chen SYMBOL_FILE=`find -name u-boot-tpl.sym` 16*73251fc2SJoseph Chenelif [ "$TPL_SPL" = "spl" ]; then 17*73251fc2SJoseph Chen SYMBOL_FILE=`find -name u-boot-spl.sym` 18*73251fc2SJoseph Chenelse 19b97fba2cSJoseph Chen SYMBOL_FILE=`find -name u-boot.sym` 20*73251fc2SJoseph Chenfi 21b97fba2cSJoseph Chen 22b97fba2cSJoseph Chenecho 23b97fba2cSJoseph Chenif [ $ARGS_N -eq 0 ]; then 24b97fba2cSJoseph Chen echo "Usage: " 25*73251fc2SJoseph Chen echo " ./scripts/stacktrace.sh <file> <type>" 26*73251fc2SJoseph Chen echo 27*73251fc2SJoseph Chen echo "Param:" 28*73251fc2SJoseph Chen echo " <file>: stacktrace info file" 29*73251fc2SJoseph Chen echo " <type>: none, spl, tpl" 30*73251fc2SJoseph Chen echo 31*73251fc2SJoseph Chen echo "Example:" 32*73251fc2SJoseph Chen echo " ./scripts/stacktrace.sh ./dump.txt" 33*73251fc2SJoseph Chen echo " ./scripts/stacktrace.sh ./dump.txt tpl" 34*73251fc2SJoseph Chen echo " ./scripts/stacktrace.sh ./dump.txt spl" 35*73251fc2SJoseph Chen echo 36b97fba2cSJoseph Chen exit 1 37b97fba2cSJoseph Chenelif [ ! -f $INPUT_FILE ]; then 38b97fba2cSJoseph Chen echo "Can't find input file: $INPUT_FILE" 39b97fba2cSJoseph Chen exit 1 40b97fba2cSJoseph Chenelif [ "$SYMBOL_FILE" = '' ] || [ ! -f $SYMBOL_FILE ]; then 41*73251fc2SJoseph Chen echo "Can't find symbol file: ${SYMBOL_FILE}" 42b97fba2cSJoseph Chen exit 1 43b97fba2cSJoseph Chenfi 44b97fba2cSJoseph Chen 45*73251fc2SJoseph Chenecho "SYMBOL File: ${SYMBOL_FILE}" 46*73251fc2SJoseph Chenecho 47b97fba2cSJoseph Chen# Parse PC and LR 48b97fba2cSJoseph Chenecho "Call trace:" 49b97fba2cSJoseph Chensed -n "/: \[</p" $INPUT_FILE | while read line 50b97fba2cSJoseph Chendo 51b97fba2cSJoseph Chen echo -n " ${line} " 52b97fba2cSJoseph Chen 53b97fba2cSJoseph Chen frame_pc_str=`echo $line | awk '{ print "0x"$3 }'` 54b97fba2cSJoseph Chen frame_pc_dec=`echo $line | awk '{ print strtonum("0x"$3); }'` 55b97fba2cSJoseph Chen frame_pc_hex=`echo "obase=16;${frame_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 56b97fba2cSJoseph Chen 57*73251fc2SJoseph Chen f_pc_dec=`cat ${SYMBOL_FILE} | sort | awk '/\.text/ { if (strtonum("0x"$1) > '$frame_pc_str') { print fpc; exit; } fpc=strtonum("0x"$1); }'` 58b97fba2cSJoseph Chen f_pc_hex=`echo "obase=16;${f_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 59b97fba2cSJoseph Chen f_offset_dec=$((frame_pc_dec-f_pc_dec)) 60b97fba2cSJoseph Chen f_offset_hex=`echo "obase=16;${f_offset_dec}"|bc |tr '[A-Z]' '[a-z]'` 61b97fba2cSJoseph Chen 62*73251fc2SJoseph Chen cat ${SYMBOL_FILE} | sort | 63b97fba2cSJoseph Chen awk -v foffset=$f_offset_hex '/\.text/ { 64b97fba2cSJoseph Chen if (strtonum("0x"$1) > '$frame_pc_str') { 6553307949SJoseph Chen printf("%s+0x%s/0x%x ", fname, foffset, fsize); 66b97fba2cSJoseph Chen exit 67b97fba2cSJoseph Chen } 68b97fba2cSJoseph Chen fname=$NF; 69b97fba2cSJoseph Chen fsize=strtonum("0x"$5); 70b97fba2cSJoseph Chen fpc=strtonum("0x"$1); 71b97fba2cSJoseph Chen }' 7253307949SJoseph Chen 7353307949SJoseph Chen func_path=`./make.sh $frame_pc_str | awk '{ print $1 }' | sed -n "/home/p"` 7453307949SJoseph Chen func_path=`echo ${func_path##*boot/}` 7553307949SJoseph Chen echo $func_path 76b97fba2cSJoseph Chendone 77b97fba2cSJoseph Chenecho 78b97fba2cSJoseph Chen 79b97fba2cSJoseph Chen# Parse stack 80b97fba2cSJoseph Chenecho "Stack:" 81b97fba2cSJoseph Chensed -n "/ \[</p" $INPUT_FILE | while read line 82b97fba2cSJoseph Chendo 83b97fba2cSJoseph Chen echo -n " ${line} " 84b97fba2cSJoseph Chen 85b97fba2cSJoseph Chen frame_pc_str=`echo $line | awk '{ print "0x"$2 }'` 86b97fba2cSJoseph Chen frame_pc_dec=`echo $line | awk '{ print strtonum("0x"$2); }'` 87b97fba2cSJoseph Chen frame_pc_hex=`echo "obase=16;${frame_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 88b97fba2cSJoseph Chen 89*73251fc2SJoseph Chen f_pc_dec=`cat ${SYMBOL_FILE} | sort | awk '/\.text/ { if (strtonum("0x"$1) > '$frame_pc_str') { print fpc; exit; } fpc=strtonum("0x"$1); }'` 90b97fba2cSJoseph Chen f_pc_hex=`echo "obase=16;${f_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 91b97fba2cSJoseph Chen f_offset_dec=$((frame_pc_dec-f_pc_dec)) 92b97fba2cSJoseph Chen f_offset_hex=`echo "obase=16;${f_offset_dec}"|bc |tr '[A-Z]' '[a-z]'` 93b97fba2cSJoseph Chen 94*73251fc2SJoseph Chen cat ${SYMBOL_FILE} | sort | 95b97fba2cSJoseph Chen awk -v foffset=$f_offset_hex '/\.text/ { 96b97fba2cSJoseph Chen if (strtonum("0x"$1) > '$frame_pc_str') { 97b97fba2cSJoseph Chen printf("%s+0x%s/0x%x\n", fname, foffset, fsize); 98b97fba2cSJoseph Chen exit 99b97fba2cSJoseph Chen } 100b97fba2cSJoseph Chen fname=$NF; 101b97fba2cSJoseph Chen fsize=strtonum("0x"$5); 102b97fba2cSJoseph Chen fpc=strtonum("0x"$1); 103b97fba2cSJoseph Chen }' 104b97fba2cSJoseph Chendone 105b97fba2cSJoseph Chenecho 106