Commit 52c9f93a authored by Nathan Chancellor's avatar Nathan Chancellor Committed by Catalin Marinas

arm64: Do not include __READ_ONCE() block in assembly files

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>
parent 58c9a506
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#ifndef __ASM_RWONCE_H #ifndef __ASM_RWONCE_H
#define __ASM_RWONCE_H #define __ASM_RWONCE_H
#ifdef CONFIG_LTO #if defined(CONFIG_LTO) && !defined(__ASSEMBLY__)
#include <linux/compiler_types.h> #include <linux/compiler_types.h>
#include <asm/alternative-macros.h> #include <asm/alternative-macros.h>
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
}) })
#endif /* !BUILD_VDSO */ #endif /* !BUILD_VDSO */
#endif /* CONFIG_LTO */ #endif /* CONFIG_LTO && !__ASSEMBLY__ */
#include <asm-generic/rwonce.h> #include <asm-generic/rwonce.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment