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