All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: torvalds@linux-foundation.org, tglx@linutronix.de, hpa@zytor.com,
	julien.thierry@arm.com, will.deacon@arm.com, luto@amacapital.net,
	mingo@kernel.org, catalin.marinas@arm.com, james.morse@arm.com,
	valentin.schneider@arm.com, brgerst@gmail.com,
	jpoimboe@redhat.com, luto@kernel.org, bp@alien8.de,
	dvlasenk@redhat.com
Cc: linux-kernel@vger.kernel.org, peterz@infradead.org,
	dvyukov@google.com, rostedt@goodmis.org
Subject: [PATCH 20/25] objtool: Add --backtrace support
Date: Mon, 18 Mar 2019 16:39:00 +0100	[thread overview]
Message-ID: <20190318155141.743508038@infradead.org> (raw)
In-Reply-To: 20190318153840.906404905@infradead.org

For when you want to know the path that reached your fail state.

$ ./objtool check --no-fp --backtrace arch/x86/lib/usercopy_64.o
arch/x86/lib/usercopy_64.o: warning: objtool: .altinstr_replacement+0x3: UACCESS disable without MEMOPs: __clear_user()
arch/x86/lib/usercopy_64.o: warning: objtool:   __clear_user()+0x3a: (alt)
arch/x86/lib/usercopy_64.o: warning: objtool:   __clear_user()+0x2e: (branch)
arch/x86/lib/usercopy_64.o: warning: objtool:   __clear_user()+0x18: (branch)
arch/x86/lib/usercopy_64.o: warning: objtool:   .altinstr_replacement+0xffffffffffffffff: (branch)
arch/x86/lib/usercopy_64.o: warning: objtool:   __clear_user()+0x5: (alt)
arch/x86/lib/usercopy_64.o: warning: objtool:   __clear_user()+0x0: <=== (func)

0000000000000000 <__clear_user>:
  0:   e8 00 00 00 00          callq  5 <__clear_user+0x5>
               1: R_X86_64_PLT32       __fentry__-0x4
  5:   90                      nop
  6:   90                      nop
  7:   90                      nop
  8:   48 89 f0                mov    %rsi,%rax
  b:   48 c1 ee 03             shr    $0x3,%rsi
  f:   83 e0 07                and    $0x7,%eax
 12:   48 89 f1                mov    %rsi,%rcx
 15:   48 85 c9                test   %rcx,%rcx
 18:   74 0f                   je     29 <__clear_user+0x29>
 1a:   48 c7 07 00 00 00 00    movq   $0x0,(%rdi)
 21:   48 83 c7 08             add    $0x8,%rdi
 25:   ff c9                   dec    %ecx
 27:   75 f1                   jne    1a <__clear_user+0x1a>
 29:   48 89 c1                mov    %rax,%rcx
 2c:   85 c9                   test   %ecx,%ecx
 2e:   74 0a                   je     3a <__clear_user+0x3a>
 30:   c6 07 00                movb   $0x0,(%rdi)
 33:   48 ff c7                inc    %rdi
 36:   ff c9                   dec    %ecx
 38:   75 f6                   jne    30 <__clear_user+0x30>
 3a:   90                      nop
 3b:   90                      nop
 3c:   90                      nop
 3d:   48 89 c8                mov    %rcx,%rax
 40:   c3                      retq


Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 tools/objtool/builtin-check.c |    3 ++-
 tools/objtool/builtin.h       |    2 +-
 tools/objtool/check.c         |   18 ++++++++++++++----
 tools/objtool/warn.h          |    8 ++++++++
 4 files changed, 25 insertions(+), 6 deletions(-)

--- a/tools/objtool/builtin-check.c
+++ b/tools/objtool/builtin-check.c
@@ -29,7 +29,7 @@
 #include "builtin.h"
 #include "check.h"
 
-bool no_fp, no_unreachable, retpoline, module;
+bool no_fp, no_unreachable, retpoline, module, backtrace;
 
 static const char * const check_usage[] = {
 	"objtool check [<options>] file.o",
@@ -41,6 +41,7 @@ const struct option check_options[] = {
 	OPT_BOOLEAN('u', "no-unreachable", &no_unreachable, "Skip 'unreachable instruction' warnings"),
 	OPT_BOOLEAN('r', "retpoline", &retpoline, "Validate retpoline assumptions"),
 	OPT_BOOLEAN('m', "module", &module, "Indicates the object will be part of a kernel module"),
+	OPT_BOOLEAN('b', "backtrace", &backtrace, "unwind on error"),
 	OPT_END(),
 };
 
--- a/tools/objtool/builtin.h
+++ b/tools/objtool/builtin.h
@@ -20,7 +20,7 @@
 #include <subcmd/parse-options.h>
 
 extern const struct option check_options[];
-extern bool no_fp, no_unreachable, retpoline, module;
+extern bool no_fp, no_unreachable, retpoline, module, backtrace;
 
 extern int cmd_check(int argc, const char **argv);
 extern int cmd_orc(int argc, const char **argv);
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1885,8 +1885,11 @@ static int validate_branch(struct objtoo
 		if (!insn->ignore_alts) {
 			list_for_each_entry(alt, &insn->alts, list) {
 				ret = validate_branch(file, alt->insn, state);
-				if (ret)
-					return 1;
+				if (ret) {
+					if (backtrace)
+						BT_FUNC("(alt)", insn);
+					return ret;
+				}
 			}
 		}
 
@@ -1933,8 +1936,11 @@ static int validate_branch(struct objtoo
 			     insn->jump_dest->func->pfunc == func)) {
 				ret = validate_branch(file, insn->jump_dest,
 						      state);
-				if (ret)
-					return 1;
+				if (ret) {
+					if (backtrace)
+						BT_FUNC("(branch)", insn);
+					return ret;
+				}
 
 			} else if (func && has_modified_stack_frame(&state)) {
 				WARN_FUNC("sibling call from callable instruction with modified stack frame",
@@ -2005,6 +2011,8 @@ static int validate_unwind_hints(struct
 	for_each_insn(file, insn) {
 		if (insn->hint && !insn->visited) {
 			ret = validate_branch(file, insn, state);
+			if (ret && backtrace)
+				BT_FUNC("<=== (hint)", insn);
 			warnings += ret;
 		}
 	}
@@ -2133,6 +2141,8 @@ static int validate_functions(struct obj
 				continue;
 
 			ret = validate_branch(file, insn, state);
+			if (ret && backtrace)
+				BT_FUNC("<=== (func)", insn);
 			warnings += ret;
 		}
 	}
--- a/tools/objtool/warn.h
+++ b/tools/objtool/warn.h
@@ -64,6 +64,14 @@ static inline char *offstr(struct sectio
 	free(_str);					\
 })
 
+#define BT_FUNC(format, insn, ...)			\
+({							\
+	struct instruction *_insn = (insn);		\
+	char *_str = offstr(_insn->sec, _insn->offset); \
+	WARN("  %s: " format, _str, ##__VA_ARGS__);	\
+	free(_str);					\
+})
+
 #define WARN_ELF(format, ...)				\
 	WARN(format ": %s", ##__VA_ARGS__, elf_errmsg(-1))
 



  parent reply	other threads:[~2019-03-18 15:53 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-18 15:38 [PATCH 00/25] objtool: UACCESS validation v4 Peter Zijlstra
2019-03-18 15:38 ` [PATCH 01/25] x86: Make SMAP 64-bit only Peter Zijlstra
2019-03-18 16:58   ` Linus Torvalds
2019-03-18 17:36     ` Peter Zijlstra
2019-03-18 17:51       ` Peter Zijlstra
2019-03-18 18:10         ` Linus Torvalds
2019-03-21 17:12           ` hpa
2019-03-21 17:25           ` Denys Vlasenko
2019-03-21 18:18             ` hpa
2019-03-21 21:03               ` Peter Zijlstra
2019-03-21 18:21             ` Linus Torvalds
2019-03-19 11:16   ` [PATCH 01/25] sched/x86: Save [ER]FLAGS on context switch Peter Zijlstra
2019-03-18 15:38 ` [PATCH 02/25] tracing: Improve "if" macro code generation Peter Zijlstra
2019-03-18 17:41   ` Steven Rostedt
2019-03-18 23:37   ` Josh Poimboeuf
2019-03-19 10:11     ` Peter Zijlstra
2019-03-20 11:18   ` David Laight
2019-03-20 17:26     ` Linus Torvalds
2019-03-20 17:37       ` David Laight
2019-03-20 17:38         ` Linus Torvalds
2019-03-20 18:18       ` Steven Rostedt
2019-05-09 13:00       ` Steven Rostedt
2019-05-09 16:51         ` Linus Torvalds
2019-05-09 18:29           ` Steven Rostedt
2019-05-09 18:45             ` Josh Poimboeuf
2019-05-09 18:47               ` Josh Poimboeuf
2019-05-09 18:48                 ` Randy Dunlap
2019-05-09 18:57                   ` Josh Poimboeuf
2019-05-09 19:06               ` Steven Rostedt
2019-05-09 19:28                 ` Steven Rostedt
2019-05-09 19:44                   ` Linus Torvalds
2019-03-18 15:38 ` [PATCH 03/25] x86/ia32: Fix ia32_restore_sigcontext AC leak Peter Zijlstra
2019-03-18 15:38 ` [PATCH 04/25] i915,uaccess: Fix redundant CLAC Peter Zijlstra
2019-03-18 15:38 ` [PATCH 05/25] x86/uaccess: Move copy_user_handle_tail into asm Peter Zijlstra
2019-03-18 15:38 ` [PATCH 06/25] x86/uaccess: Fix up the fixup Peter Zijlstra
2019-03-18 15:38 ` [PATCH 07/25] x86/nospec,objtool: Introduce ANNOTATE_IGNORE_ALTERNATIVE Peter Zijlstra
2019-03-18 15:38 ` [PATCH 08/25] x86/uaccess,xen: Suppress SMAP warnings Peter Zijlstra
2019-03-18 15:38 ` [PATCH 09/25] x86/uaccess: Always inline user_access_begin() Peter Zijlstra
2019-03-18 15:38 ` [PATCH 10/25] x86/uaccess,signal: Fix AC=1 bloat Peter Zijlstra
2019-03-18 15:38 ` [PATCH 11/25] x86/uaccess: Introduce user_access_{save,restore}() Peter Zijlstra
2019-03-18 15:38 ` [PATCH 12/25] x86/smap: Ditch __stringify() Peter Zijlstra
2019-03-18 15:38 ` [PATCH 13/25] x86/uaccess,kasan: Fix KASAN vs SMAP Peter Zijlstra
2019-03-18 15:38 ` [PATCH 14/25] x86/uaccess,ubsan: Fix UBSAN " Peter Zijlstra
2019-03-18 15:38 ` [PATCH 15/25] x86/uaccess,ftrace: Fix ftrace_likely_update() " Peter Zijlstra
2019-03-18 15:38 ` [PATCH 16/25] x86/uaccess,kcov: Disable stack protector Peter Zijlstra
2019-03-18 15:38 ` [PATCH 17/25] objtool: Set insn->func for alternatives Peter Zijlstra
2019-03-18 15:38 ` [PATCH 18/25] objtool: Handle function aliases Peter Zijlstra
2019-03-18 15:38 ` [PATCH 19/25] objtool: Rewrite add_ignores() Peter Zijlstra
2019-03-18 15:39 ` Peter Zijlstra [this message]
2019-03-18 15:39 ` [PATCH 21/25] objtool: Rewrite alt->skip_orig Peter Zijlstra
2019-03-18 15:39 ` [PATCH 22/25] objtool: Fix sibling call detection Peter Zijlstra
2019-03-18 15:39 ` [PATCH 23/25] objtool: Add UACCESS validation Peter Zijlstra
2019-03-18 23:51   ` Josh Poimboeuf
2019-05-07 11:52   ` Peter Zijlstra
2019-03-18 15:39 ` [PATCH 24/25] objtool: uaccess PUSHF/POPF support Peter Zijlstra
2019-03-18 15:39 ` [PATCH 25/25] objtool: Add Direction Flag validation Peter Zijlstra
2019-03-18 23:57 ` [PATCH 00/25] objtool: UACCESS validation v4 Josh Poimboeuf
2019-03-19 11:20   ` Peter Zijlstra
2019-03-19 11:17 ` [PATCH 26/25] sched/x86_64: Don't save flags on context switch Peter Zijlstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190318155141.743508038@infradead.org \
    --to=peterz@infradead.org \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=dvlasenk@redhat.com \
    --cc=dvyukov@google.com \
    --cc=hpa@zytor.com \
    --cc=james.morse@arm.com \
    --cc=jpoimboe@redhat.com \
    --cc=julien.thierry@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=valentin.schneider@arm.com \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.