aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2026-05-28 09:25:30 +0000
committerMark Johnston <markj@FreeBSD.org>2026-06-09 19:13:21 +0000
commit9c0a62df50de990230a48827ca0bb85b41d4e839 (patch)
treed3457edc9e8b17c672c2bbee22f3f106e32c6c45
parentd39be1b1b50df91ad7ab62b25a4a30343e94cba5 (diff)
arm64: Workaround the following errata
- ARM C1-Premium erratum 4193780 - ARM C1-Ultra erratum 4193780 - ARM Cortex-A76 erratum 4193800 - ARM Cortex-A76AE erratum 4193801 - ARM Cortex-A77 erratum 4193798 - ARM Cortex-A78 erratum 4193791 - ARM Cortex-A78AE erratum 4193793 - ARM Cortex-A78C erratum 4193794 - ARM Cortex-A710 erratum 4193788 - ARM Cortex-X1 erratum 4193791 - ARM Cortex-X1C erratum 4193792 - ARM Cortex-X2 erratum 4193788 - ARM Cortex-X3 erratum 4193786 - ARM Cortex-X4 erratum 4118414 - ARM Cortex-X925 erratum 4193781 - ARM Neoverse-N1 erratum 4193800 - ARM Neoverse-N2 erratum 4193789 - ARM Neoverse-V1 erratum 4193790 - ARM Neoverse-V2 erratum 4193787 - ARM Neoverse-V3 erratum 4193784 - ARM Neoverse-V3AE erratum 4193784 These are all variants on an erratum where TLBI+DSB instructions on one CPU may incorrectly complete early leading to stores to an updated address using an incorrect translation on another CPU. In all cases the workaround is to add a second TLBI+DSB. Approved by: so Security: FreeBSD-SA-26:31.arm64 Security: CVE-2025-10263 Sponsored by: Arm Ltd
-rw-r--r--sys/arm64/arm64/pmap.c60
1 files changed, 51 insertions, 9 deletions
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index 1fb9ac2011aa..2eabdef6d27c 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -1769,20 +1769,62 @@ static cpu_feat_en
pmap_multiple_tlbi_check(const struct cpu_feat *feat __unused, u_int midr)
{
/*
- * Cortex-A55 erratum 2441007 (Cat B rare)
+ * ARM C1-Premium erratum 4193780
+ * ARM C1-Ultra erratum 4193780
+ * ARM Cortex-A76 erratum 4193800
+ * ARM Cortex-A76AE erratum 4193801
+ * ARM Cortex-A77 erratum 4193798
+ * ARM Cortex-A78 erratum 4193791
+ * ARM Cortex-A78AE erratum 4193793
+ * ARM Cortex-A78C erratum 4193794
+ * ARM Cortex-A710 erratum 4193788
+ * ARM Cortex-X1 erratum 4193791
+ * ARM Cortex-X1C erratum 4193792
+ * ARM Cortex-X2 erratum 4193788
+ * ARM Cortex-X3 erratum 4193786
+ * ARM Cortex-X4 erratum 4118414
+ * ARM Cortex-X925 erratum 4193781
+ * ARM Neoverse-N1 erratum 4193800
+ * ARM Neoverse-N2 erratum 4193789
+ * ARM Neoverse-V1 erratum 4193790
+ * ARM Neoverse-V2 erratum 4193787
+ * ARM Neoverse-V3 erratum 4193784
+ * ARM Neoverse-V3AE erratum 4193784
* Present in all revisions
*/
- if (CPU_IMPL(midr) == CPU_IMPL_ARM &&
- CPU_PART(midr) == CPU_PART_CORTEX_A55)
- return (FEAT_DEFAULT_DISABLE);
+ if (CPU_IMPL(midr) == CPU_IMPL_ARM) {
+ switch(CPU_PART(midr)) {
+ case CPU_PART_C1_PREMIUM:
+ case CPU_PART_C1_ULTRA:
+ case CPU_PART_CORTEX_A76:
+ case CPU_PART_CORTEX_A76AE:
+ case CPU_PART_CORTEX_A77:
+ case CPU_PART_CORTEX_A78:
+ case CPU_PART_CORTEX_A78AE:
+ case CPU_PART_CORTEX_A78C:
+ case CPU_PART_CORTEX_A710:
+ case CPU_PART_CORTEX_X1:
+ case CPU_PART_CORTEX_X1C:
+ case CPU_PART_CORTEX_X2:
+ case CPU_PART_CORTEX_X3:
+ case CPU_PART_CORTEX_X4:
+ case CPU_PART_CORTEX_X925:
+ case CPU_PART_NEOVERSE_N1:
+ case CPU_PART_NEOVERSE_N2:
+ case CPU_PART_NEOVERSE_V1:
+ case CPU_PART_NEOVERSE_V2:
+ case CPU_PART_NEOVERSE_V3:
+ case CPU_PART_NEOVERSE_V3AE:
+ return (FEAT_DEFAULT_ENABLE);
+ }
+ }
/*
- * Cortex-A76 erratum 1286807 (Cat B rare)
- * Present in r0p0 - r3p0
- * Fixed in r3p1
+ * Cortex-A55 erratum 2441007 (Cat B rare)
+ * Present in all revisions
*/
- if (midr_check_var_part_range(midr, CPU_IMPL_ARM, CPU_PART_CORTEX_A76,
- 0, 0, 3, 0))
+ if (CPU_IMPL(midr) == CPU_IMPL_ARM &&
+ CPU_PART(midr) == CPU_PART_CORTEX_A55)
return (FEAT_DEFAULT_DISABLE);
/*