96d389ca10
On Cortex-A77 r0p0 and r1p0, a sequence of a non-cacheable or device load and a store exclusive or PAR_EL1 read can cause a deadlock. The workaround requires a DMB SY before and after a PAR_EL1 register read. In addition, it's possible an interrupt (doing a device read) or KVM guest exit could be taken between the DMB and PAR read, so we also need a DMB before returning from interrupt and before returning to a guest. A deadlock is still possible with the workaround as KVM guests must also have the workaround. IOW, a malicious guest can deadlock an affected systems. This workaround also depends on a firmware counterpart to enable the h/w to insert DMB SY after load and store exclusive instructions. See the errata document SDEN-1152370 v10 [1] for more information. [1] https://static.docs.arm.com/101992/0010/Arm_Cortex_A77_MP074_Software_Developer_Errata_Notice_v10.pdf Signed-off-by: Rob Herring <robh@kernel.org> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Acked-by: Marc Zyngier <maz@kernel.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: James Morse <james.morse@arm.com> Cc: Suzuki K Poulose <suzuki.poulose@arm.com> Cc: Will Deacon <will@kernel.org> Cc: Julien Thierry <julien.thierry.kdev@gmail.com> Cc: kvmarm@lists.cs.columbia.edu Link: https://lore.kernel.org/r/20201028182839.166037-2-robh@kernel.org Signed-off-by: Will Deacon <will@kernel.org>
73 lines
2.2 KiB
C
73 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* arch/arm64/include/asm/cpucaps.h
|
|
*
|
|
* Copyright (C) 2016 ARM Ltd.
|
|
*/
|
|
#ifndef __ASM_CPUCAPS_H
|
|
#define __ASM_CPUCAPS_H
|
|
|
|
#define ARM64_WORKAROUND_CLEAN_CACHE 0
|
|
#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1
|
|
#define ARM64_WORKAROUND_845719 2
|
|
#define ARM64_HAS_SYSREG_GIC_CPUIF 3
|
|
#define ARM64_HAS_PAN 4
|
|
#define ARM64_HAS_LSE_ATOMICS 5
|
|
#define ARM64_WORKAROUND_CAVIUM_23154 6
|
|
#define ARM64_WORKAROUND_834220 7
|
|
#define ARM64_HAS_NO_HW_PREFETCH 8
|
|
#define ARM64_HAS_UAO 9
|
|
#define ARM64_ALT_PAN_NOT_UAO 10
|
|
#define ARM64_HAS_VIRT_HOST_EXTN 11
|
|
#define ARM64_WORKAROUND_CAVIUM_27456 12
|
|
#define ARM64_HAS_32BIT_EL0 13
|
|
#define ARM64_HARDEN_EL2_VECTORS 14
|
|
#define ARM64_HAS_CNP 15
|
|
#define ARM64_HAS_NO_FPSIMD 16
|
|
#define ARM64_WORKAROUND_REPEAT_TLBI 17
|
|
#define ARM64_WORKAROUND_QCOM_FALKOR_E1003 18
|
|
#define ARM64_WORKAROUND_858921 19
|
|
#define ARM64_WORKAROUND_CAVIUM_30115 20
|
|
#define ARM64_HAS_DCPOP 21
|
|
#define ARM64_SVE 22
|
|
#define ARM64_UNMAP_KERNEL_AT_EL0 23
|
|
#define ARM64_SPECTRE_V2 24
|
|
#define ARM64_HAS_RAS_EXTN 25
|
|
#define ARM64_WORKAROUND_843419 26
|
|
#define ARM64_HAS_CACHE_IDC 27
|
|
#define ARM64_HAS_CACHE_DIC 28
|
|
#define ARM64_HW_DBM 29
|
|
#define ARM64_SPECTRE_V4 30
|
|
#define ARM64_MISMATCHED_CACHE_TYPE 31
|
|
#define ARM64_HAS_STAGE2_FWB 32
|
|
#define ARM64_HAS_CRC32 33
|
|
#define ARM64_SSBS 34
|
|
#define ARM64_WORKAROUND_1418040 35
|
|
#define ARM64_HAS_SB 36
|
|
#define ARM64_WORKAROUND_SPECULATIVE_AT 37
|
|
#define ARM64_HAS_ADDRESS_AUTH_ARCH 38
|
|
#define ARM64_HAS_ADDRESS_AUTH_IMP_DEF 39
|
|
#define ARM64_HAS_GENERIC_AUTH_ARCH 40
|
|
#define ARM64_HAS_GENERIC_AUTH_IMP_DEF 41
|
|
#define ARM64_HAS_IRQ_PRIO_MASKING 42
|
|
#define ARM64_HAS_DCPODP 43
|
|
#define ARM64_WORKAROUND_1463225 44
|
|
#define ARM64_WORKAROUND_CAVIUM_TX2_219_TVM 45
|
|
#define ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM 46
|
|
#define ARM64_WORKAROUND_1542419 47
|
|
#define ARM64_HAS_E0PD 48
|
|
#define ARM64_HAS_RNG 49
|
|
#define ARM64_HAS_AMU_EXTN 50
|
|
#define ARM64_HAS_ADDRESS_AUTH 51
|
|
#define ARM64_HAS_GENERIC_AUTH 52
|
|
#define ARM64_HAS_32BIT_EL1 53
|
|
#define ARM64_BTI 54
|
|
#define ARM64_HAS_ARMv8_4_TTL 55
|
|
#define ARM64_HAS_TLB_RANGE 56
|
|
#define ARM64_MTE 57
|
|
#define ARM64_WORKAROUND_1508412 58
|
|
|
|
#define ARM64_NCAPS 59
|
|
|
|
#endif /* __ASM_CPUCAPS_H */
|