linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump
@ 2020-08-12  8:10 Stephen Rothwell
  2020-08-12  8:10 ` [PATCH 1/2] powerpc: unrel_branch_check.sh: use nm to find symbol value Stephen Rothwell
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Stephen Rothwell @ 2020-08-12  8:10 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: Linux PowerPC List, Bill Wendling, Nicholas Piggin

These 2 patches enable this script to work properly when llvm-objtool
is being used.

They depend on my previos series that make this script suck less.

Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Bill Wendling <morbo@google.com>


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] powerpc: unrel_branch_check.sh: use nm to find symbol value
  2020-08-12  8:10 [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump Stephen Rothwell
@ 2020-08-12  8:10 ` Stephen Rothwell
  2020-08-12  8:10 ` [PATCH 2/2] powerpc: unrel_branch_check.sh: enable the use of llvm-objdump v9, 10 or 11 Stephen Rothwell
  2020-09-09 13:28 ` [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump Michael Ellerman
  2 siblings, 0 replies; 4+ messages in thread
From: Stephen Rothwell @ 2020-08-12  8:10 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: Linux PowerPC List, Bill Wendling, Nicholas Piggin

This is considerably faster then parsing the objdump asm output.  It will
also make the enabling of llvm-objdump a little easier.

Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Bill Wendling <morbo@google.com>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
---
 arch/powerpc/Makefile.postlink           |  2 +-
 arch/powerpc/tools/unrel_branch_check.sh | 13 +++++--------
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/Makefile.postlink b/arch/powerpc/Makefile.postlink
index 2268396ff4bb..a6c77f4d32b2 100644
--- a/arch/powerpc/Makefile.postlink
+++ b/arch/powerpc/Makefile.postlink
@@ -18,7 +18,7 @@ quiet_cmd_relocs_check = CHKREL  $@
 ifdef CONFIG_PPC_BOOK3S_64
       cmd_relocs_check =						\
 	$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@" ; \
-	$(BASH) $(srctree)/arch/powerpc/tools/unrel_branch_check.sh "$(OBJDUMP)" "$@"
+	$(BASH) $(srctree)/arch/powerpc/tools/unrel_branch_check.sh "$(OBJDUMP)" "$(NM)" "$@"
 else
       cmd_relocs_check =						\
 	$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@"
diff --git a/arch/powerpc/tools/unrel_branch_check.sh b/arch/powerpc/tools/unrel_branch_check.sh
index 70da90270c78..0369eb2e7e4b 100755
--- a/arch/powerpc/tools/unrel_branch_check.sh
+++ b/arch/powerpc/tools/unrel_branch_check.sh
@@ -5,18 +5,15 @@
 # This script checks the unrelocated code of a vmlinux for "suspicious"
 # branches to relocated code (head_64.S code).
 
-# Have Kbuild supply the path to objdump so we handle cross compilation.
+# Have Kbuild supply the path to objdump and nm so we handle cross compilation.
 objdump="$1"
-vmlinux="$2"
+nm="$2"
+vmlinux="$3"
 
-#__end_interrupts should be located within the first 64K
 kstart=0xc000000000000000
-printf -v kend '0x%x' $(( kstart + 0x10000 ))
 
-end_intr=0x$(
-$objdump -R -d --start-address="$kstart" --stop-address="$kend" "$vmlinux" 2>/dev/null |
-awk '$2 == "<__end_interrupts>:" { print $1 }'
-)
+end_intr=0x$($nm -p "$vmlinux" |
+	sed -E -n '/\s+[[:alpha:]]\s+__end_interrupts\s*$/{s///p;q}')
 if [ "$end_intr" = "0x" ]; then
 	exit 0
 fi
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] powerpc: unrel_branch_check.sh: enable the use of llvm-objdump v9, 10 or 11
  2020-08-12  8:10 [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump Stephen Rothwell
  2020-08-12  8:10 ` [PATCH 1/2] powerpc: unrel_branch_check.sh: use nm to find symbol value Stephen Rothwell
@ 2020-08-12  8:10 ` Stephen Rothwell
  2020-09-09 13:28 ` [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump Michael Ellerman
  2 siblings, 0 replies; 4+ messages in thread
From: Stephen Rothwell @ 2020-08-12  8:10 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: Linux PowerPC List, Bill Wendling, Nicholas Piggin

Currently, using llvm-objtool, this script just silently succeeds without
actually do the intended checking.  So this updates it to work properly.

Firstly, llvm-objdump does not add target symbol names to the end
of branches in its asm output, so we have to drop the branch to
__start_initialization_multiplatform using its address.

Secondly, v9 and 10 specify branch targets as .+<offset>, so we convert
those to actual addresses.

Thirdly, v10 and 11 error out on a vmlinux if given the -R option
complaining that it is "not a dynamic object".  The -R does not make
any difference to the asm output, so remove it.

Lastly, v11 produces asm that is very similar to Gnu objtool (at least
as far as branches are concerned), so no further changes are necessary
to make it work.

Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Bill Wendling <morbo@google.com>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
---
 arch/powerpc/tools/unrel_branch_check.sh | 34 ++++++++++++++++++++----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/tools/unrel_branch_check.sh b/arch/powerpc/tools/unrel_branch_check.sh
index 0369eb2e7e4b..8301efee1e6c 100755
--- a/arch/powerpc/tools/unrel_branch_check.sh
+++ b/arch/powerpc/tools/unrel_branch_check.sh
@@ -18,12 +18,16 @@ if [ "$end_intr" = "0x" ]; then
 	exit 0
 fi
 
-$objdump -R -D --no-show-raw-insn --start-address="$kstart" --stop-address="$end_intr" "$vmlinux" |
+# we know that there is a correct branch to
+# __start_initialization_multiplatform, so find its address
+# so we can exclude it.
+sim=0x$($nm -p "$vmlinux" |
+	sed -E -n '/\s+[[:alpha:]]\s+__start_initialization_multiplatform\s*$/{s///p;q}')
+
+$objdump -D --no-show-raw-insn --start-address="$kstart" --stop-address="$end_intr" "$vmlinux" |
 sed -E -n '
 # match lines that start with a kernel address
 /^c[0-9a-f]*:\s*b/ {
-	# drop a target that we do not care about
-	/\<__start_initialization_multiplatform>/d
 	# drop branches via ctr or lr
 	/\<b.?.?(ct|l)r/d
 	# cope with some differences between Clang and GNU objdumps
@@ -33,14 +37,34 @@ sed -E -n '
 	s/\s0x/ /
 	s/://
 	# format for the loop below
-	s/^(\S+)\s+(\S+)\s+(\S+)\s*(\S*).*$/\1:\2:0x\3:\4/
+	s/^(\S+)\s+(\S+)\s+(\S+)\s*(\S*).*$/\1:\2:\3:\4/
 	# strip out condition registers
-	s/:0xcr[0-7],/:0x/
+	s/:cr[0-7],/:/
 	p
 }' | {
 
 all_good=true
 while IFS=: read -r from branch to sym; do
+	case "$to" in
+	c*)	to="0x$to"
+		;;
+	.+*)
+		to=${to#.+}
+		if [ "$branch" = 'b' ]; then
+			if (( to >= 0x2000000 )); then
+				to=$(( to - 0x4000000 ))
+			fi
+		elif (( to >= 0x8000 )); then
+			to=$(( to - 0x10000 ))
+		fi
+		printf -v to '0x%x' $(( "0x$from" + to ))
+		;;
+	*)	printf 'Unkown branch format\n'
+		;;
+	esac
+	if [ "$to" = "$sim" ]; then
+		continue
+	fi
 	if (( to > end_intr )); then
 		if $all_good; then
 			printf '%s\n' 'WARNING: Unrelocated relative branches'
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump
  2020-08-12  8:10 [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump Stephen Rothwell
  2020-08-12  8:10 ` [PATCH 1/2] powerpc: unrel_branch_check.sh: use nm to find symbol value Stephen Rothwell
  2020-08-12  8:10 ` [PATCH 2/2] powerpc: unrel_branch_check.sh: enable the use of llvm-objdump v9, 10 or 11 Stephen Rothwell
@ 2020-09-09 13:28 ` Michael Ellerman
  2 siblings, 0 replies; 4+ messages in thread
From: Michael Ellerman @ 2020-09-09 13:28 UTC (permalink / raw)
  To: Stephen Rothwell, Michael Ellerman
  Cc: Linux PowerPC List, Bill Wendling, Nicholas Piggin

On Wed, 12 Aug 2020 18:10:34 +1000, Stephen Rothwell wrote:
> These 2 patches enable this script to work properly when llvm-objtool
> is being used.
> 
> They depend on my previos series that make this script suck less.

Applied to powerpc/next.

[1/2] powerpc: unrel_branch_check.sh: use nm to find symbol value
      https://git.kernel.org/powerpc/c/b71dca9891b330d5c2d3ff5d41704aa6f64f8e32
[2/2] powerpc: unrel_branch_check.sh: enable the use of llvm-objdump v9, 10 or 11
      https://git.kernel.org/powerpc/c/6b1992bcdee8b86a74362192d4d8906731918bcc

cheers

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-09-09 15:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-12  8:10 [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump Stephen Rothwell
2020-08-12  8:10 ` [PATCH 1/2] powerpc: unrel_branch_check.sh: use nm to find symbol value Stephen Rothwell
2020-08-12  8:10 ` [PATCH 2/2] powerpc: unrel_branch_check.sh: enable the use of llvm-objdump v9, 10 or 11 Stephen Rothwell
2020-09-09 13:28 ` [PATCH 0/2] powerpc: unrel_branch_check.sh: enable llvm-objdump Michael Ellerman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).