mbox series

[v2,0/3] Rust enablement for AArch64

Message ID 20230606145606.1153715-1-Jamie.Cunliffe@arm.com (mailing list archive)
Headers show
Series Rust enablement for AArch64 | expand

Message

Jamie Cunliffe June 6, 2023, 2:56 p.m. UTC
Enable Rust support for the AArch64 architecture.

The first patch enables the basic building of Rust for AArch64. Since
v1 this has been rewritten to avoid the use of a target.json file for
AArch64 and use the upstream rustc target definition. x86-64 still
uses the target.json approach though.

The second patch enables the PAC ret and BTI options in the Rust build
flags to match the options that are used when building C.

The third patch disables Rust support when building for big
endian. Currently there is no `aarch64_be-unknown-none` target which
would allow this. Support for this can come at a later time either by
using the target.json approach, or upstreaming a new target definition
to rustc (preferred). We also might be able to use the
`aarch64_be-unknown-linux-gnu` target, however, this can be done at a
later time.  It's worth noting that in Makefile.clang, it's
recommended for arch/{arch}/Makefile to set the endianness based on
arguments rather than the target triple. It's currently not possible
to do this with rustc, a different target triple has to be used.


Jamie Cunliffe (3):
  arm64: rust: Enable Rust support for AArch64
  arm64: rust: Enable PAC support for Rust.
  arm64: Restrict Rust support to little endian only.

 Documentation/rust/arch-support.rst | 1 +
 Makefile                            | 1 -
 arch/arm64/Kconfig                  | 1 +
 arch/arm64/Makefile                 | 4 ++++
 arch/x86/Makefile                   | 1 +
 rust/Makefile                       | 6 +++++-
 scripts/Makefile                    | 5 +++--
 scripts/generate_rust_target.rs     | 4 +++-
 8 files changed, 18 insertions(+), 5 deletions(-)

Comments

Miguel Ojeda June 6, 2023, 3:25 p.m. UTC | #1
On Tue, Jun 6, 2023 at 4:56 PM Jamie Cunliffe <Jamie.Cunliffe@arm.com> wrote:
>
> The third patch disables Rust support when building for big
> endian. Currently there is no `aarch64_be-unknown-none` target which
> would allow this. Support for this can come at a later time either by
> using the target.json approach, or upstreaming a new target definition
> to rustc (preferred). We also might be able to use the
> `aarch64_be-unknown-linux-gnu` target, however, this can be done at a
> later time.  It's worth noting that in Makefile.clang, it's
> recommended for arch/{arch}/Makefile to set the endianness based on
> arguments rather than the target triple. It's currently not possible
> to do this with rustc, a different target triple has to be used.

Thanks Jamie for this!

It sounds like upstream `rustc` should support setting the endianness,
but if they are OK with maintaining another target, so that we can
start to get rid of `target.json`, that would be great.

By the way, should the patches be merged into one? i.e. the first
patch applied alone would be "wrong" in that BE is not supported
anyway, right? So why not put the constraint directly in the first
patch? Or am I missing something?

Similarly, for the second patch, I think it would be better to squash
it into the first, especially if the build is not correct if those
flags are not set.

But maybe I am missing something, or perhaps the arm64 maintainers
prefer otherwise.

Lina's `Tested-by` for Asahi would be great here.

Cheers,
Miguel
Boqun Feng June 9, 2023, 6:34 p.m. UTC | #2
On Tue, Jun 06, 2023 at 03:56:03PM +0100, Jamie Cunliffe wrote:
> Enable Rust support for the AArch64 architecture.
> 

With the following diff on the whole series:

	diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
	index 4a2c807d65db..4562a8173e90 100644
	--- a/arch/arm64/Makefile
	+++ b/arch/arm64/Makefile
	@@ -41,7 +41,7 @@ KBUILD_CFLAGS += -mgeneral-regs-only  \
	 KBUILD_CFLAGS  += $(call cc-disable-warning, psabi)
	 KBUILD_AFLAGS  += $(compat_vdso)

	-KBUILD_RUSTFLAGS += --target aarch64-unknown-none -C target-feature="-neon,-fp-armv8"
	+KBUILD_RUSTFLAGS += --target aarch64-unknown-none -C target-feature="-neon"

	 KBUILD_CFLAGS  += $(call cc-option,-mabi=lp64)
	 KBUILD_AFLAGS  += $(call cc-option,-mabi=lp64)

I've built with RUST=y and boot it in one ARM64 Hyper-V VM. Also I tried
load/unload rust_minimal and rust_print modules, they all worked.

Tested-by: Boqun Feng <boqun.feng@gmail.com>

Regards,
Boqun
	

> The first patch enables the basic building of Rust for AArch64. Since
> v1 this has been rewritten to avoid the use of a target.json file for
> AArch64 and use the upstream rustc target definition. x86-64 still
> uses the target.json approach though.
> 
> The second patch enables the PAC ret and BTI options in the Rust build
> flags to match the options that are used when building C.
> 
> The third patch disables Rust support when building for big
> endian. Currently there is no `aarch64_be-unknown-none` target which
> would allow this. Support for this can come at a later time either by
> using the target.json approach, or upstreaming a new target definition
> to rustc (preferred). We also might be able to use the
> `aarch64_be-unknown-linux-gnu` target, however, this can be done at a
> later time.  It's worth noting that in Makefile.clang, it's
> recommended for arch/{arch}/Makefile to set the endianness based on
> arguments rather than the target triple. It's currently not possible
> to do this with rustc, a different target triple has to be used.
> 
> 
> Jamie Cunliffe (3):
>   arm64: rust: Enable Rust support for AArch64
>   arm64: rust: Enable PAC support for Rust.
>   arm64: Restrict Rust support to little endian only.
> 
>  Documentation/rust/arch-support.rst | 1 +
>  Makefile                            | 1 -
>  arch/arm64/Kconfig                  | 1 +
>  arch/arm64/Makefile                 | 4 ++++
>  arch/x86/Makefile                   | 1 +
>  rust/Makefile                       | 6 +++++-
>  scripts/Makefile                    | 5 +++--
>  scripts/generate_rust_target.rs     | 4 +++-
>  8 files changed, 18 insertions(+), 5 deletions(-)
> 
> -- 
> 2.30.2
> 
>