aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include/linux/frame.h
diff options
context:
space:
mode:
authorAlexandre Chartre <alexandre.chartre@oracle.com>2020-04-14 12:36:12 +0200
committerPeter Zijlstra <peterz@infradead.org>2020-04-30 20:14:33 +0200
commit8aa8eb2a8f5b3305a95f39957dd2b715fa668e21 (patch)
treeed624343256478e97b84d39fac09bdc3228512e8 /include/linux/frame.h
parentobjtool: Move the IRET hack into the arch decoder (diff)
downloadwireguard-linux-8aa8eb2a8f5b3305a95f39957dd2b715fa668e21.tar.xz
wireguard-linux-8aa8eb2a8f5b3305a95f39957dd2b715fa668e21.zip
objtool: Add support for intra-function calls
Change objtool to support intra-function calls. On x86, an intra-function call is represented in objtool as a push onto the stack (of the return address), and a jump to the destination address. That way the stack information is correctly updated and the call flow is still accurate. Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Link: https://lkml.kernel.org/r/20200414103618.12657-4-alexandre.chartre@oracle.com
Diffstat (limited to 'include/linux/frame.h')
-rw-r--r--include/linux/frame.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/frame.h b/include/linux/frame.h
index 02d3ca2d9598..303cda600e56 100644
--- a/include/linux/frame.h
+++ b/include/linux/frame.h
@@ -15,9 +15,20 @@
static void __used __section(.discard.func_stack_frame_non_standard) \
*__func_stack_frame_non_standard_##func = func
+/*
+ * This macro indicates that the following intra-function call is valid.
+ * Any non-annotated intra-function call will cause objtool to issue a warning.
+ */
+#define ANNOTATE_INTRA_FUNCTION_CALL \
+ 999: \
+ .pushsection .discard.intra_function_calls; \
+ .long 999b; \
+ .popsection;
+
#else /* !CONFIG_STACK_VALIDATION */
#define STACK_FRAME_NON_STANDARD(func)
+#define ANNOTATE_INTRA_FUNCTION_CALL
#endif /* CONFIG_STACK_VALIDATION */