Skip to content

Commit ba00c2a

Browse files
mrutland-armctmarinas
authored andcommitted
arm64: fix the build with binutils 2.27
Jon Hunter reports that for some toolchains the build has been broken since commit: 4c0bd99 ("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. Signed-off-by: Mark Rutland <[email protected]> Fixes: 4c0bd99 ("arm64: alternatives: have callbacks take a cap") Reported-by: Jon Hunter <[email protected]> Link: https://lore.kernel.org/linux-arm-kernel/[email protected]/ Tested-by: Jon Hunter <[email protected]> Cc: Ard Biesheuvel <[email protected]> Cc: Will Deacon <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Catalin Marinas <[email protected]>
1 parent 0072dc1 commit ba00c2a

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

arch/arm64/include/asm/alternative-macros.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22
#ifndef __ASM_ALTERNATIVE_MACROS_H
33
#define __ASM_ALTERNATIVE_MACROS_H
44

5+
#include <linux/bits.h>
56
#include <linux/const.h>
67

78
#include <asm/cpucaps.h>
89
#include <asm/insn-def.h>
910

10-
#define ARM64_CB_BIT (UL(1) << 15)
11+
/*
12+
* Binutils 2.27.0 can't handle a 'UL' suffix on constants, so for the assembly
13+
* macros below we must use we must use `(1 << ARM64_CB_SHIFT)`.
14+
*/
15+
#define ARM64_CB_SHIFT 15
16+
#define ARM64_CB_BIT BIT(ARM64_CB_SHIFT)
1117

1218
#if ARM64_NCAPS >= ARM64_CB_BIT
1319
#error "cpucaps have overflown ARM64_CB_BIT"
@@ -80,7 +86,7 @@
8086
__ALTERNATIVE_CFG(oldinstr, newinstr, feature, IS_ENABLED(cfg))
8187

8288
#define ALTERNATIVE_CB(oldinstr, feature, cb) \
83-
__ALTERNATIVE_CFG_CB(oldinstr, ARM64_CB_BIT | (feature), 1, cb)
89+
__ALTERNATIVE_CFG_CB(oldinstr, (1 << ARM64_CB_SHIFT) | (feature), 1, cb)
8490
#else
8591

8692
#include <asm/assembler.h>
@@ -150,7 +156,7 @@
150156
.macro alternative_cb cap, cb
151157
.set .Lasm_alt_mode, 0
152158
.pushsection .altinstructions, "a"
153-
altinstruction_entry 661f, \cb, ARM64_CB_BIT | \cap, 662f-661f, 0
159+
altinstruction_entry 661f, \cb, (1 << ARM64_CB_SHIFT) | \cap, 662f-661f, 0
154160
.popsection
155161
661:
156162
.endm

0 commit comments

Comments
 (0)