• Nathan Chancellor's avatar
    arm64: Do not include __READ_ONCE() block in assembly files · 52c9f93a
    Nathan Chancellor authored
    When building arm64 defconfig + CONFIG_LTO_CLANG_{FULL,THIN}=y after
    commit 558c303c ("arm64: Mitigate spectre style branch history side
    channels"), the following error occurs:
    
      <instantiation>:4:2: error: invalid fixup for movz/movk instruction
       mov w0, #ARM_SMCCC_ARCH_WORKAROUND_3
       ^
    
    Marc figured out that moving "#include <linux/init.h>" in
    include/linux/arm-smccc.h into a !__ASSEMBLY__ block resolves it. The
    full include chain with CONFIG_LTO=y from include/linux/arm-smccc.h:
    
    include/linux/init.h
    include/linux/compiler.h
    arch/arm64/include/asm/rwonce.h
    arch/arm64/include/asm/alternative-macros.h
    arch/arm64/include/asm/assembler.h
    
    The asm/alternative-macros.h include in asm/rwonce.h only happens when
    CONFIG_LTO is set, which ultimately casues asm/assembler.h to be
    included before the definition of ARM_SMCCC_ARCH_WORKAROUND_3. As a
    result, the preprocessor does not expand ARM_SMCCC_ARCH_WORKAROUND_3 in
    __mitigate_spectre_bhb_fw, which results in the error above.
    
    Avoid this problem by just avoiding the CONFIG_LTO=y __READ_ONCE() block
    in asm/rwonce.h with assembly files, as nothing in that block is useful
    to assembly files, which allows ARM_SMCCC_ARCH_WORKAROUND_3 to be
    properly expanded with CONFIG_LTO=y builds.
    
    Fixes: e35123d8 ("arm64: lto: Strengthen READ_ONCE() to acquire when CONFIG_LTO=y")
    Cc: <stable@vger.kernel.org> # 5.11.x
    Link: https://lore.kernel.org/r/20220309155716.3988480-1-maz@kernel.org/Reported-by: default avatarMarc Zyngier <maz@kernel.org>
    Acked-by: default avatarJames Morse <james.morse@arm.com>
    Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
    Link: https://lore.kernel.org/r/20220309191633.2307110-1-nathan@kernel.orgSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    52c9f93a
rwonce.h 1.96 KB