From: Peter Zijlstra <peterz@infradead.org>
To: tglx@linutronix.de, jpoimboe@redhat.com
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
Dan Carpenter <dan.carpenter@oracle.com>
Subject: Re: [RFC][PATCH 00/16] objtool: vmlinux.o and noinstr validation
Date: Thu, 12 Mar 2020 23:23:24 +0100 [thread overview]
Message-ID: <20200312222324.GD5086@worktop.programming.kicks-ass.net> (raw)
In-Reply-To: <20200312162337.GU12561@hirez.programming.kicks-ass.net>
On Thu, Mar 12, 2020 at 05:23:37PM +0100, Peter Zijlstra wrote:
> So one of the problem i've ran into while playing with this and Thomas'
> patches is that it is 'difficult' to deal with indirect function calls.
>
> objtool basically gives up instantly.
>
> I know smatch has passes were it looks for function pointer assignments
> and carries that forward into it's callchain generation. Doing something
> like that for objtool is going to be 'fun'...
>
> For now I've got limited success dodging a few instances with
> __always_inline (which then results in the compiler resolving the
> indirection).
Here's a little something that at least detects 'immediate' function
pointers crossing the boundary.
It's slow though; it almost tripples the runtime. But I'm too tired to
make it fast, maybe tomorrow.
---
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -247,6 +247,9 @@ static int decode_instructions(struct ob
strncmp(sec->name, ".discard.", 9))
sec->text = true;
+ if (!strcmp(sec->name, ".noinstr.text"))
+ sec->noinstr = true;
+
for (offset = 0; offset < sec->len; offset += insn->len) {
insn = malloc(sizeof(*insn));
if (!insn) {
@@ -2040,6 +2043,28 @@ static int validate_return(struct symbol
return 0;
}
+static int validate_rela(struct instruction *insn, struct insn_state *state)
+{
+ struct section *sec;
+ struct rela *rela;
+
+ if (!(state->noinstr && state->instr <= 0))
+ return 0;
+
+ rela = find_rela_by_dest_range(insn->sec, insn->offset, insn->len);
+ if (!rela || !rela->sym || !rela->sym->sec)
+ return 0;
+
+ sec = rela->sym->sec;
+ if (sec->text && !sec->noinstr) {
+ WARN_FUNC("loading non-noinstr function pointer\n",
+ insn->sec, insn->offset);
+ return 1;
+ }
+
+ return 0;
+}
+
/*
* Follow the branch starting at the given instruction, and recursively follow
* any other branches (jumps). Meanwhile, track the frame pointer state at
@@ -2222,6 +2247,10 @@ static int validate_branch(struct objtoo
return 0;
case INSN_STACK:
+ ret = validate_rela(insn, &state);
+ if (ret)
+ return ret;
+
if (update_insn_state(insn, &state))
return 1;
@@ -2285,6 +2314,10 @@ static int validate_branch(struct objtoo
break;
default:
+ ret = validate_rela(insn, &state);
+ if (ret)
+ return ret;
+
break;
}
@@ -2442,8 +2475,8 @@ static int validate_sec_functions(struct
* not correctly determine insn->call_dest->sec (external symbols do
* not have a section).
*/
- if (vmlinux && !strcmp(sec->name, ".noinstr.text"))
- state.noinstr = true;
+ if (vmlinux)
+ state.noinstr = sec->noinstr;
list_for_each_entry(func, &sec->symbol_list, list) {
if (func->type != STT_FUNC)
--- a/tools/objtool/elf.h
+++ b/tools/objtool/elf.h
@@ -43,7 +43,7 @@ struct section {
char *name;
int idx;
unsigned int len;
- bool changed, text, rodata;
+ bool changed, text, rodata, noinstr;
};
struct symbol {
next prev parent reply other threads:[~2020-03-12 22:23 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-12 13:41 [RFC][PATCH 00/16] objtool: vmlinux.o and noinstr validation Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 01/16] objtool: Introduce validate_return() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 02/16] objtool: Rename func_for_each_insn() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 03/16] objtool: Rename func_for_each_insn_all() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 04/16] objtool: Annotate identity_mapped() Peter Zijlstra
2020-03-13 14:34 ` Peter Zijlstra
2020-03-15 15:45 ` Josh Poimboeuf
2020-03-13 16:46 ` Brian Gerst
2020-03-13 17:22 ` Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 05/16] objtool: Optimize find_symbol_by_index() Peter Zijlstra
2020-03-15 16:09 ` Josh Poimboeuf
2020-03-15 16:18 ` Josh Poimboeuf
2020-03-15 16:10 ` Josh Poimboeuf
2020-03-17 11:55 ` Miroslav Benes
2020-03-17 14:08 ` Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 06/16] objtool: Add a statistics mode Peter Zijlstra
2020-03-15 16:20 ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 07/16] objtool: Optimize find_section_by_index() Peter Zijlstra
2020-03-15 16:24 ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 08/16] Optimize find_section_by_name() Peter Zijlstra
2020-03-15 16:25 ` Josh Poimboeuf
2020-03-17 12:22 ` Miroslav Benes
2020-03-17 14:10 ` Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 09/16] objtool: Optimize find_symbol_*() and read_symbols() Peter Zijlstra
2020-03-15 15:48 ` Josh Poimboeuf
2020-03-15 16:41 ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 10/16] objtool: Resize insn_hash Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 11/16] objtool: Optimize find_symbol_by_name() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 12/16] objtool: Optimize read_sections() Peter Zijlstra
2020-03-15 16:53 ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 13/16] objtool: Delete cleanup() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 14/16] objtool: Optimize find_rela_by_dest_range() Peter Zijlstra
2020-03-12 13:41 ` [RFC][PATCH 15/16] objtool: Implement noinstr validation Peter Zijlstra
2020-03-15 18:03 ` Josh Poimboeuf
2020-03-16 13:24 ` Peter Zijlstra
2020-03-16 16:19 ` Josh Poimboeuf
2020-03-16 16:21 ` Josh Poimboeuf
2020-03-16 16:46 ` Peter Zijlstra
2020-03-16 16:48 ` Peter Zijlstra
2020-03-16 19:20 ` Josh Poimboeuf
2020-03-12 13:41 ` [RFC][PATCH 16/16] objtool: Optimize !vmlinux.o again Peter Zijlstra
2020-03-12 21:57 ` [RFC][PATCH v2 " Peter Zijlstra
2020-03-12 16:23 ` [RFC][PATCH 00/16] objtool: vmlinux.o and noinstr validation Peter Zijlstra
2020-03-12 17:44 ` Josh Poimboeuf
2020-03-12 22:23 ` Peter Zijlstra [this message]
2020-03-17 0:56 ` Masami Hiramatsu
2020-03-17 9:26 ` Thomas Gleixner
2020-03-17 14:20 ` Masami Hiramatsu
2020-03-17 12:14 ` Peter Zijlstra
2020-03-13 3:06 ` kbuild test robot
2020-03-15 18:12 ` Josh Poimboeuf
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=20200312222324.GD5086@worktop.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=dan.carpenter@oracle.com \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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.