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 97545a1ecSJoseph Chen 10b97fba2cSJoseph ChenINPUT_FILE=$1 1173251fc2SJoseph ChenTPL_SPL=$2 1273251fc2SJoseph Chen 137545a1ecSJoseph Chenif [ "${TPL_SPL}" = "tpl" ]; then 147545a1ecSJoseph Chen SYM_FILE=`find -name u-boot-tpl.sym` 15f961f5acSJoseph Chen ELF_FILE="elf tpl" 167545a1ecSJoseph Chenelif [ "${TPL_SPL}" = "spl" ]; then 177545a1ecSJoseph Chen SYM_FILE=`find -name u-boot-spl.sym` 18f961f5acSJoseph Chen ELF_FILE="elf spl" 1973251fc2SJoseph Chenelse 207545a1ecSJoseph Chen SYM_FILE=`find -name u-boot.sym` 21f961f5acSJoseph Chen ELF_FILE="elf" 2273251fc2SJoseph Chenfi 23b97fba2cSJoseph Chen 24b97fba2cSJoseph Chenecho 257545a1ecSJoseph Chenif [ $# -eq 0 ]; then 26b97fba2cSJoseph Chen echo "Usage: " 2773251fc2SJoseph Chen echo " ./scripts/stacktrace.sh <file> <type>" 2873251fc2SJoseph Chen echo 2973251fc2SJoseph Chen echo "Param:" 3073251fc2SJoseph Chen echo " <file>: stacktrace info file" 3173251fc2SJoseph Chen echo " <type>: none, spl, tpl" 3273251fc2SJoseph Chen echo 3373251fc2SJoseph Chen echo "Example:" 3473251fc2SJoseph Chen echo " ./scripts/stacktrace.sh ./dump.txt" 3573251fc2SJoseph Chen echo " ./scripts/stacktrace.sh ./dump.txt tpl" 3673251fc2SJoseph Chen echo " ./scripts/stacktrace.sh ./dump.txt spl" 3773251fc2SJoseph Chen echo 38b97fba2cSJoseph Chen exit 1 397545a1ecSJoseph Chenelif [ ! -f ${INPUT_FILE} ]; then 407545a1ecSJoseph Chen echo "ERROR: No ${INPUT_FILE}" 41b97fba2cSJoseph Chen exit 1 427545a1ecSJoseph Chenelif [ "${SYM_FILE}" = '' ] || [ ! -f ${SYM_FILE} ]; then 437545a1ecSJoseph Chen echo "ERROR: No ${SYM_FILE}" 44b97fba2cSJoseph Chen exit 1 45b97fba2cSJoseph Chenfi 46b97fba2cSJoseph Chen 477545a1ecSJoseph Chenecho "SYMBOL File: ${SYM_FILE}" 4873251fc2SJoseph Chenecho 49b97fba2cSJoseph Chen# Parse PC and LR 50b97fba2cSJoseph Chenecho "Call trace:" 517545a1ecSJoseph Chengrep '\[< ' ${INPUT_FILE} | grep '>\]' | grep [PC,LR] | while read line 52b97fba2cSJoseph Chendo 53b97fba2cSJoseph Chen echo -n " ${line} " 54b97fba2cSJoseph Chen 557545a1ecSJoseph Chen frame_pc_str=`echo ${line} | awk '{ print "0x"$3 }'` 567545a1ecSJoseph Chen frame_pc_dec=`echo ${line} | awk '{ print strtonum("0x"$3); }'` 57b97fba2cSJoseph Chen frame_pc_hex=`echo "obase=16;${frame_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 58b97fba2cSJoseph Chen 597545a1ecSJoseph Chen f_pc_dec=`cat ${SYM_FILE} | sort | awk '/\.text/ { if (strtonum("0x"$1) > '${frame_pc_str}') { print fpc; exit; } fpc=strtonum("0x"$1); }'` 60b97fba2cSJoseph Chen f_pc_hex=`echo "obase=16;${f_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 61b97fba2cSJoseph Chen f_offset_dec=$((frame_pc_dec-f_pc_dec)) 62b97fba2cSJoseph Chen f_offset_hex=`echo "obase=16;${f_offset_dec}"|bc |tr '[A-Z]' '[a-z]'` 63b97fba2cSJoseph Chen 647545a1ecSJoseph Chen cat ${SYM_FILE} | sort | 657545a1ecSJoseph Chen awk -v foffset=${f_offset_hex} '/\.text/ { 667545a1ecSJoseph Chen if (strtonum("0x"$1) > '${frame_pc_str}') { 6753307949SJoseph Chen printf("%s+0x%s/0x%x ", fname, foffset, fsize); 68b97fba2cSJoseph Chen exit 69b97fba2cSJoseph Chen } 70b97fba2cSJoseph Chen fname=$NF; 71b97fba2cSJoseph Chen fsize=strtonum("0x"$5); 72b97fba2cSJoseph Chen fpc=strtonum("0x"$1); 73b97fba2cSJoseph Chen }' 7453307949SJoseph Chen 757545a1ecSJoseph Chen func_path=`./make.sh ${frame_pc_str} | awk '{ print $1 }' | sed -n "/home/p"` 7653307949SJoseph Chen func_path=`echo ${func_path##*boot/}` 777545a1ecSJoseph Chen echo ${func_path} 78b97fba2cSJoseph Chendone 79b97fba2cSJoseph Chenecho 80b97fba2cSJoseph Chen 81b97fba2cSJoseph Chen# Parse stack 82b97fba2cSJoseph Chenecho "Stack:" 837545a1ecSJoseph Chengrep '\[< ' ${INPUT_FILE} | grep '>\]' | grep -v [PC,LR] | while read line 84b97fba2cSJoseph Chendo 85b97fba2cSJoseph Chen echo -n " ${line} " 86b97fba2cSJoseph Chen 877545a1ecSJoseph Chen frame_pc_str=`echo ${line} | awk '{ print "0x"$2 }'` 887545a1ecSJoseph Chen frame_pc_dec=`echo ${line} | awk '{ print strtonum("0x"$2); }'` 89b97fba2cSJoseph Chen frame_pc_hex=`echo "obase=16;${frame_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 90b97fba2cSJoseph Chen 917545a1ecSJoseph Chen f_pc_dec=`cat ${SYM_FILE} | sort | awk '/\.text/ { if (strtonum("0x"$1) > '${frame_pc_str}') { print fpc; exit; } fpc=strtonum("0x"$1); }'` 92b97fba2cSJoseph Chen f_pc_hex=`echo "obase=16;${f_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 93b97fba2cSJoseph Chen f_offset_dec=$((frame_pc_dec-f_pc_dec)) 94b97fba2cSJoseph Chen f_offset_hex=`echo "obase=16;${f_offset_dec}"|bc |tr '[A-Z]' '[a-z]'` 95b97fba2cSJoseph Chen 967545a1ecSJoseph Chen cat ${SYM_FILE} | sort | 977545a1ecSJoseph Chen awk -v foffset=${f_offset_hex} '/\.text/ { 987545a1ecSJoseph Chen if (strtonum("0x"$1) > '${frame_pc_str}') { 99b97fba2cSJoseph Chen printf("%s+0x%s/0x%x\n", fname, foffset, fsize); 100b97fba2cSJoseph Chen exit 101b97fba2cSJoseph Chen } 102b97fba2cSJoseph Chen fname=$NF; 103b97fba2cSJoseph Chen fsize=strtonum("0x"$5); 104b97fba2cSJoseph Chen fpc=strtonum("0x"$1); 105b97fba2cSJoseph Chen }' 106b97fba2cSJoseph Chendone 107b97fba2cSJoseph Chenecho 108f961f5acSJoseph Chen 109f961f5acSJoseph Chen# PC instruction 110f961f5acSJoseph Chenecho "PC Surrounding Instructions:" 1117545a1ecSJoseph Chenline=`grep '\[< ' ${INPUT_FILE} | grep '>\]' | grep [PC]` 1127545a1ecSJoseph Chenframe_pc_str=`echo ${line} | awk '{ print "0x"$3 }'` 1137545a1ecSJoseph Chenframe_pc_dec=`echo ${line} | awk '{ print strtonum("0x"$3); }'` 114*050aa3bcSJoseph Chen# Handle Thumb instr 115*050aa3bcSJoseph Chenif [ `expr ${frame_pc_dec} % 2` -ne 0 ];then 116*050aa3bcSJoseph Chen frame_pc_dec=`expr ${frame_pc_dec} - 1` 117*050aa3bcSJoseph Chenfi 118f961f5acSJoseph Chenframe_pc_hex=`echo "obase=16;${frame_pc_dec}"|bc |tr '[A-Z]' '[a-z]'` 119f961f5acSJoseph ChenPC_INSTR=`./make.sh ${ELF_FILE} | grep -5 -m 1 "${frame_pc_hex}:"` 120f961f5acSJoseph Chenecho "${PC_INSTR}" 121f961f5acSJoseph Chenecho 122