Merge tag 'kvmarm-fixes-6.15-2' of https://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD

KVM/arm64 fixes for 6.15, round #2

- Single fix for broken usage of 'multi-MIDR' infrastructure in PI
code, adding an open-coded erratum check for everyone's favorite pile
of sand: Cavium ThunderX

+25 -17
-11
arch/arm64/include/asm/mmu.h
··· 94 94 return false; 95 95 } 96 96 97 - /* 98 - * Systems affected by Cavium erratum 24756 are incompatible 99 - * with KPTI. 100 - */ 101 - if (IS_ENABLED(CONFIG_CAVIUM_ERRATUM_27456)) { 102 - extern const struct midr_range cavium_erratum_27456_cpus[]; 103 - 104 - if (is_midr_in_range_list(cavium_erratum_27456_cpus)) 105 - return false; 106 - } 107 - 108 97 return true; 109 98 } 110 99
+1 -1
arch/arm64/kernel/cpu_errata.c
··· 335 335 #endif 336 336 337 337 #ifdef CONFIG_CAVIUM_ERRATUM_27456 338 - const struct midr_range cavium_erratum_27456_cpus[] = { 338 + static const struct midr_range cavium_erratum_27456_cpus[] = { 339 339 /* Cavium ThunderX, T88 pass 1.x - 2.1 */ 340 340 MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1), 341 341 /* Cavium ThunderX, T81 pass 1.0 */
-4
arch/arm64/kernel/image-vars.h
··· 47 47 PROVIDE(__pi_id_aa64zfr0_override = id_aa64zfr0_override); 48 48 PROVIDE(__pi_arm64_sw_feature_override = arm64_sw_feature_override); 49 49 PROVIDE(__pi_arm64_use_ng_mappings = arm64_use_ng_mappings); 50 - #ifdef CONFIG_CAVIUM_ERRATUM_27456 51 - PROVIDE(__pi_cavium_erratum_27456_cpus = cavium_erratum_27456_cpus); 52 - PROVIDE(__pi_is_midr_in_range_list = is_midr_in_range_list); 53 - #endif 54 50 PROVIDE(__pi__ctype = _ctype); 55 51 PROVIDE(__pi_memstart_offset_seed = memstart_offset_seed); 56 52
+24 -1
arch/arm64/kernel/pi/map_kernel.c
··· 207 207 dsb(ishst); 208 208 } 209 209 210 + /* 211 + * PI version of the Cavium Eratum 27456 detection, which makes it 212 + * impossible to use non-global mappings. 213 + */ 214 + static bool __init ng_mappings_allowed(void) 215 + { 216 + static const struct midr_range cavium_erratum_27456_cpus[] __initconst = { 217 + /* Cavium ThunderX, T88 pass 1.x - 2.1 */ 218 + MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1), 219 + /* Cavium ThunderX, T81 pass 1.0 */ 220 + MIDR_REV(MIDR_THUNDERX_81XX, 0, 0), 221 + {}, 222 + }; 223 + 224 + for (const struct midr_range *r = cavium_erratum_27456_cpus; r->model; r++) { 225 + if (midr_is_cpu_model_range(read_cpuid_id(), r->model, 226 + r->rv_min, r->rv_max)) 227 + return false; 228 + } 229 + 230 + return true; 231 + } 232 + 210 233 asmlinkage void __init early_map_kernel(u64 boot_status, void *fdt) 211 234 { 212 235 static char const chosen_str[] __initconst = "/chosen"; ··· 269 246 u64 kaslr_seed = kaslr_early_init(fdt, chosen); 270 247 271 248 if (kaslr_seed && kaslr_requires_kpti()) 272 - arm64_use_ng_mappings = true; 249 + arm64_use_ng_mappings = ng_mappings_allowed(); 273 250 274 251 kaslr_offset |= kaslr_seed & ~(MIN_KIMG_ALIGN - 1); 275 252 }