From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E1C6AC3DA61 for ; Mon, 29 Jul 2024 09:58:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:In-Reply-To:References:Cc:To:From:Subject:MIME-Version:Date: Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=s0C7vN/0GQE6CVzJx8SRnXrV4ZQXWzrPWijllSXnWlg=; b=Bpf7ag49QJqKgcnt6nyAQRKLoT A07rsZ+yw4vay91e9H2TCqbVSg7MEqwoiK8G6ZIBZJgKQ7Wi0d8U+f2c2Ly7dulvTFq4+bAPsoPVJ iTuWiG0oUOAHlB15WQqYbofryRxRKsGDPiVcpyAusg5G3LYJm5+nZB62w7K+pgNzxpIz8mj70Zha5 9ij0nxwqwEFOmbvI60ocXATcjovYffRzdMl2o/XkObUTcSCZhzErmWdMBpwRMlaQldsrDPORRxhK/ fePGmQsdSDobidW4EujR2QwlKMX6ctpGQceW0VJGuN7TXRL/KuSse1mGpxVctrxaiGizraCPQDkJd YjP/bZKA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sYN9S-0000000AoD5-3HFH; Mon, 29 Jul 2024 09:58:46 +0000 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sYN91-0000000Ao2I-0yN0 for linux-arm-kernel@lists.infradead.org; Mon, 29 Jul 2024 09:58:20 +0000 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-5a2ffc34677so5241992a12.2 for ; Mon, 29 Jul 2024 02:58:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722247097; x=1722851897; darn=lists.infradead.org; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:from:subject:user-agent:mime-version:date:message-id:from:to :cc:subject:date:message-id:reply-to; bh=s0C7vN/0GQE6CVzJx8SRnXrV4ZQXWzrPWijllSXnWlg=; b=dJlbZpIR3Yk1ybxMsOS2j11EN9GJFo3UQbwbGTUcHWVnbrKKEafgyQH0It4pt7L+/h hAo+7Fyq81aJiQXCkDvUlBQ7erBAKS++gEvYUj9acW1kTg99SsFck4zWTFTHZhDfhga/ z+3qzzg6+isBc0C75Nb7BHZsNip6v3rgwyy0fMa/Lb7N3et61xtPM31zTrRNLN7oBLj0 Ks2JOz0zioga9fy0JQzXnxY3yQN5Vggij+U21FpIaydYxCUsL61q/GUeRFN2jSO6BlM6 aAY9sb/1jaSR8UIkBYCodHfz9//B9xO/M9eEBDdoQhglSD6sM0FxLOF8ODejvR5NN59d L3eA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722247097; x=1722851897; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:from:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=s0C7vN/0GQE6CVzJx8SRnXrV4ZQXWzrPWijllSXnWlg=; b=grjmOLHr80UkOOKRXH+sATb2hbZ1fffaBQpsDK0QmRBBDdbNVytzD5UFR5rMw4I1oF DWet0kTEQwJ8gMB0aIsY7ZMKOP+ZX8F3/7JD1EDP0FAyRkziNnMQ6FBmBvwDSlCVtzrH ZpxtPADnH/oOWWGzRpg1ymDPkn5IqDK3Wiiqybrzf0yyZNDJYD145BFPtK/H8jkOf+b6 NSc66qFk4f5VbMhQfbKq+DKObuvVvJgMJ1mp9QVtwPsYXO9PHFMLjsbmkHddG733O6pz eAceWWTfOEiLpc8zc7zIGrAGZJ+FLZDFSFDtXUIziiKWDL4+Svr7HtNKhFZ/f3xelEjk Ou7Q== X-Forwarded-Encrypted: i=1; AJvYcCXIDAsCIYmC2b5ZSyUNzH+kCXiamN3bENHkuLiABYK12QnXY4n5OfFDmxVMqHEqRgv9ikZ1MLhMFpRaOZYxey1A/urOx6AFsF8R7dfUkvo5LUv4CLM= X-Gm-Message-State: AOJu0Yx6wH65baHa2qkLZKxY4Osuh2r/Sv/eQtVHqxX5Wo+fKT67qr2j VevU0lmA+SCRrFNm+sib4H0tJj8FugPxRLxmVjTTMajZzLxriWw+ X-Google-Smtp-Source: AGHT+IGgKmfThrWFbCPtIXIL7Y46QvI/M2HNG0lq/TnBLEYMgdEIIiGGiu9+y4y5DeOHudisyXKBUQ== X-Received: by 2002:a05:6402:5190:b0:5aa:32bb:161 with SMTP id 4fb4d7f45d1cf-5b021f0c55cmr5465600a12.22.1722247096558; Mon, 29 Jul 2024 02:58:16 -0700 (PDT) Received: from ?IPV6:2001:871:22a:50e2::2000? ([2001:871:22a:50e2::2000]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5ac631b044csm5520143a12.19.2024.07.29.02.58.15 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 29 Jul 2024 02:58:16 -0700 (PDT) Message-ID: Date: Mon, 29 Jul 2024 11:58:14 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2] arm: rust: Enable Rust support for ARMv7 From: Christian Schrefl To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Jamie Cunliffe , Sven Van Asbroeck , Geert Stappers , Andrew Lunn References: <2dbd1491-149d-443c-9802-75786a6a3b73@gmail.com> Content-Language: en-US In-Reply-To: <2dbd1491-149d-443c-9802-75786a6a3b73@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240729_025819_314701_446AEC47 X-CRM114-Status: GOOD ( 33.49 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Greetings, Friendly Ping :) This has been on the mailing list for quite some time with only a few responses. Please let me know if something is needed from my side (like rebasing or wanted changes). Cheers Christian On 17.06.24 6:03 PM, Christian Schrefl wrote: > This commit allows building ARMv7 kernels with Rust support. > > The rust core library expects some __eabi_... functions > that are not implemented in the kernel. > Those functions are some float operations and __aeabi_uldivmod. > For now those are implemented with define_panicking_intrinsics!. > > This is based on the code by Sven Van Asbroeck from the original > rust branch and inspired by the AArch64 version by Jamie Cunliffe. > > I have tested the rust samples and a custom simple MMIO module > on hardware (De1SoC FPGA + Arm A9 CPU). > > This only includes support for ARMv7, but supporting other > sub-architectures in the future should be as simple as setting > the correct rustc target. > > Signed-off-by: Christian Schrefl > --- > Changes since V1 [1]: > - Removed unrelated whitespace change. > - Added target name to panic message in scripts/generate_rust_target.rs. > - Fixed the comment in rust/bindgen_parameters. > > > [1]: https://lore.kernel.org/rust-for-linux/4e0f5932-c7bc-4878-862c-1186cbecd71d@gmail.com > -- > Documentation/rust/arch-support.rst | 1 + > arch/arm/Kconfig | 1 + > arch/arm/Makefile | 1 + > rust/Makefile | 8 ++++++++ > rust/bindgen_parameters | 4 ++++ > rust/compiler_builtins.rs | 24 ++++++++++++++++++++++++ > scripts/generate_rust_target.rs | 4 +++- > 7 files changed, 42 insertions(+), 1 deletion(-) > > diff --git a/Documentation/rust/arch-support.rst b/Documentation/rust/arch-support.rst > index b13e19d84744..4bf5205f526d 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 > ============= ================ ============================================== > +``arm`` Maintained ARMv7 Little Endian only. > ``arm64`` Maintained Little Endian only. > ``loongarch`` Maintained \- > ``riscv`` Maintained ``riscv64`` only. > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index ee5115252aac..f07149fe078b 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -126,6 +126,7 @@ config ARM > select MMU_GATHER_RCU_TABLE_FREE if SMP && ARM_LPAE > select HAVE_REGS_AND_STACK_ACCESS_API > select HAVE_RSEQ > + select HAVE_RUST if CPU_LITTLE_ENDIAN && CPU_32v7 > select HAVE_STACKPROTECTOR > select HAVE_SYSCALL_TRACEPOINTS > select HAVE_UID16 > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index 71afdd98ddf2..9cc10e32e8be 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -150,6 +150,7 @@ endif > KBUILD_CPPFLAGS +=$(cpp-y) > KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm > KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) -Wa,$(arch-y) $(tune-y) -include asm/unified.h -msoft-float > +KBUILD_RUSTFLAGS += --target=arm-unknown-linux-gnueabi > > CHECKFLAGS += -D__arm__ > > diff --git a/rust/Makefile b/rust/Makefile > index f70d5e244fee..8214a6f378e3 100644 > --- a/rust/Makefile > +++ b/rust/Makefile > @@ -287,6 +287,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_arm := arm-linux-gnueabi > BINDGEN_TARGET := $(BINDGEN_TARGET_$(SRCARCH)) > > # All warnings are inhibited since GCC builds are very experimental, > @@ -413,6 +414,13 @@ redirect-intrinsics = \ > __muloti4 __multi3 \ > __udivmodti4 __udivti3 __umodti3 > > +ifdef CONFIG_ARM > + # Add eabi initrinsics for ARM 32-bit > + redirect-intrinsics += \ > + __aeabi_fadd __aeabi_fmul __aeabi_fcmpeq __aeabi_fcmple __aeabi_fcmplt __aeabi_fcmpun \ > + __aeabi_dadd __aeabi_dmul __aeabi_dcmple __aeabi_dcmplt __aeabi_dcmpun \ > + __aeabi_uldivmod > +endif > ifneq ($(or $(CONFIG_ARM64),$(and $(CONFIG_RISCV),$(CONFIG_64BIT))),) > # These intrinsics are defined for ARM64 and RISCV64 > redirect-intrinsics += \ > diff --git a/rust/bindgen_parameters b/rust/bindgen_parameters > index a721d466bee4..83f28ae4bb2b 100644 > --- a/rust/bindgen_parameters > +++ b/rust/bindgen_parameters > @@ -24,3 +24,7 @@ > # These functions use the `__preserve_most` calling convention, which neither bindgen > # nor Rust currently understand, and which Clang currently declares to be unstable. > --blocklist-function __list_.*_report > + > +# Depending on how the architecture defines `ARCH_SLAB_MINALIGN`, `bindgen` might generate a binding. > +# Disable this here as there is a `const` item that will always be generated in `bindings_helper.h` > +--blocklist-item ARCH_SLAB_MINALIGN > diff --git a/rust/compiler_builtins.rs b/rust/compiler_builtins.rs > index bba2922c6ef7..c37142b16a45 100644 > --- a/rust/compiler_builtins.rs > +++ b/rust/compiler_builtins.rs > @@ -70,5 +70,29 @@ pub extern "C" fn $ident() { > __umodti3, > }); > > +#[cfg(target_arch = "arm")] > +define_panicking_intrinsics!("`f32` should not be used", { > + __aeabi_fadd, > + __aeabi_fmul, > + __aeabi_fcmpeq, > + __aeabi_fcmple, > + __aeabi_fcmplt, > + __aeabi_fcmpun, > +}); > + > +#[cfg(target_arch = "arm")] > +define_panicking_intrinsics!("`f64` should not be used", { > + __aeabi_dadd, > + __aeabi_dmul, > + __aeabi_dcmple, > + __aeabi_dcmplt, > + __aeabi_dcmpun, > +}); > + > +#[cfg(target_arch = "arm")] > +define_panicking_intrinsics!("`u64` division/modulo should not be used", { > + __aeabi_uldivmod, > +}); > + > // NOTE: if you are adding a new intrinsic here, you should also add it to > // `redirect-intrinsics` in `rust/Makefile`. > diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs > index 641b713a033a..c3a6058fdf30 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("ARM64") { > + if cfg.has("ARM") { > + panic!("arm uses the builtin rustc arm-unknown-linux-gnueabi target"); > + } else if cfg.has("ARM64") { > panic!("arm64 uses the builtin rustc aarch64-unknown-none target"); > } else if cfg.has("RISCV") { > if cfg.has("64BIT") { > > base-commit: 1613e604df0cd359cf2a7fbd9be7a0bcfacfabd0