Commit 39c89ee6 authored by Nathan Chancellor's avatar Nathan Chancellor Committed by Kees Cook
Browse files

compiler_types: Introduce __nocfi_generic

There are two different ways that LLVM can expand kCFI operand bundles
in LLVM IR: generically in the middle end or using an architecture
specific sequence when lowering LLVM IR to machine code in the backend.
The generic pass allows any architecture to take advantage of kCFI but
the expansion of these bundles in the middle end can mess with
optimizations that may turn indirect calls into direct calls when the
call target is known at compile time, such as after inlining.

Add __nocfi_generic, dependent on an architecture selecting
CONFIG_ARCH_USES_CFI_GENERIC_LLVM_PASS, to disable kCFI bundle
generation in functions where only the generic kCFI pass may cause
problems.

Link: https://github.com/ClangBuiltLinux/linux/issues/2124


Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
Link: https://patch.msgid.link/20251025-idpf-fix-arm-kcfi-build-error-v1-1-ec57221153ae@kernel.org


Signed-off-by: default avatarKees Cook <kees@kernel.org>
parent 211ddde0
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -917,6 +917,13 @@ config ARCH_USES_CFI_TRAPS
	  An architecture should select this option if it requires the
	  .kcfi_traps section for KCFI trap handling.

config ARCH_USES_CFI_GENERIC_LLVM_PASS
	bool
	help
	  An architecture should select this option if it uses the generic
	  KCFIPass in LLVM to expand kCFI bundles instead of architecture-specific
	  lowering.

config CFI
	bool "Use Kernel Control Flow Integrity (kCFI)"
	default CFI_CLANG
+6 −0
Original line number Diff line number Diff line
@@ -461,6 +461,12 @@ struct ftrace_likely_data {
# define __nocfi
#endif

#if defined(CONFIG_ARCH_USES_CFI_GENERIC_LLVM_PASS)
# define __nocfi_generic	__nocfi
#else
# define __nocfi_generic
#endif

/*
 * Any place that could be marked with the "alloc_size" attribute is also
 * a place to be marked with the "malloc" attribute, except those that may