[PATCH v2 5/6] ARM: rust: Enable Rust support for ARMv4T

From: Karl Mehltretter

Date: Thu Oct 08 2026 - 01:41:06 EST


The armv5te target emits clz and blx, which ARMv4T lacks. Kernels that
contain an ARMv4T CPU are excluded from Rust for that reason.

Nothing else in the Rust code depends on ARMv5. Use rustc's
armv4t-unknown-linux-gnueabi target for these kernels. Like the C code,
the Rust code of a combined ARMv4T and ARMv5 kernel is then built for
ARMv4T.

ARMv4 (StrongARM, FA526) stays excluded. It has no bx and rustc has no
target for it.

Tested in QEMU sx1 (OMAP310, ARM925T) with omap1_defconfig. The Rust
samples, all Rust KUnit suites and the doctests pass with the current
and with the minimum tool versions.

at91_dt_defconfig combines ARMv4T and ARMv5 and is built for ARMv4T.
That kernel passes the same tests on a Microchip SAM9X75 Curiosity
board (ARM926EJ-S).

Assisted-by: LLM
Signed-off-by: Karl Mehltretter <kmehltretter@xxxxxxxxx>
---
Documentation/rust/arch-support.rst | 8 ++++----
arch/arm/Kconfig | 2 +-
arch/arm/Makefile | 1 +
3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/Documentation/rust/arch-support.rst b/Documentation/rust/arch-support.rst
index d6d1bef44c8f..3f39cf55b6f4 100644
--- a/Documentation/rust/arch-support.rst
+++ b/Documentation/rust/arch-support.rst
@@ -12,15 +12,15 @@ which uses ``libclang``.
Below is a general summary of architectures that currently work. Level of
support corresponds to ``S`` values in the ``MAINTAINERS`` file.

-============= ================ ==============================================
+============= ================ ======================================================
Architecture Level of support Constraints
-============= ================ ==============================================
-``arm`` Maintained ARMv5TE, ARMv6K and ARMv7, Little Endian only.
+============= ================ ======================================================
+``arm`` Maintained ARMv4T, ARMv5TE, ARMv6K and ARMv7, Little Endian only.
``arm64`` Maintained Little Endian only.
``loongarch`` Maintained \-
``riscv`` Maintained ``riscv64`` and LLVM/Clang only.
``s390`` Maintained ``CONFIG_EXPOLINE`` must be disabled.
``um`` Maintained \-
``x86`` Maintained ``x86_64`` only.
-============= ================ ==============================================
+============= ================ ======================================================

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9275a85f95e9..cf782fc04872 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -176,7 +176,7 @@ config ARM
config ARM_RUST_TARGET
def_bool y
depends on (CPU_32v6K && !CPU_V6) || \
- (CPU_32v5 && !CPU_32v4T && !CPU_32v4)
+ ((CPU_32v5 || CPU_32v4T) && !CPU_32v4)

config ARM_HAS_GROUP_RELOCS
def_bool !COMPILE_TEST
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 168779e9e93d..a72843890241 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -77,6 +77,7 @@ arch-$(CONFIG_CPU_32v3) :=-march=armv3m
# the +v6 of the generic target, so older CPUs need their own target.
rust-target-y :=arm-unknown-linux-gnueabi
rust-target-$(CONFIG_CPU_32v5) :=armv5te-unknown-linux-gnueabi
+rust-target-$(CONFIG_CPU_32v4T) :=armv4t-unknown-linux-gnueabi

# Note that GCC does not numerically define an architecture version
# macro, but instead defines a whole series of macros which makes
--
2.39.5 (Apple Git-154)