On Fri, Oct 11, 2024 at 10:13:38AM +0000, Alice Ryhl wrote: > +#[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!("OBJTREE"), "/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!("OBJTREE"), "/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; > + }}; Ouch... could we get rid of all this duplication by containing the hack bit to ARCH_STATIC_BRANCH_ASM() like so? diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h index ffd0d1a1a4af..3f1c1d6c0da1 100644 --- a/arch/x86/include/asm/jump_label.h +++ b/arch/x86/include/asm/jump_label.h @@ -24,7 +24,7 @@ #ifdef CONFIG_HAVE_JUMP_LABEL_HACK #define ARCH_STATIC_BRANCH_ASM(key, label) \ "1: jmp " label " # objtool NOPs this \n\t" \ - JUMP_TABLE_ENTRY(key, label) + JUMP_TABLE_ENTRY(key " + 2", label) #else /* !CONFIG_HAVE_JUMP_LABEL_HACK */ #define ARCH_STATIC_BRANCH_ASM(key, label) \ "1: .byte " __stringify(BYTES_NOP5) "\n\t" \ @@ -33,10 +33,8 @@ static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch) { - int hack_bit = IS_ENABLED(CONFIG_HAVE_JUMP_LABEL_HACK) ? 2 : 0; - asm goto(ARCH_STATIC_BRANCH_ASM("%c0 + %c1", "%l[l_yes]") - : : "i" (key), "i" (hack_bit | branch) : : l_yes); + : : "i" (key), "i" (branch) : : l_yes); return false; l_yes: