From 3cd0e086da6829bf5e781136b7b15cd7f5f48239 Mon Sep 17 00:00:00 2001 From: Jamie Cunliffe Date: Fri, 20 Oct 2023 16:50:55 +0100 Subject: [PATCH 1/3] rust: Refactor the build target to allow the use of builtin targets ANBZ: #29354 [ Upstream commit f82811e22b480a203a438d8e1f29af9c93ccbb0c ] Eventually we want all architectures to be using the target as defined by rustc. However currently some architectures can't do that and are using the target.json specification. This puts in place the foundation to allow the use of the builtin target definition or a target.json specification. Signed-off-by: Jamie Cunliffe Acked-by: Masahiro Yamada Tested-by: Alice Ryhl Link: https://lore.kernel.org/r/20231020155056.3495121-2-Jamie.Cunliffe@arm.com [catalin.marinas@arm.com: squashed loongarch ifneq fix from WANG Rui] Signed-off-by: Catalin Marinas Signed-off-by: Jia He --- Makefile | 1 - arch/loongarch/Makefile | 2 ++ arch/x86/Makefile | 1 + rust/Makefile | 5 ++++- scripts/Makefile | 4 +++- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 00331d58358f..6c5b5a5c88b7 100644 --- a/Makefile +++ b/Makefile @@ -578,7 +578,6 @@ KBUILD_CFLAGS += -fno-strict-aliasing KBUILD_CPPFLAGS := -D__KERNEL__ KBUILD_RUSTFLAGS := $(rust_common_flags) \ - --target=$(objtree)/scripts/target.json \ -Cpanic=abort -Cembed-bitcode=n -Clto=n \ -Cforce-unwind-tables=n -Ccodegen-units=1 \ -Csymbol-mangling-version=v0 \ diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile index 1cad527d635e..45be66d66937 100644 --- a/arch/loongarch/Makefile +++ b/arch/loongarch/Makefile @@ -97,6 +97,8 @@ ifdef CONFIG_OBJTOOL KBUILD_CFLAGS += -fno-jump-tables endif +KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json + ifeq ($(CONFIG_RELOCATABLE),y) KBUILD_CFLAGS_KERNEL += -fPIE LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext $(call ld-option, --apply-dynamic-relocs) diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 6d593fb85a9e..e78be0dcd460 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -68,6 +68,7 @@ export BITS # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383 # KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx +KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2 ifeq ($(CONFIG_X86_KERNEL_IBT),y) diff --git a/rust/Makefile b/rust/Makefile index 333b9a482473..313246e085ef 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -425,8 +425,11 @@ $(obj)/core.o: private skip_clippy = 1 $(obj)/core.o: private skip_flags = -Dunreachable_pub $(obj)/core.o: private rustc_objcopy = $(foreach sym,$(redirect-intrinsics),--redefine-sym $(sym)=__rust$(sym)) $(obj)/core.o: private rustc_target_flags = $(core-cfgs) -$(obj)/core.o: $(RUST_LIB_SRC)/core/src/lib.rs scripts/target.json FORCE +$(obj)/core.o: $(RUST_LIB_SRC)/core/src/lib.rs FORCE $(call if_changed_dep,rustc_library) +ifneq ($(or $(CONFIG_X86_64),$(CONFIG_LOONGARCH)),) +$(obj)/core.o: scripts/target.json +endif $(obj)/compiler_builtins.o: private rustc_objcopy = -w -W '__*' $(obj)/compiler_builtins.o: $(src)/compiler_builtins.rs $(obj)/core.o FORCE diff --git a/scripts/Makefile b/scripts/Makefile index 72af39a5945c..49ed234656f5 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -11,12 +11,14 @@ hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS) += rustdoc_test_builder hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS) += rustdoc_test_gen -always-$(CONFIG_RUST) += target.json +ifneq ($(or $(CONFIG_X86_64),$(CONFIG_LOONGARCH)),) +always-$(CONFIG_RUST) += target.json filechk_rust_target = $< < include/config/auto.conf $(obj)/target.json: scripts/generate_rust_target include/config/auto.conf FORCE $(call filechk,rust_target) +endif hostprogs += generate_rust_target generate_rust_target-rust := y -- Gitee From 2c9650d7610a0ad88dffdd0507b26b9c2740ea47 Mon Sep 17 00:00:00 2001 From: Jamie Cunliffe Date: Fri, 12 Dec 2025 17:47:18 +0800 Subject: [PATCH 2/3] arm64: rust: Enable Rust support for AArch64 ANBZ: #29354 [ Upstream commit 724a75ac9542fe1f8aaa587da4d3863d8ea292fc ] This commit provides the build flags for Rust for AArch64. The core Rust support already in the kernel does the rest. This enables the PAC ret and BTI options in the Rust build flags to match the options that are used when building C. The Rust samples have been tested with this commit. Signed-off-by: Jamie Cunliffe Acked-by: Will Deacon Tested-by: Dirk Behme Tested-by: Boqun Feng Acked-by: Miguel Ojeda Acked-by: Catalin Marinas Tested-by: Alice Ryhl Tested-by: Fabien Parent Link: https://lore.kernel.org/r/20231020155056.3495121-3-Jamie.Cunliffe@arm.com Signed-off-by: Catalin Marinas Signed-off-by: Jia He --- Documentation/rust/arch-support.rst | 1 + arch/arm64/Kconfig | 1 + arch/arm64/Makefile | 4 ++++ rust/Makefile | 1 + scripts/generate_rust_target.rs | 4 +++- 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Documentation/rust/arch-support.rst b/Documentation/rust/arch-support.rst index b91e9ef4d0c2..01f99003cf04 100644 --- a/Documentation/rust/arch-support.rst +++ b/Documentation/rust/arch-support.rst @@ -15,6 +15,7 @@ support corresponds to ``S`` values in the ``MAINTAINERS`` file. ============ ================ ============================================== Architecture Level of support Constraints ============ ================ ============================================== +``arm64`` Maintained Little Endian only. ``um`` Maintained ``x86_64`` only. ``x86`` Maintained ``x86_64`` only. ============ ================ ============================================== diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 1b281feb7f29..c07479a1d088 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -231,6 +231,7 @@ config ARM64 select HAVE_FUNCTION_ARG_ACCESS_API select MMU_GATHER_RCU_TABLE_FREE select HAVE_RSEQ + select HAVE_RUST if CPU_LITTLE_ENDIAN select HAVE_STACKPROTECTOR select HAVE_SYSCALL_TRACEPOINTS select HAVE_KPROBES diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 302df2d819fa..7b341926247f 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -41,6 +41,8 @@ KBUILD_CFLAGS += -mgeneral-regs-only \ KBUILD_CFLAGS += $(call cc-disable-warning, psabi) KBUILD_AFLAGS += $(compat_vdso) +KBUILD_RUSTFLAGS += --target=aarch64-unknown-none -Ctarget-feature="-neon" + KBUILD_CFLAGS += $(call cc-option,-mabi=lp64) KBUILD_AFLAGS += $(call cc-option,-mabi=lp64) @@ -77,7 +79,9 @@ endif ifeq ($(CONFIG_ARM64_BTI_KERNEL),y) KBUILD_CFLAGS += -mbranch-protection=pac-ret+bti + KBUILD_RUSTFLAGS += -Zbranch-protection=bti,pac-ret else ifeq ($(CONFIG_ARM64_PTR_AUTH_KERNEL),y) + KBUILD_RUSTFLAGS += -Zbranch-protection=pac-ret ifeq ($(CONFIG_CC_HAS_BRANCH_PROT_PAC_RET),y) KBUILD_CFLAGS += -mbranch-protection=pac-ret else diff --git a/rust/Makefile b/rust/Makefile index 313246e085ef..0aba7506909f 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -293,6 +293,7 @@ bindgen_skip_c_flags := -mno-fp-ret-in-387 -mpreferred-stack-boundary=% \ # Derived from `scripts/Makefile.clang`. BINDGEN_TARGET_x86 := x86_64-linux-gnu +BINDGEN_TARGET_arm64 := aarch64-linux-gnu BINDGEN_TARGET := $(BINDGEN_TARGET_$(SRCARCH)) # All warnings are inhibited since GCC builds are very experimental, diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs index 3c6cbe2b278d..ec5ef35dbe52 100644 --- a/scripts/generate_rust_target.rs +++ b/scripts/generate_rust_target.rs @@ -148,7 +148,9 @@ fn main() { let mut ts = TargetSpec::new(); // `llvm-target`s are taken from `scripts/Makefile.clang`. - if cfg.has("X86_64") { + if cfg.has("ARM64") { + panic!("arm64 uses the builtin rustc aarch64-unknown-none target"); + } else if cfg.has("X86_64") { ts.push("arch", "x86_64"); ts.push( "data-layout", -- Gitee From 7b4b30149ccd4eef0291b0bc8aaf74050aeb1771 Mon Sep 17 00:00:00 2001 From: Jia He Date: Thu, 8 Jan 2026 08:20:52 +0000 Subject: [PATCH 3/3] anolis: configs: Enable HAVE_RUST and RUST_IS_AVAILABLE on arm64 ANBZ: #29354 After this, HAVE_RUST is enabled on x86 and arm64. RUST_IS_AVAILABLE is enabled on arm64. Signed-off-by: Jia He --- anolis/configs/L2-OPTIONAL/{x86 => default}/CONFIG_HAVE_RUST | 0 anolis/configs/L2-OPTIONAL/default/CONFIG_RUST_IS_AVAILABLE | 1 + anolis/configs/L2-OPTIONAL/loongarch/CONFIG_HAVE_RUST | 1 + anolis/configs/L2-OPTIONAL/riscv/CONFIG_HAVE_RUST | 1 + anolis/configs/L2-OPTIONAL/sw_64-6b/CONFIG_HAVE_RUST | 1 + anolis/configs/L2-OPTIONAL/sw_64-8a/CONFIG_HAVE_RUST | 1 + 6 files changed, 5 insertions(+) rename anolis/configs/L2-OPTIONAL/{x86 => default}/CONFIG_HAVE_RUST (100%) create mode 100644 anolis/configs/L2-OPTIONAL/default/CONFIG_RUST_IS_AVAILABLE create mode 100644 anolis/configs/L2-OPTIONAL/loongarch/CONFIG_HAVE_RUST create mode 100644 anolis/configs/L2-OPTIONAL/riscv/CONFIG_HAVE_RUST create mode 100644 anolis/configs/L2-OPTIONAL/sw_64-6b/CONFIG_HAVE_RUST create mode 100644 anolis/configs/L2-OPTIONAL/sw_64-8a/CONFIG_HAVE_RUST diff --git a/anolis/configs/L2-OPTIONAL/x86/CONFIG_HAVE_RUST b/anolis/configs/L2-OPTIONAL/default/CONFIG_HAVE_RUST similarity index 100% rename from anolis/configs/L2-OPTIONAL/x86/CONFIG_HAVE_RUST rename to anolis/configs/L2-OPTIONAL/default/CONFIG_HAVE_RUST diff --git a/anolis/configs/L2-OPTIONAL/default/CONFIG_RUST_IS_AVAILABLE b/anolis/configs/L2-OPTIONAL/default/CONFIG_RUST_IS_AVAILABLE new file mode 100644 index 000000000000..b605ab168012 --- /dev/null +++ b/anolis/configs/L2-OPTIONAL/default/CONFIG_RUST_IS_AVAILABLE @@ -0,0 +1 @@ +CONFIG_RUST_IS_AVAILABLE=y diff --git a/anolis/configs/L2-OPTIONAL/loongarch/CONFIG_HAVE_RUST b/anolis/configs/L2-OPTIONAL/loongarch/CONFIG_HAVE_RUST new file mode 100644 index 000000000000..62325bc2894d --- /dev/null +++ b/anolis/configs/L2-OPTIONAL/loongarch/CONFIG_HAVE_RUST @@ -0,0 +1 @@ +# CONFIG_HAVE_RUST is not set diff --git a/anolis/configs/L2-OPTIONAL/riscv/CONFIG_HAVE_RUST b/anolis/configs/L2-OPTIONAL/riscv/CONFIG_HAVE_RUST new file mode 100644 index 000000000000..62325bc2894d --- /dev/null +++ b/anolis/configs/L2-OPTIONAL/riscv/CONFIG_HAVE_RUST @@ -0,0 +1 @@ +# CONFIG_HAVE_RUST is not set diff --git a/anolis/configs/L2-OPTIONAL/sw_64-6b/CONFIG_HAVE_RUST b/anolis/configs/L2-OPTIONAL/sw_64-6b/CONFIG_HAVE_RUST new file mode 100644 index 000000000000..62325bc2894d --- /dev/null +++ b/anolis/configs/L2-OPTIONAL/sw_64-6b/CONFIG_HAVE_RUST @@ -0,0 +1 @@ +# CONFIG_HAVE_RUST is not set diff --git a/anolis/configs/L2-OPTIONAL/sw_64-8a/CONFIG_HAVE_RUST b/anolis/configs/L2-OPTIONAL/sw_64-8a/CONFIG_HAVE_RUST new file mode 100644 index 000000000000..62325bc2894d --- /dev/null +++ b/anolis/configs/L2-OPTIONAL/sw_64-8a/CONFIG_HAVE_RUST @@ -0,0 +1 @@ +# CONFIG_HAVE_RUST is not set -- Gitee