diff --git a/Documentation/rust/arch-support.rst b/Documentation/rust/arch-support.rst index b91e9ef4d0c21e45a4beb27eb8ac9f32a4d6669a..01f99003cf04c1eaa4791f3825dc14d1a9b8cd92 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/Makefile b/Makefile index 00331d58358f65d4061cbd71d673898690b46925..6c5b5a5c88b709fcc6f01713a0f84b2d30850100 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/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 0000000000000000000000000000000000000000..b605ab168012a542e7d69840644b94d5f25512e8 --- /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 0000000000000000000000000000000000000000..62325bc2894da9db23bdf967e7a84a0d9602f2dd --- /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 0000000000000000000000000000000000000000..62325bc2894da9db23bdf967e7a84a0d9602f2dd --- /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 0000000000000000000000000000000000000000..62325bc2894da9db23bdf967e7a84a0d9602f2dd --- /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 0000000000000000000000000000000000000000..62325bc2894da9db23bdf967e7a84a0d9602f2dd --- /dev/null +++ b/anolis/configs/L2-OPTIONAL/sw_64-8a/CONFIG_HAVE_RUST @@ -0,0 +1 @@ +# CONFIG_HAVE_RUST is not set diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 1b281feb7f2954f93830d158cf2f71e90de887b9..c07479a1d088b61283cd0660fbc46eeb1d7a9ac6 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 302df2d819faec09eb696215746d5062993157d4..7b341926247f453a2f8cddb00c96fecf801f4940 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/arch/loongarch/Makefile b/arch/loongarch/Makefile index 1cad527d635ea2d4f683a56192f414a59880a96a..45be66d669375f97dc6824ef9fd2f28088bff4a5 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 6d593fb85a9e936c8795cc76d2b5da2a2178e9e6..e78be0dcd460fe5c188ea72e1f0a7ce63700bb6d 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 333b9a482473d688b6c9f737cd6a2fdc94efb38f..0aba7506909fef1bb71805550c05a665b5a5e67f 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, @@ -425,8 +426,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 72af39a5945c555ebd7fb8d3422e8bba95c6e5c1..49ed234656f534cd8757fbdb240454faa91dfb82 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 diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs index 3c6cbe2b278d302ebd6375e900dbe4875765805f..ec5ef35dbe52dbe9b77ada8abb9ecb5d15a8a2cb 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",