[PATCH] arm64: fix the build with binutils 2.27

Robin Murphy robin.murphy at arm.com
Thu Sep 29 10:33:05 PDT 2022


On 2022-09-29 16:02, Mark Rutland wrote:
> Jon Hunter reports that for some toolchains the build has been broken
> since commit:
> 
>    4c0bd995d73ed889 ("arm64: alternatives: have callbacks take a cap")
> 
> ... with a stream of build-time splats of the form:
> 
> |   CC      arch/arm64/kvm/hyp/vhe/debug-sr.o
> | /tmp/ccY3kbki.s: Assembler messages:
> | /tmp/ccY3kbki.s:1600: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1600: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1600: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1600: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1600: Error: junk at end of line, first unrecognized character
> | is `L'
> | /tmp/ccY3kbki.s:1723: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1723: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1723: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1723: Error: found 'L', expected: ')'
> | /tmp/ccY3kbki.s:1723: Error: junk at end of line, first unrecognized character
> | is `L'
> | scripts/Makefile.build:249: recipe for target
> | 'arch/arm64/kvm/hyp/vhe/debug-sr.o' failed
> 
> The issue here is that older versions of binutils (up to and including
> 2.27.0) don't like an 'L' suffix on constants. For plain assembly files,
> UL() avoids this suffix, but in C files this gets added, and so for
> inline assembly we can't directly use a constant defined with `UL()`.
> 
> We could avoid this by passing the constant as an input parameter, but
> this isn't practical given the way we use the alternative macros.
> Instead, just open code the constant without the `UL` suffix, and for
> consistency do this for both the inline assembly macro and the regular
> assembly macro.

Couldn't we just remove the UL() and avoid inconsistently open-coding 
anything? TBH I fail to see why it's there in the first place - 1 << 15 
is well within the range of int on arm64, and I don't see ARM64_CB_BIT 
being used in any wider arithmetic anywhere either :/

Thanks,
Robin.

> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Fixes: 4c0bd995d73ed889 ("arm64: alternatives: have callbacks take a cap")
> Reported-by: Jon Hunter <jonathanh at nvidia.com>
> Link: https://lore.kernel.org/linux-arm-kernel/3cecc3a5-30b0-f0bd-c3de-9e09bd21909b@nvidia.com/
> Tested-by: Jon Hunter <jonathanh at nvidia.com>
> Cc: Ard Biesheuvel <ardb at kernel.org>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Will Deacon <will at kernel.org>
> ---
>   arch/arm64/include/asm/alternative-macros.h | 12 +++++++++---
>   1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/alternative-macros.h b/arch/arm64/include/asm/alternative-macros.h
> index 966767debaa3..b5ac0b85c9bb 100644
> --- a/arch/arm64/include/asm/alternative-macros.h
> +++ b/arch/arm64/include/asm/alternative-macros.h
> @@ -2,12 +2,18 @@
>   #ifndef __ASM_ALTERNATIVE_MACROS_H
>   #define __ASM_ALTERNATIVE_MACROS_H
>   
> +#include <linux/bits.h>
>   #include <linux/const.h>
>   
>   #include <asm/cpucaps.h>
>   #include <asm/insn-def.h>
>   
> -#define ARM64_CB_BIT	(UL(1) << 15)
> +/*
> + * Binutils 2.27.0 can't handle a 'UL' suffix on constants, so for the assembly
> + * macros below we must use we must use `(1 << ARM64_CB_SHIFT)`.
> + */
> +#define ARM64_CB_SHIFT	15
> +#define ARM64_CB_BIT	BIT(ARM64_CB_SHIFT)
>   
>   #if ARM64_NCAPS >= ARM64_CB_BIT
>   #error "cpucaps have overflown ARM64_CB_BIT"
> @@ -80,7 +86,7 @@
>   	__ALTERNATIVE_CFG(oldinstr, newinstr, feature, IS_ENABLED(cfg))
>   
>   #define ALTERNATIVE_CB(oldinstr, feature, cb) \
> -	__ALTERNATIVE_CFG_CB(oldinstr, ARM64_CB_BIT | (feature), 1, cb)
> +	__ALTERNATIVE_CFG_CB(oldinstr, (1 << ARM64_CB_SHIFT) | (feature), 1, cb)
>   #else
>   
>   #include <asm/assembler.h>
> @@ -150,7 +156,7 @@
>   .macro alternative_cb cap, cb
>   	.set .Lasm_alt_mode, 0
>   	.pushsection .altinstructions, "a"
> -	altinstruction_entry 661f, \cb, ARM64_CB_BIT | \cap, 662f-661f, 0
> +	altinstruction_entry 661f, \cb, (1 << ARM64_CB_SHIFT) | \cap, 662f-661f, 0
>   	.popsection
>   661:
>   .endm



More information about the linux-arm-kernel mailing list