Re: [PATCH v2 4/4] s390: enable Rust support
From: Gary Guo
Date: Tue May 19 2026 - 11:46:06 EST
On Tue May 19, 2026 at 4:12 PM BST, Jan Polensky wrote:
> Enable building Rust code on s390 by wiring the architecture into the
> kernel Rust infrastructure.
>
> Add s390 to the Rust arch support documentation, provide the s390 Rust
> target and required compiler flags, and set the bindgen target for
> arch/s390. Adjust the Rust target generation and minimum rustc version
> gating so the s390 setup is handled explicitly.
>
> The Rust toolchain uses the "s390x" triple naming for the 64 bit target.
>
> Rust support is currently incompatible with CONFIG_EXPOLINE, which
> relies on compiler support for the -mindirect-branch= and
> -mfunction_return= options. Therefore, select HAVE_RUST only when
> EXPOLINE is disabled.
>
> Signed-off-by: Jan Polensky <japo@xxxxxxxxxxxxx>
> ---
> Documentation/rust/arch-support.rst | 1 +
> arch/s390/Kconfig | 1 +
> arch/s390/Makefile | 29 ++++++++++++++++++-----------
> rust/Makefile | 1 +
> scripts/generate_rust_target.rs | 2 ++
> scripts/min-tool-version.sh | 6 +++++-
> 6 files changed, 28 insertions(+), 12 deletions(-)
>
> diff --git a/Documentation/rust/arch-support.rst b/Documentation/rust/arch-support.rst
> index 6e6a515d0899..ce9804b8226c 100644
> --- a/Documentation/rust/arch-support.rst
> +++ b/Documentation/rust/arch-support.rst
> @@ -19,6 +19,7 @@ Architecture Level of support Constraints
> ``arm64`` Maintained Little Endian only.
> ``loongarch`` Maintained \-
> ``riscv`` Maintained ``riscv64`` and LLVM/Clang only.
> +``s390`` Maintained \-
> ``um`` Maintained \-
> ``x86`` Maintained ``x86_64`` only.
> ============= ================ ==============================================
> diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
> index ecbcbb781e40..26951781d74d 100644
> --- a/arch/s390/Kconfig
> +++ b/arch/s390/Kconfig
> @@ -248,6 +248,7 @@ config S390
> select HAVE_RELIABLE_STACKTRACE
> select HAVE_RETHOOK
> select HAVE_RSEQ
> + select HAVE_RUST if !EXPOLINE
> select HAVE_SAMPLE_FTRACE_DIRECT
> select HAVE_SAMPLE_FTRACE_DIRECT_MULTI
> select HAVE_SETUP_PER_CPU_AREA
> diff --git a/arch/s390/Makefile b/arch/s390/Makefile
> index 297976b41088..8e1239668f8c 100644
> --- a/arch/s390/Makefile
> +++ b/arch/s390/Makefile
> @@ -35,25 +35,32 @@ KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),-g)
> KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
> KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_CC_NO_ARRAY_BOUNDS),-Wno-array-bounds)
>
> +KBUILD_RUSTFLAGS += --target=s390x-unknown-none-softfloat -Zpacked-stack -Ctarget-feature=+backchain
> +
> UTS_MACHINE := s390x
> STACK_SIZE := $(if $(CONFIG_KASAN),65536,$(if $(CONFIG_KMSAN),65536,16384))
> CHECKFLAGS += -D__s390__ -D__s390x__
>
> export LD_BFD
>
> -mflags-$(CONFIG_MARCH_Z10) := -march=z10
> -mflags-$(CONFIG_MARCH_Z196) := -march=z196
> -mflags-$(CONFIG_MARCH_ZEC12) := -march=zEC12
> -mflags-$(CONFIG_MARCH_Z13) := -march=z13
> -mflags-$(CONFIG_MARCH_Z14) := -march=z14
> -mflags-$(CONFIG_MARCH_Z15) := -march=z15
> -mflags-$(CONFIG_MARCH_Z16) := -march=z16
> -mflags-$(CONFIG_MARCH_Z17) := -march=z17
> +march-name-$(CONFIG_MARCH_Z10) := z10
> +march-name-$(CONFIG_MARCH_Z196) := z196
> +march-name-$(CONFIG_MARCH_ZEC12) := zEC12
> +march-name-$(CONFIG_MARCH_Z13) := z13
> +march-name-$(CONFIG_MARCH_Z14) := z14
> +march-name-$(CONFIG_MARCH_Z15) := z15
> +march-name-$(CONFIG_MARCH_Z16) := z16
> +march-name-$(CONFIG_MARCH_Z17) := z17
>
> -export CC_FLAGS_MARCH := $(mflags-y)
> +mflags :=
> +mflags += -march=$(march-name-y)
Why not just
mflags := -march=$(march-name-y)
?
Best,
Gary
>
> -aflags-y += $(mflags-y)
> -cflags-y += $(mflags-y)
> +export CC_FLAGS_MARCH := $(mflags)
> +
> +aflags-y += $(mflags)
> +cflags-y += $(mflags)
> +
> +KBUILD_RUSTFLAGS += -Ctarget-cpu=$(march-name-y)
>
> cflags-$(CONFIG_MARCH_Z10_TUNE) += -mtune=z10
> cflags-$(CONFIG_MARCH_Z196_TUNE) += -mtune=z196
> diff --git a/rust/Makefile b/rust/Makefile
> index b9e9f512cec3..77460502f576 100644
> --- a/rust/Makefile
> +++ b/rust/Makefile
> @@ -403,6 +403,7 @@ BINDGEN_TARGET_x86 := x86_64-linux-gnu
> BINDGEN_TARGET_arm64 := aarch64-linux-gnu
> BINDGEN_TARGET_arm := arm-linux-gnueabi
> BINDGEN_TARGET_loongarch := loongarch64-linux-gnusf
> +BINDGEN_TARGET_s390 := s390x-linux-gnu
> # This is only for i386 UM builds, which need the 32-bit target not -m32
> BINDGEN_TARGET_i386 := i386-linux-gnu
> BINDGEN_TARGET_um := $(BINDGEN_TARGET_$(SUBARCH))
> diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs
> index 38b3416bb979..8f1df6819d0b 100644
> --- a/scripts/generate_rust_target.rs
> +++ b/scripts/generate_rust_target.rs
> @@ -256,6 +256,8 @@ fn main() {
> }
> } else if cfg.has("LOONGARCH") {
> panic!("loongarch uses the builtin rustc loongarch64-unknown-none-softfloat target");
> + } else if cfg.has("S390") {
> + panic!("s390 uses the builtin rustc s390x-unknown-none-softfloat target");
> } else {
> panic!("Unsupported architecture");
> }
> diff --git a/scripts/min-tool-version.sh b/scripts/min-tool-version.sh
> index b96ec2d379b6..296acf8f71aa 100755
> --- a/scripts/min-tool-version.sh
> +++ b/scripts/min-tool-version.sh
> @@ -31,7 +31,11 @@ llvm)
> fi
> ;;
> rustc)
> - echo 1.85.0
> + if [ "$SRCARCH" = "s390" ]; then
> + echo 1.96.0
> + else
> + echo 1.85.0
> + fi
> ;;
> bindgen)
> echo 0.71.1