On Thu, Feb 29, 2024 at 10:48:26AM -0500, Sasha Levin wrote:
From: Fangrui Song maskray@google.com
[ Upstream commit f9daab0ad01cf9d165dbbbf106ca4e61d06e7fe8 ]
That upstream patch caused issues and was subsequently reverted in commit:
a6b3eb304a82c29665a0ab947cfe276f6d29f523 ("Revert "arm64: jump_label: use constraints "Si" instead of "i""")
Please drop this; it'll break stable in the same way, and it wasn't necessary to backport in the first place.
As an aside, that revert has been upstream since v6.8-rc4, ~2.5 weeks ago; it's unfortunate for the broken patch to be AUTOSEL'd now! It'd be good if something could automatically check for reverts in mainline...
Mark.
The generic constraint "i" seems to be copied from x86 or arm (and with a redundant generic operand modifier "c"). It works with -fno-PIE but not with -fPIE/-fPIC in GCC's aarch64 port.
The machine constraint "S", which denotes a symbol or label reference with a constant offset, supports PIC and has been available in GCC since 2012 and in Clang since 7.0. However, Clang before 19 does not support "S" on a symbol with a constant offset [1] (e.g. `static_key_false(&nf_hooks_needed[pf][hook])` in include/linux/netfilter.h), so we use "i" as a fallback.
Suggested-by: Ard Biesheuvel ardb@kernel.org Signed-off-by: Fangrui Song maskray@google.com Link: https://github.com/llvm/llvm-project/pull/80255 [1] Acked-by: Mark Rutland mark.rutland@arm.com Link: https://lore.kernel.org/r/20240206074552.541154-1-maskray@google.com Signed-off-by: Will Deacon will@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org
arch/arm64/include/asm/jump_label.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/arch/arm64/include/asm/jump_label.h b/arch/arm64/include/asm/jump_label.h index 48ddc0f45d228..b7716b215f91a 100644 --- a/arch/arm64/include/asm/jump_label.h +++ b/arch/arm64/include/asm/jump_label.h @@ -15,6 +15,10 @@ #define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE +/*
- Prefer the constraint "S" to support PIC with GCC. Clang before 19 does not
- support "S" on a symbol with a constant offset, so we use "i" as a fallback.
- */
static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch) { @@ -23,9 +27,9 @@ static __always_inline bool arch_static_branch(struct static_key * const key, " .pushsection __jump_table, "aw" \n\t" " .align 3 \n\t" " .long 1b - ., %l[l_yes] - . \n\t"
" .quad %c0 - . \n\t"
" .popsection \n\t"" .quad (%[key] - .) + %[bit0] \n\t"
: : "i"(&((char *)key)[branch]) : : l_yes);
: : [key]"Si"(key), [bit0]"i"(branch) : : l_yes);
return false; l_yes: @@ -40,9 +44,9 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke " .pushsection __jump_table, "aw" \n\t" " .align 3 \n\t" " .long 1b - ., %l[l_yes] - . \n\t"
" .quad %c0 - . \n\t"
" .popsection \n\t"" .quad (%[key] - .) + %[bit0] \n\t"
: : "i"(&((char *)key)[branch]) : : l_yes);
: : [key]"Si"(key), [bit0]"i"(branch) : : l_yes);
return false; l_yes: -- 2.43.0