Rust for Linux List
 help / color / mirror / Atom feed
From: "Gary Guo" <gary@garyguo.net>
To: "Jan Polensky" <japo@linux.ibm.com>, <hca@linux.ibm.com>,
	<gor@linux.ibm.com>, <agordeev@linux.ibm.com>, <ojeda@kernel.org>,
	<peterz@infradead.org>, <jpoimboe@kernel.org>,
	<jbaron@akamai.com>, <aliceryhl@google.com>
Cc: <borntraeger@linux.ibm.com>, <svens@linux.ibm.com>,
	<boqun@kernel.org>, <gary@garyguo.net>,
	<bjorn3_gh@protonmail.com>, <lossin@kernel.org>,
	<a.hindborg@kernel.org>, <tmgross@umich.edu>, <dakr@kernel.org>,
	<rostedt@goodmis.org>, <ardb@kernel.org>,
	<linux-s390@vger.kernel.org>, <rust-for-linux@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v6 6/6] s390: Enable Rust support
Date: Mon, 08 Jun 2026 19:25:06 +0100	[thread overview]
Message-ID: <DJ3VN4EYXCUA.18YA9379UHT5Z@garyguo.net> (raw)
In-Reply-To: <20260608181451.3734956-7-japo@linux.ibm.com>

On Mon Jun 8, 2026 at 7:14 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.

Does `-Zretpoline-external-thunk`/`-Zretpoline` not work for s390? Rust will
throw a warning saying that it doesn't recognize this for the target, but it
looks like it does generate target features
+retpoline-external-thunk,+retpoline-indirect-branches,+retpoline-indirect-calls
in LLVM IR.

Best,
Gary

>
> Acked-by: Miguel Ojeda <ojeda@kernel.org>
> Acked-by: Heiko Carstens <hca@linux.ibm.com>
> Signed-off-by: Jan Polensky <japo@linux.ibm.com>
> ---
>  Documentation/rust/arch-support.rst |  1 +
>  arch/s390/Kconfig                   |  1 +
>  arch/s390/Makefile                  | 28 +++++++++++++++++-----------
>  rust/Makefile                       |  1 +
>  scripts/generate_rust_target.rs     |  2 ++
>  scripts/min-tool-version.sh         |  6 +++++-
>  6 files changed, 27 insertions(+), 12 deletions(-)
>
> diff --git a/Documentation/rust/arch-support.rst b/Documentation/rust/arch-support.rst
> index 6e6a515d0899..4f980815e92a 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        ``CONFIG_EXPOLINE`` must be disabled.
>  ``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..8b712cd85fcd 100644
> --- a/arch/s390/Makefile
> +++ b/arch/s390/Makefile
> @@ -35,25 +35,31 @@ 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 := -march=$(march-name-y)
>  
> -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 16f7e855e012..3bf296581a88 100644
> --- a/scripts/generate_rust_target.rs
> +++ b/scripts/generate_rust_target.rs
> @@ -260,6 +260,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



  reply	other threads:[~2026-06-08 18:25 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-08 18:14 [PATCH v6 0/6] s390: Enable Rust support and add required arch glue Jan Polensky
2026-06-08 18:14 ` [PATCH v6 1/6] s390/bug: Provide ARCH_WARN_ASM for Rust WARN/BUG support Jan Polensky
2026-06-08 18:14 ` [PATCH v6 2/6] s390/jump_label: Implement ARCH_STATIC_BRANCH_JUMP_ASM and ARCH_STATIC_BRANCH_ASM macros Jan Polensky
2026-06-08 18:14 ` [PATCH v6 3/6] rust/bindgen_parameters: Mark s390 types as opaque to prevent repr conflicts Jan Polensky
2026-06-08 18:14 ` [PATCH v6 4/6] rust: helpers: Add memchr wrapper for string operations Jan Polensky
2026-06-08 18:14 ` [PATCH v6 5/6] s390/cmpxchg: Fix KASAN stack-out-of-bounds in atomic helpers Jan Polensky
2026-06-08 18:14 ` [PATCH v6 6/6] s390: Enable Rust support Jan Polensky
2026-06-08 18:25   ` Gary Guo [this message]
2026-06-08 19:45     ` Jan Polensky
2026-06-09 13:51       ` Alexander Gordeev
2026-06-09 14:00         ` Gary Guo
2026-06-15 16:40   ` Nathan Chancellor
2026-06-15 16:45     ` Miguel Ojeda
2026-06-16  3:04       ` Nathan Chancellor
2026-06-16  7:39       ` Alice Ryhl
2026-06-16  8:45         ` Miguel Ojeda
2026-06-16 14:05           ` Jan Polensky
2026-06-16 14:22             ` Miguel Ojeda

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DJ3VN4EYXCUA.18YA9379UHT5Z@garyguo.net \
    --to=gary@garyguo.net \
    --cc=a.hindborg@kernel.org \
    --cc=agordeev@linux.ibm.com \
    --cc=aliceryhl@google.com \
    --cc=ardb@kernel.org \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun@kernel.org \
    --cc=borntraeger@linux.ibm.com \
    --cc=dakr@kernel.org \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=japo@linux.ibm.com \
    --cc=jbaron@akamai.com \
    --cc=jpoimboe@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=svens@linux.ibm.com \
    --cc=tmgross@umich.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox