objtool: Fix switch-table detection
authorPeter Zijlstra <peterz@infradead.org>
Thu, 8 Feb 2018 13:02:32 +0000 (14:02 +0100)
committerIngo Molnar <mingo@kernel.org>
Fri, 9 Feb 2018 06:20:23 +0000 (07:20 +0100)
commit99ce7962d52d1948ad6f2785e308d48e76e0a6ef
tree81d969a077b9b4ea4360e25d3a88e1e9243f9485
parent6b8cf5cc9965673951f1ab3f0e3cf23d06e3e2ee
objtool: Fix switch-table detection

Linus reported that GCC-7.3 generated a switch-table construct that
confused objtool. It turns out that, in particular due to KASAN, it is
possible to have unrelated .rodata usage in between the .rodata setup
for the switch-table and the following indirect jump.

The simple linear reverse search from the indirect jump would hit upon
the KASAN .rodata usage first and fail to find a switch_table,
resulting in a spurious 'sibling call with modified stack frame'
warning.

Fix this by creating a 'jump-stack' which we can 'unwind' during
reversal, thereby skipping over much of the in-between code.

This is not fool proof by any means, but is sufficient to make the
known cases work. Future work would be to construct more comprehensive
flow analysis code.

Reported-and-tested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20180208130232.GF25235@hirez.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
tools/objtool/check.c
tools/objtool/check.h