Default CONFIG_ARM64_FUNCTION_PREFIX_NOPS to 5 on ThinLTO kernels with
BTI. Many functions there have a landing pad but no hash. That moves the
entry point 4 bytes. The 8-byte slot lands on the landing pad and ftrace
refuses the site. With five NOPs every function has a slot.
Commit d3359af21fc9e ("arm64: bti: Disable in-kernel BTI with recent
versions of Clang") keeps BTI off on clang 21 or later, so this default
does not trigger on a mainline build today. Josh Poimboeuf's series to
bring it back is under review [1].
With five NOPs the series costs 7.4% of .text on a defconfig-based
ThinLTO kernel with clang 21.1.4:
Kernel || .text bytes | Delta | Delta
=======================++=============+=============+=======
ThinLTO kCFI, base || 21,466,256 | |
ThinLTO kCFI, M = 5 || 23,047,312 | +1,581,056 | +7.4%
-----------------------++-------------+-------------+-------
ftracetest results match with and without this series. The three
failures on a ThinLTO kernel are pre-existing. The BPF trampoline,
struct_ops and kprobe_multi selftests pass with CFI enforcing.
[1] https://lore.kernel.org/all/[email protected]/
Reviewed-by: Ben Cressey <[email protected]>
Reviewed-by: Florent Revest (Anthropic) <[email protected]>
Assisted-by: LLM
Signed-off-by: Jose Fernandez (Anthropic) <[email protected]>
---
arch/arm64/Kconfig | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 6e5fa009c11af..afa566e0fa86c 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -290,6 +290,8 @@ config ARM64_CFI_PERMITS_CALL_OPS
config ARM64_FUNCTION_PREFIX_NOPS
int
+ default 5 if DYNAMIC_FTRACE_WITH_CALL_OPS && CFI && \
+ (LTO_CLANG_THIN || LTO_CLANG_THIN_DIST) && ARM64_BTI_KERNEL
default 3 if DYNAMIC_FTRACE_WITH_CALL_OPS && CFI
default 2 if DYNAMIC_FTRACE_WITH_CALL_OPS
default 0
--
2.52.0