Skip to content

Commit 2d71249

Browse files
committed
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
2 parents 38e9326 + 117c3b2 commit 2d71249

File tree

4 files changed

+25
-17
lines changed

4 files changed

+25
-17
lines changed

arch/arm64/include/asm/mmu.h

-11
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,6 @@ static inline bool kaslr_requires_kpti(void)
9494
return false;
9595
}
9696

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-
10897
return true;
10998
}
11099

arch/arm64/kernel/cpu_errata.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ static const struct midr_range cavium_erratum_23154_cpus[] = {
335335
#endif
336336

337337
#ifdef CONFIG_CAVIUM_ERRATUM_27456
338-
const struct midr_range cavium_erratum_27456_cpus[] = {
338+
static const struct midr_range cavium_erratum_27456_cpus[] = {
339339
/* Cavium ThunderX, T88 pass 1.x - 2.1 */
340340
MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1),
341341
/* Cavium ThunderX, T81 pass 1.0 */

arch/arm64/kernel/image-vars.h

-4
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ PROVIDE(__pi_id_aa64smfr0_override = id_aa64smfr0_override);
4747
PROVIDE(__pi_id_aa64zfr0_override = id_aa64zfr0_override);
4848
PROVIDE(__pi_arm64_sw_feature_override = arm64_sw_feature_override);
4949
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
5450
PROVIDE(__pi__ctype = _ctype);
5551
PROVIDE(__pi_memstart_offset_seed = memstart_offset_seed);
5652

arch/arm64/kernel/pi/map_kernel.c

+24-1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,29 @@ static void __init map_fdt(u64 fdt)
207207
dsb(ishst);
208208
}
209209

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+
210233
asmlinkage void __init early_map_kernel(u64 boot_status, void *fdt)
211234
{
212235
static char const chosen_str[] __initconst = "/chosen";
@@ -246,7 +269,7 @@ asmlinkage void __init early_map_kernel(u64 boot_status, void *fdt)
246269
u64 kaslr_seed = kaslr_early_init(fdt, chosen);
247270

248271
if (kaslr_seed && kaslr_requires_kpti())
249-
arm64_use_ng_mappings = true;
272+
arm64_use_ng_mappings = ng_mappings_allowed();
250273

251274
kaslr_offset |= kaslr_seed & ~(MIN_KIMG_ALIGN - 1);
252275
}

0 commit comments

Comments
 (0)