summarylogtreecommitdiffstats
path: root/0089-x86-ftrace-Remove-OBJECT_FILES_NON_STANDARD-usage.patch
diff options
context:
space:
mode:
Diffstat (limited to '0089-x86-ftrace-Remove-OBJECT_FILES_NON_STANDARD-usage.patch')
-rw-r--r--0089-x86-ftrace-Remove-OBJECT_FILES_NON_STANDARD-usage.patch136
1 files changed, 136 insertions, 0 deletions
diff --git a/0089-x86-ftrace-Remove-OBJECT_FILES_NON_STANDARD-usage.patch b/0089-x86-ftrace-Remove-OBJECT_FILES_NON_STANDARD-usage.patch
new file mode 100644
index 000000000000..dc788b81ff6b
--- /dev/null
+++ b/0089-x86-ftrace-Remove-OBJECT_FILES_NON_STANDARD-usage.patch
@@ -0,0 +1,136 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Josh Poimboeuf <jpoimboe@kernel.org>
+Date: Fri, 3 Jun 2022 08:04:44 -0700
+Subject: [PATCH] x86/ftrace: Remove OBJECT_FILES_NON_STANDARD usage
+
+[ Upstream commit 7b6c7a877cc616bc7dc9cd39646fe454acbed48b ]
+
+The file-wide OBJECT_FILES_NON_STANDARD annotation is used with
+CONFIG_FRAME_POINTER to tell objtool to skip the entire file when frame
+pointers are enabled. However that annotation is now deprecated because
+it doesn't work with IBT, where objtool runs on vmlinux.o instead of
+individual translation units.
+
+Instead, use more fine-grained function-specific annotations:
+
+- The 'save_mcount_regs' macro does funny things with the frame pointer.
+ Use STACK_FRAME_NON_STANDARD_FP to tell objtool to ignore the
+ functions using it.
+
+- The return_to_handler() "function" isn't actually a callable function.
+ Instead of being called, it's returned to. The real return address
+ isn't on the stack, so unwinding is already doomed no matter which
+ unwinder is used. So just remove the STT_FUNC annotation, telling
+ objtool to ignore it. That also removes the implicit
+ ANNOTATE_NOENDBR, which now needs to be made explicit.
+
+Fixes the following warning:
+
+ vmlinux.o: warning: objtool: __fentry__+0x16: return with modified stack frame
+
+Fixes: ed53a0d97192 ("x86/alternative: Use .ibt_endbr_seal to seal indirect calls")
+Reported-by: kernel test robot <lkp@intel.com>
+Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
+Link: https://lore.kernel.org/r/b7a7a42fe306aca37826043dac89e113a1acdbac.1654268610.git.jpoimboe@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/Makefile | 4 ----
+ arch/x86/kernel/ftrace_64.S | 11 ++++++++---
+ include/linux/objtool.h | 6 ++++++
+ tools/include/linux/objtool.h | 6 ++++++
+ 4 files changed, 20 insertions(+), 7 deletions(-)
+
+diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
+index c41ef42adbe8a3b13d10442b3d3b590b1ac40836..25828e4c62375007b3efd2fa392604b8c85636a4 100644
+--- a/arch/x86/kernel/Makefile
++++ b/arch/x86/kernel/Makefile
+@@ -36,10 +36,6 @@ KCSAN_SANITIZE := n
+
+ OBJECT_FILES_NON_STANDARD_test_nx.o := y
+
+-ifdef CONFIG_FRAME_POINTER
+-OBJECT_FILES_NON_STANDARD_ftrace_$(BITS).o := y
+-endif
+-
+ # If instrumentation of this dir is enabled, boot hangs during first second.
+ # Probably could be more selective here, but note that files related to irqs,
+ # boot, dumpstack/stacktrace, etc are either non-interesting or can lead to
+diff --git a/arch/x86/kernel/ftrace_64.S b/arch/x86/kernel/ftrace_64.S
+index 4ec13608d3c62bd8acae0d897b264cde3eb41e14..dfeb227de5617c6d55ad6ace1f321b7ac87b6a70 100644
+--- a/arch/x86/kernel/ftrace_64.S
++++ b/arch/x86/kernel/ftrace_64.S
+@@ -175,6 +175,7 @@ SYM_INNER_LABEL(ftrace_caller_end, SYM_L_GLOBAL)
+
+ jmp ftrace_epilogue
+ SYM_FUNC_END(ftrace_caller);
++STACK_FRAME_NON_STANDARD_FP(ftrace_caller)
+
+ SYM_FUNC_START(ftrace_epilogue)
+ /*
+@@ -282,6 +283,7 @@ SYM_INNER_LABEL(ftrace_regs_caller_end, SYM_L_GLOBAL)
+ jmp ftrace_epilogue
+
+ SYM_FUNC_END(ftrace_regs_caller)
++STACK_FRAME_NON_STANDARD_FP(ftrace_regs_caller)
+
+
+ #else /* ! CONFIG_DYNAMIC_FTRACE */
+@@ -311,10 +313,14 @@ trace:
+ jmp ftrace_stub
+ SYM_FUNC_END(__fentry__)
+ EXPORT_SYMBOL(__fentry__)
++STACK_FRAME_NON_STANDARD_FP(__fentry__)
++
+ #endif /* CONFIG_DYNAMIC_FTRACE */
+
+ #ifdef CONFIG_FUNCTION_GRAPH_TRACER
+-SYM_FUNC_START(return_to_handler)
++SYM_CODE_START(return_to_handler)
++ UNWIND_HINT_EMPTY
++ ANNOTATE_NOENDBR
+ subq $16, %rsp
+
+ /* Save the return values */
+@@ -339,7 +345,6 @@ SYM_FUNC_START(return_to_handler)
+ int3
+ .Ldo_rop:
+ mov %rdi, (%rsp)
+- UNWIND_HINT_FUNC
+ RET
+-SYM_FUNC_END(return_to_handler)
++SYM_CODE_END(return_to_handler)
+ #endif
+diff --git a/include/linux/objtool.h b/include/linux/objtool.h
+index 586d35720f135f62b9d7434beccacb2e22a5bd2d..c81ea2264ad8a74b765f5649f81ee1198d7704dd 100644
+--- a/include/linux/objtool.h
++++ b/include/linux/objtool.h
+@@ -141,6 +141,12 @@ struct unwind_hint {
+ .popsection
+ .endm
+
++.macro STACK_FRAME_NON_STANDARD_FP func:req
++#ifdef CONFIG_FRAME_POINTER
++ STACK_FRAME_NON_STANDARD \func
++#endif
++.endm
++
+ .macro ANNOTATE_NOENDBR
+ .Lhere_\@:
+ .pushsection .discard.noendbr
+diff --git a/tools/include/linux/objtool.h b/tools/include/linux/objtool.h
+index 586d35720f135f62b9d7434beccacb2e22a5bd2d..c81ea2264ad8a74b765f5649f81ee1198d7704dd 100644
+--- a/tools/include/linux/objtool.h
++++ b/tools/include/linux/objtool.h
+@@ -141,6 +141,12 @@ struct unwind_hint {
+ .popsection
+ .endm
+
++.macro STACK_FRAME_NON_STANDARD_FP func:req
++#ifdef CONFIG_FRAME_POINTER
++ STACK_FRAME_NON_STANDARD \func
++#endif
++.endm
++
+ .macro ANNOTATE_NOENDBR
+ .Lhere_\@:
+ .pushsection .discard.noendbr