Nicholas Piggin | 4ea8065 | 2017-05-12 03:40:38 +1000 | [diff] [blame] | 1 | # Copyright © 2016 IBM Corporation |
| 2 | # |
| 3 | # This program is free software; you can redistribute it and/or |
| 4 | # modify it under the terms of the GNU General Public License |
| 5 | # as published by the Free Software Foundation; either version |
| 6 | # 2 of the License, or (at your option) any later version. |
| 7 | # |
| 8 | # This script checks the relocations of a vmlinux for "suspicious" |
| 9 | # branches from unrelocated code (head_64.S code). |
| 10 | |
| 11 | # Turn this on if you want more debug output: |
| 12 | # set -x |
| 13 | |
| 14 | # Have Kbuild supply the path to objdump so we handle cross compilation. |
| 15 | objdump="$1" |
| 16 | vmlinux="$2" |
| 17 | |
| 18 | #__end_interrupts should be located within the first 64K |
| 19 | |
| 20 | end_intr=0x$( |
| 21 | "$objdump" -R "$vmlinux" -d --start-address=0xc000000000000000 \ |
| 22 | --stop-address=0xc000000000010000 | |
| 23 | grep '\<__end_interrupts>:' | |
| 24 | awk '{print $1}' |
| 25 | ) |
| 26 | |
| 27 | BRANCHES=$( |
| 28 | "$objdump" -R "$vmlinux" -D --start-address=0xc000000000000000 \ |
| 29 | --stop-address=${end_intr} | |
| 30 | grep -e "^c[0-9a-f]*:[[:space:]]*\([0-9a-f][0-9a-f][[:space:]]\)\{4\}[[:space:]]*b" | |
| 31 | grep -v '\<__start_initialization_multiplatform>' | |
| 32 | grep -v -e 'b.\?.\?ctr' | |
| 33 | grep -v -e 'b.\?.\?lr' | |
| 34 | sed 's/://' | |
| 35 | awk '{ print $1 ":" $6 ":0x" $7 ":" $8 " "}' |
| 36 | ) |
| 37 | |
| 38 | for tuple in $BRANCHES |
| 39 | do |
| 40 | from=`echo $tuple | cut -d':' -f1` |
| 41 | branch=`echo $tuple | cut -d':' -f2` |
| 42 | to=`echo $tuple | cut -d':' -f3 | sed 's/cr[0-7],//'` |
| 43 | sym=`echo $tuple | cut -d':' -f4` |
| 44 | |
| 45 | if (( $to > $end_intr )) |
| 46 | then |
| 47 | if [ -z "$bad_branches" ]; then |
| 48 | echo "WARNING: Unrelocated relative branches" |
| 49 | bad_branches="yes" |
| 50 | fi |
| 51 | echo "$from $branch-> $to $sym" |
| 52 | fi |
| 53 | done |
| 54 | |
| 55 | if [ -z "$bad_branches" ]; then |
| 56 | exit 0 |
| 57 | fi |