fix(cpus): workaround for Neoverse-V3 erratum 3701767

Neoverse-V3 erratum 3701767 that applies to r0p0, r0p1, r0p2 is
still Open.

The workaround is for EL3 software that performs context save/restore
on a change of Security state to use a value of SCR_EL3.NS when
accessing ICH_VMCR_EL2 that reflects the Security state that owns the
data being saved or restored.

SDEN documentation:
https://developer.arm.com/documentation/SDEN-2891958/latest/

Change-Id: I5be0de881f408a9e82a07b8459d79490e9065f94
Signed-off-by: Govindraj Raja <govindraj.raja@arm.com>
This commit is contained in:
Govindraj Raja 2025-01-21 19:20:29 -06:00
parent fded839285
commit e25fc9df25
5 changed files with 30 additions and 0 deletions

View file

@ -578,6 +578,12 @@ For Neoverse V2, the following errata build flags are defined :
CPU, this affects all configurations. This needs to be enabled for revisions CPU, this affects all configurations. This needs to be enabled for revisions
r0p0 and r0p1. It has been fixed in r0p2. r0p0 and r0p1. It has been fixed in r0p2.
For Neoverse V3, the following errata build flags are defined :
- ``ERRATA_V3_3701767``: This applies errata 3701767 workaround to Neoverse-V3
CPU. This needs to be enabled for revisions r0p0, r0p1, r0p2 of the CPU and
is still open.
For Cortex-A710, the following errata build flags are defined : For Cortex-A710, the following errata build flags are defined :
- ``ERRATA_A710_1987031``: This applies errata 1987031 workaround to - ``ERRATA_A710_1987031``: This applies errata 1987031 workaround to

View file

@ -30,4 +30,8 @@
******************************************************************************/ ******************************************************************************/
#define NEOVERSE_V3_CPUACTLR6_EL1 S3_0_C15_C8_1 #define NEOVERSE_V3_CPUACTLR6_EL1 S3_0_C15_C8_1
#ifndef __ASSEMBLER__
long check_erratum_neoverse_v3_3701767(long cpu_rev);
#endif /* __ASSEMBLER__ */
#endif /* NEOVERSE_V3_H */ #endif /* NEOVERSE_V3_H */

View file

@ -22,6 +22,12 @@
#error "Neoverse V3 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" #error "Neoverse V3 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
#endif #endif
.global check_erratum_neoverse_v3_3701767
add_erratum_entry neoverse_v3, ERRATUM(3701767), ERRATA_V3_3701767, NO_APPLY_AT_RESET
check_erratum_ls neoverse_v3, ERRATUM(3701767), CPU_REV(0, 2)
#if WORKAROUND_CVE_2022_23960 #if WORKAROUND_CVE_2022_23960
wa_cve_2022_23960_bhb_vector_table NEOVERSE_V3_BHB_LOOP_COUNT, neoverse_v3 wa_cve_2022_23960_bhb_vector_table NEOVERSE_V3_BHB_LOOP_COUNT, neoverse_v3
#endif /* WORKAROUND_CVE_2022_23960 */ #endif /* WORKAROUND_CVE_2022_23960 */

View file

@ -564,6 +564,11 @@ CPU_FLAG_LIST += ERRATA_V1_2743233
# still open. # still open.
CPU_FLAG_LIST += ERRATA_V1_2779461 CPU_FLAG_LIST += ERRATA_V1_2779461
# Flag to apply erratum 3701767 workaround during context save/restore of
# ICH_VMCR_EL2 reg. This erratum applies to revisions r0p0, r0p1 and r0p2 of
# the Neoverse V3 cpu and is still open.
CPU_FLAG_LIST += ERRATA_V3_3701767
# Flag to apply erratum 1987031 workaround during reset. This erratum applies # Flag to apply erratum 1987031 workaround during reset. This erratum applies
# to revisions r0p0, r1p0 and r2p0 of the Cortex-A710 cpu and is still open. # to revisions r0p0, r1p0 and r2p0 of the Cortex-A710 cpu and is still open.
CPU_FLAG_LIST += ERRATA_A710_1987031 CPU_FLAG_LIST += ERRATA_A710_1987031

View file

@ -23,6 +23,7 @@
#include <lib/cpus/errata.h> #include <lib/cpus/errata.h>
#include <neoverse_n2.h> #include <neoverse_n2.h>
#include <neoverse_n3.h> #include <neoverse_n3.h>
#include <neoverse_v3.h>
#if ERRATA_A520_2938996 || ERRATA_X4_2726228 #if ERRATA_A520_2938996 || ERRATA_X4_2726228
unsigned int check_if_affected_core(void) unsigned int check_if_affected_core(void)
@ -130,6 +131,14 @@ bool errata_ich_vmcr_el2_applies(void)
return true; return true;
break; break;
#endif /* ERRATA_N3_3699563 */ #endif /* ERRATA_N3_3699563 */
#if ERRATA_V3_3701767
case EXTRACT_PARTNUM(NEOVERSE_V3_MIDR):
if (check_erratum_neoverse_v3_3701767(cpu_get_rev_var()) == ERRATA_APPLIES)
return true;
break;
#endif /* ERRATA_V3_3701767 */
default: default:
break; break;
} }