xref: /rk3399_rockchip-uboot/scripts/stacktrace.sh (revision 5330794924424b7839dd5869a9061ed87256d2b4)
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