
The arm64 LSE atomics implementation uses both alternatives patching and jump label patching, both of which need to be selectively disabled when building the FIPS140 module, or the hashing of the .text section no longer works. We already disable jump labels in generic code, but this uncovers a rather nasty circular include dependency, as the jump label fallback code uses atomics, which are provided by the LSE code if enabled. So let's disable LSE as well when building the FIPS140 module: this does not have any impact on the code, as no code patching goes on in this module anyway, but it avoids #include hell. Bug: 153614920 Bug: 188620248 Change-Id: Ia3d823fa3a309777f0c955d619ae8b139dc74061 Signed-off-by: Ard Biesheuvel <ardb@google.com>
49 lines
1.3 KiB
C
49 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __ASM_LSE_H
|
|
#define __ASM_LSE_H
|
|
|
|
#include <asm/atomic_ll_sc.h>
|
|
|
|
#if defined(CONFIG_ARM64_LSE_ATOMICS) && !defined(BUILD_FIPS140_KO)
|
|
|
|
#define __LSE_PREAMBLE ".arch_extension lse\n"
|
|
|
|
#include <linux/compiler_types.h>
|
|
#include <linux/export.h>
|
|
#include <linux/jump_label.h>
|
|
#include <linux/stringify.h>
|
|
#include <asm/alternative.h>
|
|
#include <asm/atomic_lse.h>
|
|
#include <asm/cpucaps.h>
|
|
|
|
extern struct static_key_false cpu_hwcap_keys[ARM64_NCAPS];
|
|
extern struct static_key_false arm64_const_caps_ready;
|
|
|
|
static inline bool system_uses_lse_atomics(void)
|
|
{
|
|
return (static_branch_likely(&arm64_const_caps_ready)) &&
|
|
static_branch_likely(&cpu_hwcap_keys[ARM64_HAS_LSE_ATOMICS]);
|
|
}
|
|
|
|
#define __lse_ll_sc_body(op, ...) \
|
|
({ \
|
|
system_uses_lse_atomics() ? \
|
|
__lse_##op(__VA_ARGS__) : \
|
|
__ll_sc_##op(__VA_ARGS__); \
|
|
})
|
|
|
|
/* In-line patching at runtime */
|
|
#define ARM64_LSE_ATOMIC_INSN(llsc, lse) \
|
|
ALTERNATIVE(llsc, __LSE_PREAMBLE lse, ARM64_HAS_LSE_ATOMICS)
|
|
|
|
#else /* CONFIG_ARM64_LSE_ATOMICS */
|
|
|
|
static inline bool system_uses_lse_atomics(void) { return false; }
|
|
|
|
#define __lse_ll_sc_body(op, ...) __ll_sc_##op(__VA_ARGS__)
|
|
|
|
#define ARM64_LSE_ATOMIC_INSN(llsc, lse) llsc
|
|
|
|
#endif /* CONFIG_ARM64_LSE_ATOMICS */
|
|
#endif /* __ASM_LSE_H */
|