[PATCH v1] rust: cfi: only 64-bit arm and x86 support CFI_CLANG

Kees Cook kees at kernel.org
Mon Sep 8 20:11:48 PDT 2025


On Mon, Sep 08, 2025 at 02:12:35PM +0100, Conor Dooley wrote:
> From: Conor Dooley <conor.dooley at microchip.com>
> 
> The kernel uses the standard rustc targets for non-x86 targets, and out
> of those only 64-bit arm's target has kcfi support enabled. For x86, the
> custom 64-bit target enables kcfi.
> 
> The HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC config option that allows
> CFI_CLANG to be used in combination with RUST does not check whether the
> rustc target supports kcfi. This breaks the build on riscv (and
> presumably 32-bit arm) when CFI_CLANG and RUST are enabled at the same
> time.
> 
> Ordinarily, a rustc-option check would be used to detect target support
> but unfortunately rustc-option filters out the target for reasons given
> in commit 46e24a545cdb4 ("rust: kasan/kbuild: fix missing flags on first
> build"). As a result, if the host supports kcfi but the target does not,
> e.g. when building for riscv on x86_64, the build would remain broken.
> 
> Instead, make HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC depend on the only
> two architectures where the target used supports it to fix the build.

I'm generally fine with this, but normally we do arch-specific stuff
only in arch/$arch/Kconfig, and expose some kind of
ARCH_HAS_CFI_ICALL_NORMALIZE_INTEGERS that would get tested here. Should
we do that here too?

-Kees

> 
> CC: stable at vger.kernel.org
> Fixes: ca627e636551e ("rust: cfi: add support for CFI_CLANG with Rust")
> Signed-off-by: Conor Dooley <conor.dooley at microchip.com>
> ---
> CC: Paul Walmsley <paul.walmsley at sifive.com>
> CC: Palmer Dabbelt <palmer at dabbelt.com>
> CC: Alexandre Ghiti <alex at ghiti.fr>
> CC: Miguel Ojeda <ojeda at kernel.org>
> CC: Alex Gaynor <alex.gaynor at gmail.com>
> CC: Boqun Feng <boqun.feng at gmail.com>
> CC: Gary Guo <gary at garyguo.net>
> CC: "Björn Roy Baron" <bjorn3_gh at protonmail.com>
> CC: Benno Lossin <lossin at kernel.org>
> CC: Andreas Hindborg <a.hindborg at kernel.org>
> CC: Alice Ryhl <aliceryhl at google.com>
> CC: Trevor Gross <tmgross at umich.edu>
> CC: Danilo Krummrich <dakr at kernel.org>
> CC: Kees Cook <kees at kernel.org>
> CC: Sami Tolvanen <samitolvanen at google.com>
> CC: Matthew Maurer <mmaurer at google.com>
> CC: "Peter Zijlstra (Intel)" <peterz at infradead.org>
> CC: linux-kernel at vger.kernel.org
> CC: linux-riscv at lists.infradead.org
> CC: rust-for-linux at vger.kernel.org
> ---
>  arch/Kconfig | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/arch/Kconfig b/arch/Kconfig
> index d1b4ffd6e0856..880cddff5eda7 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -917,6 +917,7 @@ config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC
>  	def_bool y
>  	depends on HAVE_CFI_ICALL_NORMALIZE_INTEGERS_CLANG
>  	depends on RUSTC_VERSION >= 107900
> +	depends on ARM64 || X86_64
>  	# With GCOV/KASAN we need this fix: https://github.com/rust-lang/rust/pull/129373
>  	depends on (RUSTC_LLVM_VERSION >= 190103 && RUSTC_VERSION >= 108200) || \
>  		(!GCOV_KERNEL && !KASAN_GENERIC && !KASAN_SW_TAGS)
> -- 
> 2.47.2
> 

-- 
Kees Cook



More information about the linux-riscv mailing list