From: Boqun Feng <boqun.feng@gmail.com>
To: Alice Ryhl <aliceryhl@google.com>
Cc: "Steven Rostedt" <rostedt@goodmis.org>,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
"Peter Zijlstra" <peterz@infradead.org>,
"Josh Poimboeuf" <jpoimboe@kernel.org>,
"Jason Baron" <jbaron@akamai.com>,
"Ard Biesheuvel" <ardb@kernel.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Wedson Almeida Filho" <wedsonaf@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <benno.lossin@proton.me>,
"Andreas Hindborg" <a.hindborg@samsung.com>,
linux-trace-kernel@vger.kernel.org,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
"Arnd Bergmann" <arnd@arndb.de>,
linux-arch@vger.kernel.org,
"Thomas Gleixner" <tglx@linutronix.de>,
"Ingo Molnar" <mingo@redhat.com>,
"Borislav Petkov" <bp@alien8.de>,
"Dave Hansen" <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
"Sean Christopherson" <seanjc@google.com>,
"Uros Bizjak" <ubizjak@gmail.com>,
"Catalin Marinas" <catalin.marinas@arm.com>,
"Will Deacon" <will@kernel.org>, "Marc Zyngier" <maz@kernel.org>,
"Oliver Upton" <oliver.upton@linux.dev>,
"Mark Rutland" <mark.rutland@arm.com>,
"Ryan Roberts" <ryan.roberts@arm.com>,
"Fuad Tabba" <tabba@google.com>,
linux-arm-kernel@lists.infradead.org,
"Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Anup Patel" <apatel@ventanamicro.com>,
"Andrew Jones" <ajones@ventanamicro.com>,
"Alexandre Ghiti" <alexghiti@rivosinc.com>,
"Conor Dooley" <conor.dooley@microchip.com>,
"Samuel Holland" <samuel.holland@sifive.com>,
linux-riscv@lists.infradead.org,
"Huacai Chen" <chenhuacai@kernel.org>,
"WANG Xuerui" <kernel@xen0n.name>,
"Bibo Mao" <maobibo@loongson.cn>,
"Tiezhu Yang" <yangtiezhu@loongson.cn>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Tianrui Zhao" <zhaotianrui@loongson.cn>,
loongarch@lists.linux.dev
Subject: Re: [PATCH v7 5/5] rust: add arch_static_branch
Date: Wed, 21 Aug 2024 10:08:16 -0700 [thread overview]
Message-ID: <ZsYfAFrBFVewchGM@boqun-archlinux> (raw)
In-Reply-To: <20240816-tracepoint-v7-5-d609b916b819@google.com>
On Fri, Aug 16, 2024 at 11:07:42AM +0000, Alice Ryhl wrote:
> To allow the Rust implementation of static_key_false to use runtime code
> patching instead of the generic implementation, pull in the relevant
> inline assembly from the jump_label.h header by running the C
> preprocessor on a .rs.S file. Build rules are added for .rs.S files.
>
> Since the relevant inline asm has been adjusted to export the inline asm
> via the ARCH_STATIC_BRANCH_ASM macro in a consistent way, the Rust side
> does not need architecture specific code to pull in the asm.
>
> It is not possible to use the existing C implementation of
> arch_static_branch via a Rust helper because it passes the argument
> `key` to inline assembly as an 'i' parameter. Any attempt to add a C
> helper for this function will fail to compile because the value of `key`
> must be known at compile-time.
>
> Suggested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> Co-developed-by: Miguel Ojeda <ojeda@kernel.org>
> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> ---
> rust/Makefile | 5 ++-
> rust/kernel/.gitignore | 3 ++
> rust/kernel/arch_static_branch_asm.rs.S | 7 ++++
> rust/kernel/jump_label.rs | 64 ++++++++++++++++++++++++++++++++-
> rust/kernel/lib.rs | 30 ++++++++++++++++
> scripts/Makefile.build | 9 ++++-
> 6 files changed, 115 insertions(+), 3 deletions(-)
>
> diff --git a/rust/Makefile b/rust/Makefile
> index 199e0db67962..277fcef656b8 100644
> --- a/rust/Makefile
> +++ b/rust/Makefile
> @@ -14,6 +14,8 @@ CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations
> always-$(CONFIG_RUST) += libmacros.so
> no-clean-files += libmacros.so
>
> +always-$(subst y,$(CONFIG_RUST),$(CONFIG_JUMP_LABEL)) += kernel/arch_static_branch_asm.rs
> +
> always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs
> obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o
> always-$(CONFIG_RUST) += exports_alloc_generated.h exports_bindings_generated.h \
> @@ -409,7 +411,8 @@ $(obj)/uapi.o: $(src)/uapi/lib.rs \
> $(obj)/kernel.o: private rustc_target_flags = --extern alloc \
> --extern build_error --extern macros --extern bindings --extern uapi
> $(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \
> - $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE
> + $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o \
> + $(obj)/kernel/arch_static_branch_asm.rs FORCE
> +$(call if_changed_rule,rustc_library)
>
> endif # CONFIG_RUST
> diff --git a/rust/kernel/.gitignore b/rust/kernel/.gitignore
> new file mode 100644
> index 000000000000..d082731007c6
> --- /dev/null
> +++ b/rust/kernel/.gitignore
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +/arch_static_branch_asm.rs
> diff --git a/rust/kernel/arch_static_branch_asm.rs.S b/rust/kernel/arch_static_branch_asm.rs.S
> new file mode 100644
> index 000000000000..9e373d4f7567
> --- /dev/null
> +++ b/rust/kernel/arch_static_branch_asm.rs.S
> @@ -0,0 +1,7 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <linux/jump_label.h>
> +
> +// Cut here.
> +
> +::kernel::concat_literals!(ARCH_STATIC_BRANCH_ASM("{symb} + {off} + {branch}", "{l_yes}"))
> diff --git a/rust/kernel/jump_label.rs b/rust/kernel/jump_label.rs
> index 011e1fc1d19a..7757e4f8e85e 100644
> --- a/rust/kernel/jump_label.rs
> +++ b/rust/kernel/jump_label.rs
> @@ -23,7 +23,69 @@ macro_rules! static_key_false {
> let _key: *const $keytyp = ::core::ptr::addr_of!($key);
> let _key: *const $crate::bindings::static_key = ::core::ptr::addr_of!((*_key).$field);
>
> - $crate::bindings::static_key_count(_key.cast_mut()) > 0
> + #[cfg(not(CONFIG_JUMP_LABEL))]
> + {
> + $crate::bindings::static_key_count(_key.cast_mut()) > 0
> + }
> +
> + #[cfg(CONFIG_JUMP_LABEL)]
> + $crate::jump_label::arch_static_branch! { $key, $keytyp, $field, false }
> }};
> }
> pub use static_key_false;
> +
> +/// Assert that the assembly block evaluates to a string literal.
> +#[cfg(CONFIG_JUMP_LABEL)]
> +const _: &str = include!("arch_static_branch_asm.rs");
Have you try this with "make O=<dir>"? I hit the following issue, but I
am rebasing on rust-dev, so I might miss something:
error: couldn't read ../rust/kernel/arch_static_branch_asm.rs: No such file or directory (os error 2)
--> ../rust/kernel/jump_label.rs:39:17
|
39 | const _: &str = include!("arch_static_branch_asm.rs");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in the macro `include` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 1 previous error
Regards,
Boqun
> +
> +#[macro_export]
> +#[doc(hidden)]
> +#[cfg(CONFIG_JUMP_LABEL)]
> +#[cfg(not(CONFIG_HAVE_JUMP_LABEL_HACK))]
> +macro_rules! arch_static_branch {
> + ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
> + $crate::asm!(
> + include!(concat!(env!("SRCTREE"), "/rust/kernel/arch_static_branch_asm.rs"));
> + l_yes = label {
> + break 'my_label true;
> + },
> + symb = sym $key,
> + off = const ::core::mem::offset_of!($keytyp, $field),
> + branch = const $crate::jump_label::bool_to_int($branch),
> + );
> +
> + break 'my_label false;
> + }};
> +}
> +
> +#[macro_export]
> +#[doc(hidden)]
> +#[cfg(CONFIG_JUMP_LABEL)]
> +#[cfg(CONFIG_HAVE_JUMP_LABEL_HACK)]
> +macro_rules! arch_static_branch {
> + ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
> + $crate::asm!(
> + include!(concat!(env!("SRCTREE"), "/rust/kernel/arch_static_branch_asm.rs"));
> + l_yes = label {
> + break 'my_label true;
> + },
> + symb = sym $key,
> + off = const ::core::mem::offset_of!($keytyp, $field),
> + branch = const 2 | $crate::jump_label::bool_to_int($branch),
> + );
> +
> + break 'my_label false;
> + }};
> +}
> +
> +#[cfg(CONFIG_JUMP_LABEL)]
> +pub use arch_static_branch;
> +
> +/// A helper used by inline assembly to pass a boolean to as a `const` parameter.
> +///
> +/// Using this function instead of a cast lets you assert that the input is a boolean, and not some
> +/// other type that can also be cast to an integer.
> +#[doc(hidden)]
> +pub const fn bool_to_int(b: bool) -> i32 {
> + b as i32
> +}
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index d00a44b000b6..9e9b95ab6966 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -145,3 +145,33 @@ macro_rules! container_of {
> ptr.sub(offset) as *const $type
> }}
> }
> +
> +/// Helper for `.rs.S` files.
> +#[doc(hidden)]
> +#[macro_export]
> +macro_rules! concat_literals {
> + ($( $asm:literal )* ) => {
> + ::core::concat!($($asm),*)
> + };
> +}
> +
> +/// Wrapper around `asm!` that uses at&t syntax on x86.
> +// Uses a semicolon to avoid parsing ambiguities, even though this does not match native `asm!`
> +// syntax.
> +#[cfg(target_arch = "x86_64")]
> +#[macro_export]
> +macro_rules! asm {
> + ($($asm:expr),* ; $($rest:tt)*) => {
> + ::core::arch::asm!( $($asm)*, options(att_syntax), $($rest)* )
> + };
> +}
> +
> +/// Wrapper around `asm!` that uses at&t syntax on x86.
> +// For non-x86 arches we just pass through to `asm!`.
> +#[cfg(not(target_arch = "x86_64"))]
> +#[macro_export]
> +macro_rules! asm {
> + ($($asm:expr),* ; $($rest:tt)*) => {
> + ::core::arch::asm!( $($asm)*, $($rest)* )
> + };
> +}
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index 72b1232b1f7d..59fe83fba647 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -263,12 +263,13 @@ $(obj)/%.lst: $(obj)/%.c FORCE
> # Compile Rust sources (.rs)
> # ---------------------------------------------------------------------------
>
> -rust_allowed_features := new_uninit
> +rust_allowed_features := asm_const,asm_goto,new_uninit
>
> # `--out-dir` is required to avoid temporaries being created by `rustc` in the
> # current working directory, which may be not accessible in the out-of-tree
> # modules case.
> rust_common_cmd = \
> + SRCTREE=$(abspath $(srctree)) \
> RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \
> -Zallow-features=$(rust_allowed_features) \
> -Zcrate-attr=no_std \
> @@ -318,6 +319,12 @@ quiet_cmd_rustc_ll_rs = $(RUSTC_OR_CLIPPY_QUIET) $(quiet_modtag) $@
> $(obj)/%.ll: $(obj)/%.rs FORCE
> +$(call if_changed_dep,rustc_ll_rs)
>
> +quiet_cmd_rustc_rs_rs_S = RSCPP $(quiet_modtag) $@
> + cmd_rustc_rs_rs_S = $(CPP) $(c_flags) -xc -C -P $< | sed '1,/^\/\/ Cut here.$$/d' >$@
> +
> +$(obj)/%.rs: $(obj)/%.rs.S FORCE
> + +$(call if_changed_dep,rustc_rs_rs_S)
> +
> # Compile assembler sources (.S)
> # ---------------------------------------------------------------------------
>
>
> --
> 2.46.0.184.g6999bdac58-goog
>
WARNING: multiple messages have this Message-ID (diff)
From: Boqun Feng <boqun.feng@gmail.com>
To: Alice Ryhl <aliceryhl@google.com>
Cc: "Steven Rostedt" <rostedt@goodmis.org>,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
"Peter Zijlstra" <peterz@infradead.org>,
"Josh Poimboeuf" <jpoimboe@kernel.org>,
"Jason Baron" <jbaron@akamai.com>,
"Ard Biesheuvel" <ardb@kernel.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Wedson Almeida Filho" <wedsonaf@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <benno.lossin@proton.me>,
"Andreas Hindborg" <a.hindborg@samsung.com>,
linux-trace-kernel@vger.kernel.org,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
"Arnd Bergmann" <arnd@arndb.de>,
linux-arch@vger.kernel.org,
"Thomas Gleixner" <tglx@linutronix.de>,
"Ingo Molnar" <mingo@redhat.com>,
"Borislav Petkov" <bp@alien8.de>,
"Dave Hansen" <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
"Sean Christopherson" <seanjc@google.com>,
"Uros Bizjak" <ubizjak@gmail.com>,
"Catalin Marinas" <catalin.marinas@arm.com>,
"Will Deacon" <will@kernel.org>, "Marc Zyngier" <maz@kernel.org>,
"Oliver Upton" <oliver.upton@linux.dev>,
"Mark Rutland" <mark.rutland@arm.com>,
"Ryan Roberts" <ryan.roberts@arm.com>,
"Fuad Tabba" <tabba@google.com>,
linux-arm-kernel@lists.infradead.org,
"Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Anup Patel" <apatel@ventanamicro.com>,
"Andrew Jones" <ajones@ventanamicro.com>,
"Alexandre Ghiti" <alexghiti@rivosinc.com>,
"Conor Dooley" <conor.dooley@microchip.com>,
"Samuel Holland" <samuel.holland@sifive.com>,
linux-riscv@lists.infradead.org,
"Huacai Chen" <chenhuacai@kernel.org>,
"WANG Xuerui" <kernel@xen0n.name>,
"Bibo Mao" <maobibo@loongson.cn>,
"Tiezhu Yang" <yangtiezhu@loongson.cn>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Tianrui Zhao" <zhaotianrui@loongson.cn>,
loongarch@lists.linux.dev
Subject: Re: [PATCH v7 5/5] rust: add arch_static_branch
Date: Wed, 21 Aug 2024 10:08:16 -0700 [thread overview]
Message-ID: <ZsYfAFrBFVewchGM@boqun-archlinux> (raw)
In-Reply-To: <20240816-tracepoint-v7-5-d609b916b819@google.com>
On Fri, Aug 16, 2024 at 11:07:42AM +0000, Alice Ryhl wrote:
> To allow the Rust implementation of static_key_false to use runtime code
> patching instead of the generic implementation, pull in the relevant
> inline assembly from the jump_label.h header by running the C
> preprocessor on a .rs.S file. Build rules are added for .rs.S files.
>
> Since the relevant inline asm has been adjusted to export the inline asm
> via the ARCH_STATIC_BRANCH_ASM macro in a consistent way, the Rust side
> does not need architecture specific code to pull in the asm.
>
> It is not possible to use the existing C implementation of
> arch_static_branch via a Rust helper because it passes the argument
> `key` to inline assembly as an 'i' parameter. Any attempt to add a C
> helper for this function will fail to compile because the value of `key`
> must be known at compile-time.
>
> Suggested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> Co-developed-by: Miguel Ojeda <ojeda@kernel.org>
> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> ---
> rust/Makefile | 5 ++-
> rust/kernel/.gitignore | 3 ++
> rust/kernel/arch_static_branch_asm.rs.S | 7 ++++
> rust/kernel/jump_label.rs | 64 ++++++++++++++++++++++++++++++++-
> rust/kernel/lib.rs | 30 ++++++++++++++++
> scripts/Makefile.build | 9 ++++-
> 6 files changed, 115 insertions(+), 3 deletions(-)
>
> diff --git a/rust/Makefile b/rust/Makefile
> index 199e0db67962..277fcef656b8 100644
> --- a/rust/Makefile
> +++ b/rust/Makefile
> @@ -14,6 +14,8 @@ CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations
> always-$(CONFIG_RUST) += libmacros.so
> no-clean-files += libmacros.so
>
> +always-$(subst y,$(CONFIG_RUST),$(CONFIG_JUMP_LABEL)) += kernel/arch_static_branch_asm.rs
> +
> always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs
> obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o
> always-$(CONFIG_RUST) += exports_alloc_generated.h exports_bindings_generated.h \
> @@ -409,7 +411,8 @@ $(obj)/uapi.o: $(src)/uapi/lib.rs \
> $(obj)/kernel.o: private rustc_target_flags = --extern alloc \
> --extern build_error --extern macros --extern bindings --extern uapi
> $(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \
> - $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE
> + $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o \
> + $(obj)/kernel/arch_static_branch_asm.rs FORCE
> +$(call if_changed_rule,rustc_library)
>
> endif # CONFIG_RUST
> diff --git a/rust/kernel/.gitignore b/rust/kernel/.gitignore
> new file mode 100644
> index 000000000000..d082731007c6
> --- /dev/null
> +++ b/rust/kernel/.gitignore
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +/arch_static_branch_asm.rs
> diff --git a/rust/kernel/arch_static_branch_asm.rs.S b/rust/kernel/arch_static_branch_asm.rs.S
> new file mode 100644
> index 000000000000..9e373d4f7567
> --- /dev/null
> +++ b/rust/kernel/arch_static_branch_asm.rs.S
> @@ -0,0 +1,7 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <linux/jump_label.h>
> +
> +// Cut here.
> +
> +::kernel::concat_literals!(ARCH_STATIC_BRANCH_ASM("{symb} + {off} + {branch}", "{l_yes}"))
> diff --git a/rust/kernel/jump_label.rs b/rust/kernel/jump_label.rs
> index 011e1fc1d19a..7757e4f8e85e 100644
> --- a/rust/kernel/jump_label.rs
> +++ b/rust/kernel/jump_label.rs
> @@ -23,7 +23,69 @@ macro_rules! static_key_false {
> let _key: *const $keytyp = ::core::ptr::addr_of!($key);
> let _key: *const $crate::bindings::static_key = ::core::ptr::addr_of!((*_key).$field);
>
> - $crate::bindings::static_key_count(_key.cast_mut()) > 0
> + #[cfg(not(CONFIG_JUMP_LABEL))]
> + {
> + $crate::bindings::static_key_count(_key.cast_mut()) > 0
> + }
> +
> + #[cfg(CONFIG_JUMP_LABEL)]
> + $crate::jump_label::arch_static_branch! { $key, $keytyp, $field, false }
> }};
> }
> pub use static_key_false;
> +
> +/// Assert that the assembly block evaluates to a string literal.
> +#[cfg(CONFIG_JUMP_LABEL)]
> +const _: &str = include!("arch_static_branch_asm.rs");
Have you try this with "make O=<dir>"? I hit the following issue, but I
am rebasing on rust-dev, so I might miss something:
error: couldn't read ../rust/kernel/arch_static_branch_asm.rs: No such file or directory (os error 2)
--> ../rust/kernel/jump_label.rs:39:17
|
39 | const _: &str = include!("arch_static_branch_asm.rs");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in the macro `include` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 1 previous error
Regards,
Boqun
> +
> +#[macro_export]
> +#[doc(hidden)]
> +#[cfg(CONFIG_JUMP_LABEL)]
> +#[cfg(not(CONFIG_HAVE_JUMP_LABEL_HACK))]
> +macro_rules! arch_static_branch {
> + ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
> + $crate::asm!(
> + include!(concat!(env!("SRCTREE"), "/rust/kernel/arch_static_branch_asm.rs"));
> + l_yes = label {
> + break 'my_label true;
> + },
> + symb = sym $key,
> + off = const ::core::mem::offset_of!($keytyp, $field),
> + branch = const $crate::jump_label::bool_to_int($branch),
> + );
> +
> + break 'my_label false;
> + }};
> +}
> +
> +#[macro_export]
> +#[doc(hidden)]
> +#[cfg(CONFIG_JUMP_LABEL)]
> +#[cfg(CONFIG_HAVE_JUMP_LABEL_HACK)]
> +macro_rules! arch_static_branch {
> + ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
> + $crate::asm!(
> + include!(concat!(env!("SRCTREE"), "/rust/kernel/arch_static_branch_asm.rs"));
> + l_yes = label {
> + break 'my_label true;
> + },
> + symb = sym $key,
> + off = const ::core::mem::offset_of!($keytyp, $field),
> + branch = const 2 | $crate::jump_label::bool_to_int($branch),
> + );
> +
> + break 'my_label false;
> + }};
> +}
> +
> +#[cfg(CONFIG_JUMP_LABEL)]
> +pub use arch_static_branch;
> +
> +/// A helper used by inline assembly to pass a boolean to as a `const` parameter.
> +///
> +/// Using this function instead of a cast lets you assert that the input is a boolean, and not some
> +/// other type that can also be cast to an integer.
> +#[doc(hidden)]
> +pub const fn bool_to_int(b: bool) -> i32 {
> + b as i32
> +}
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index d00a44b000b6..9e9b95ab6966 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -145,3 +145,33 @@ macro_rules! container_of {
> ptr.sub(offset) as *const $type
> }}
> }
> +
> +/// Helper for `.rs.S` files.
> +#[doc(hidden)]
> +#[macro_export]
> +macro_rules! concat_literals {
> + ($( $asm:literal )* ) => {
> + ::core::concat!($($asm),*)
> + };
> +}
> +
> +/// Wrapper around `asm!` that uses at&t syntax on x86.
> +// Uses a semicolon to avoid parsing ambiguities, even though this does not match native `asm!`
> +// syntax.
> +#[cfg(target_arch = "x86_64")]
> +#[macro_export]
> +macro_rules! asm {
> + ($($asm:expr),* ; $($rest:tt)*) => {
> + ::core::arch::asm!( $($asm)*, options(att_syntax), $($rest)* )
> + };
> +}
> +
> +/// Wrapper around `asm!` that uses at&t syntax on x86.
> +// For non-x86 arches we just pass through to `asm!`.
> +#[cfg(not(target_arch = "x86_64"))]
> +#[macro_export]
> +macro_rules! asm {
> + ($($asm:expr),* ; $($rest:tt)*) => {
> + ::core::arch::asm!( $($asm)*, $($rest)* )
> + };
> +}
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index 72b1232b1f7d..59fe83fba647 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -263,12 +263,13 @@ $(obj)/%.lst: $(obj)/%.c FORCE
> # Compile Rust sources (.rs)
> # ---------------------------------------------------------------------------
>
> -rust_allowed_features := new_uninit
> +rust_allowed_features := asm_const,asm_goto,new_uninit
>
> # `--out-dir` is required to avoid temporaries being created by `rustc` in the
> # current working directory, which may be not accessible in the out-of-tree
> # modules case.
> rust_common_cmd = \
> + SRCTREE=$(abspath $(srctree)) \
> RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \
> -Zallow-features=$(rust_allowed_features) \
> -Zcrate-attr=no_std \
> @@ -318,6 +319,12 @@ quiet_cmd_rustc_ll_rs = $(RUSTC_OR_CLIPPY_QUIET) $(quiet_modtag) $@
> $(obj)/%.ll: $(obj)/%.rs FORCE
> +$(call if_changed_dep,rustc_ll_rs)
>
> +quiet_cmd_rustc_rs_rs_S = RSCPP $(quiet_modtag) $@
> + cmd_rustc_rs_rs_S = $(CPP) $(c_flags) -xc -C -P $< | sed '1,/^\/\/ Cut here.$$/d' >$@
> +
> +$(obj)/%.rs: $(obj)/%.rs.S FORCE
> + +$(call if_changed_dep,rustc_rs_rs_S)
> +
> # Compile assembler sources (.S)
> # ---------------------------------------------------------------------------
>
>
> --
> 2.46.0.184.g6999bdac58-goog
>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2024-08-21 17:08 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-16 11:07 [PATCH v7 0/5] Tracepoints and static branch in Rust Alice Ryhl
2024-08-16 11:07 ` Alice Ryhl
2024-08-16 11:07 ` [PATCH v7 1/5] rust: add generic static_key_false Alice Ryhl
2024-08-16 11:07 ` Alice Ryhl
2024-08-16 11:07 ` [PATCH v7 2/5] rust: add tracepoint support Alice Ryhl
2024-08-16 11:07 ` Alice Ryhl
2024-08-16 11:07 ` [PATCH v7 3/5] rust: samples: add tracepoint to Rust sample Alice Ryhl
2024-08-16 11:07 ` Alice Ryhl
2024-08-16 11:07 ` [PATCH v7 4/5] jump_label: adjust inline asm to be consistent Alice Ryhl
2024-08-16 11:07 ` Alice Ryhl
2024-08-16 11:07 ` [PATCH v7 5/5] rust: add arch_static_branch Alice Ryhl
2024-08-16 11:07 ` Alice Ryhl
2024-08-21 17:08 ` Boqun Feng [this message]
2024-08-21 17:08 ` Boqun Feng
2024-08-21 17:54 ` Miguel Ojeda
2024-08-21 17:54 ` Miguel Ojeda
2024-08-21 18:16 ` Boqun Feng
2024-08-21 18:16 ` Boqun Feng
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=ZsYfAFrBFVewchGM@boqun-archlinux \
--to=boqun.feng@gmail.com \
--cc=a.hindborg@samsung.com \
--cc=ajones@ventanamicro.com \
--cc=akpm@linux-foundation.org \
--cc=alex.gaynor@gmail.com \
--cc=alexghiti@rivosinc.com \
--cc=aliceryhl@google.com \
--cc=aou@eecs.berkeley.edu \
--cc=apatel@ventanamicro.com \
--cc=ardb@kernel.org \
--cc=arnd@arndb.de \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=bp@alien8.de \
--cc=catalin.marinas@arm.com \
--cc=chenhuacai@kernel.org \
--cc=conor.dooley@microchip.com \
--cc=dave.hansen@linux.intel.com \
--cc=gary@garyguo.net \
--cc=hpa@zytor.com \
--cc=jbaron@akamai.com \
--cc=jpoimboe@kernel.org \
--cc=kernel@xen0n.name \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=loongarch@lists.linux.dev \
--cc=maobibo@loongson.cn \
--cc=mark.rutland@arm.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=maz@kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=ojeda@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=ryan.roberts@arm.com \
--cc=samuel.holland@sifive.com \
--cc=seanjc@google.com \
--cc=tabba@google.com \
--cc=tglx@linutronix.de \
--cc=ubizjak@gmail.com \
--cc=wedsonaf@gmail.com \
--cc=will@kernel.org \
--cc=x86@kernel.org \
--cc=yangtiezhu@loongson.cn \
--cc=zhaotianrui@loongson.cn \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.