On Fri, Jun 28, 2024 at 01:23:31PM +0000, Alice Ryhl wrote:
rust/kernel/arch/arm64/jump_label.rs | 34 ++++++++++++++++++++++++++++
rust/kernel/arch/loongarch/jump_label.rs | 35 +++++++++++++++++++++++++++++
rust/kernel/arch/mod.rs | 24 ++++++++++++++++++++
rust/kernel/arch/riscv/jump_label.rs | 38 ++++++++++++++++++++++++++++++++
rust/kernel/arch/x86/jump_label.rs | 35 +++++++++++++++++++++++++++++
rust/kernel/lib.rs | 2 ++
rust/kernel/static_key.rs | 32 +++++++++++++++++++++++++++
scripts/Makefile.build | 2 +-
8 files changed, 201 insertions(+), 1 deletion(-)
So I really find the amount of duplicated asm offensive. Is is far too
easy for any of this to get out of sync.
quoted hunk ↗ jump to hunk
diff --git a/rust/kernel/arch/x86/jump_label.rs b/rust/kernel/arch/x86/jump_label.rs
new file mode 100644
index 000000000000..383bed273c50
--- /dev/null
+++ b/rust/kernel/arch/x86/jump_label.rs
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0
+
+// Copyright (C) 2024 Google LLC.
+
+//! X86 Rust implementation of jump_label.h
+
+/// x86 implementation of arch_static_branch
+#[macro_export]
+#[cfg(target_arch = "x86_64")]
+macro_rules! arch_static_branch {
+ ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: {
+ core::arch::asm!(
+ r#"
+ 1: .byte 0x0f,0x1f,0x44,0x00,0x00
+
+ .pushsection __jump_table, "aw"
+ .balign 8
+ .long 1b - .
+ .long {0} - .
+ .quad {1} + {2} + {3} - .
+ .popsection
+ "#,
+ label {
+ break 'my_label true;
+ },
+ sym $key,
+ const ::core::mem::offset_of!($keytyp, $field),
+ const $crate::arch::bool_to_int($branch),
+ );
+
+ break 'my_label false;
+ }};
+}
Note that this uses the forced 5 byte version, and not the dynamic sized
one. On top of that it hard-codes the nop5 string :/
Please work harder to not have to duplicate stuff like this.
NAK.