Skip to content

Commit e312129

Browse files
shamiali2008oupton
authored andcommitted
arm64: Modify _midr_range() functions to read MIDR/REVIDR internally
These changes lay the groundwork for adding support for guest kernels, allowing them to leverage target CPU implementations provided by the VMM. No functional changes intended. Suggested-by: Oliver Upton <oliver.upton@linux.dev> Reviewed-by: Sebastian Ott <sebott@redhat.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Link: https://lore.kernel.org/r/20250221140229.12588-2-shameerali.kolothum.thodi@huawei.com Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent 0ad2507 commit e312129

File tree

8 files changed

+42
-41
lines changed

8 files changed

+42
-41
lines changed

arch/arm64/include/asm/cputype.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,16 @@
231231

232232
#define read_cpuid(reg) read_sysreg_s(SYS_ ## reg)
233233

234+
/*
235+
* The CPU ID never changes at run time, so we might as well tell the
236+
* compiler that it's constant. Use this function to read the CPU ID
237+
* rather than directly reading processor_id or read_cpuid() directly.
238+
*/
239+
static inline u32 __attribute_const__ read_cpuid_id(void)
240+
{
241+
return read_cpuid(MIDR_EL1);
242+
}
243+
234244
/*
235245
* Represent a range of MIDR values for a given CPU model and a
236246
* range of variant/revision values.
@@ -266,31 +276,21 @@ static inline bool midr_is_cpu_model_range(u32 midr, u32 model, u32 rv_min,
266276
return _model == model && rv >= rv_min && rv <= rv_max;
267277
}
268278

269-
static inline bool is_midr_in_range(u32 midr, struct midr_range const *range)
279+
static inline bool is_midr_in_range(struct midr_range const *range)
270280
{
271-
return midr_is_cpu_model_range(midr, range->model,
281+
return midr_is_cpu_model_range(read_cpuid_id(), range->model,
272282
range->rv_min, range->rv_max);
273283
}
274284

275285
static inline bool
276-
is_midr_in_range_list(u32 midr, struct midr_range const *ranges)
286+
is_midr_in_range_list(struct midr_range const *ranges)
277287
{
278288
while (ranges->model)
279-
if (is_midr_in_range(midr, ranges++))
289+
if (is_midr_in_range(ranges++))
280290
return true;
281291
return false;
282292
}
283293

284-
/*
285-
* The CPU ID never changes at run time, so we might as well tell the
286-
* compiler that it's constant. Use this function to read the CPU ID
287-
* rather than directly reading processor_id or read_cpuid() directly.
288-
*/
289-
static inline u32 __attribute_const__ read_cpuid_id(void)
290-
{
291-
return read_cpuid(MIDR_EL1);
292-
}
293-
294294
static inline u64 __attribute_const__ read_cpuid_mpidr(void)
295295
{
296296
return read_cpuid(MPIDR_EL1);

arch/arm64/include/asm/mmu.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,7 @@ static inline bool kaslr_requires_kpti(void)
101101
if (IS_ENABLED(CONFIG_CAVIUM_ERRATUM_27456)) {
102102
extern const struct midr_range cavium_erratum_27456_cpus[];
103103

104-
if (is_midr_in_range_list(read_cpuid_id(),
105-
cavium_erratum_27456_cpus))
104+
if (is_midr_in_range_list(cavium_erratum_27456_cpus))
106105
return false;
107106
}
108107

arch/arm64/kernel/cpu_errata.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,34 @@
1515
#include <asm/smp_plat.h>
1616

1717
static bool __maybe_unused
18-
is_affected_midr_range(const struct arm64_cpu_capabilities *entry, int scope)
18+
__is_affected_midr_range(const struct arm64_cpu_capabilities *entry,
19+
u32 midr, u32 revidr)
1920
{
2021
const struct arm64_midr_revidr *fix;
21-
u32 midr = read_cpuid_id(), revidr;
22-
23-
WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
24-
if (!is_midr_in_range(midr, &entry->midr_range))
22+
if (!is_midr_in_range(&entry->midr_range))
2523
return false;
2624

2725
midr &= MIDR_REVISION_MASK | MIDR_VARIANT_MASK;
28-
revidr = read_cpuid(REVIDR_EL1);
2926
for (fix = entry->fixed_revs; fix && fix->revidr_mask; fix++)
3027
if (midr == fix->midr_rv && (revidr & fix->revidr_mask))
3128
return false;
32-
3329
return true;
3430
}
3531

32+
static bool __maybe_unused
33+
is_affected_midr_range(const struct arm64_cpu_capabilities *entry, int scope)
34+
{
35+
WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
36+
return __is_affected_midr_range(entry, read_cpuid_id(),
37+
read_cpuid(REVIDR_EL1));
38+
}
39+
3640
static bool __maybe_unused
3741
is_affected_midr_range_list(const struct arm64_cpu_capabilities *entry,
3842
int scope)
3943
{
4044
WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
41-
return is_midr_in_range_list(read_cpuid_id(), entry->midr_range_list);
45+
return is_midr_in_range_list(entry->midr_range_list);
4246
}
4347

4448
static bool __maybe_unused
@@ -186,12 +190,11 @@ static bool __maybe_unused
186190
has_neoverse_n1_erratum_1542419(const struct arm64_cpu_capabilities *entry,
187191
int scope)
188192
{
189-
u32 midr = read_cpuid_id();
190193
bool has_dic = read_cpuid_cachetype() & BIT(CTR_EL0_DIC_SHIFT);
191194
const struct midr_range range = MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N1);
192195

193196
WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
194-
return is_midr_in_range(midr, &range) && has_dic;
197+
return is_midr_in_range(&range) && has_dic;
195198
}
196199

197200
#ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI

arch/arm64/kernel/cpufeature.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,7 +1792,7 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
17921792
char const *str = "kpti command line option";
17931793
bool meltdown_safe;
17941794

1795-
meltdown_safe = is_midr_in_range_list(read_cpuid_id(), kpti_safe_list);
1795+
meltdown_safe = is_midr_in_range_list(kpti_safe_list);
17961796

17971797
/* Defer to CPU feature registers */
17981798
if (has_cpuid_feature(entry, scope))
@@ -1862,7 +1862,7 @@ static bool has_nv1(const struct arm64_cpu_capabilities *entry, int scope)
18621862

18631863
return (__system_matches_cap(ARM64_HAS_NESTED_VIRT) &&
18641864
!(has_cpuid_feature(entry, scope) ||
1865-
is_midr_in_range_list(read_cpuid_id(), nv1_ni_list)));
1865+
is_midr_in_range_list(nv1_ni_list)));
18661866
}
18671867

18681868
#if defined(ID_AA64MMFR0_EL1_TGRAN_LPA2) && defined(ID_AA64MMFR0_EL1_TGRAN_2_SUPPORTED_LPA2)
@@ -2045,7 +2045,7 @@ static bool cpu_has_broken_dbm(void)
20452045
{},
20462046
};
20472047

2048-
return is_midr_in_range_list(read_cpuid_id(), cpus);
2048+
return is_midr_in_range_list(cpus);
20492049
}
20502050

20512051
static bool cpu_can_use_dbm(const struct arm64_cpu_capabilities *cap)

arch/arm64/kernel/proton-pack.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ static enum mitigation_state spectre_v2_get_cpu_hw_mitigation_state(void)
172172
return SPECTRE_UNAFFECTED;
173173

174174
/* Alternatively, we have a list of unaffected CPUs */
175-
if (is_midr_in_range_list(read_cpuid_id(), spectre_v2_safe_list))
175+
if (is_midr_in_range_list(spectre_v2_safe_list))
176176
return SPECTRE_UNAFFECTED;
177177

178178
return SPECTRE_VULNERABLE;
@@ -331,7 +331,7 @@ bool has_spectre_v3a(const struct arm64_cpu_capabilities *entry, int scope)
331331
};
332332

333333
WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
334-
return is_midr_in_range_list(read_cpuid_id(), spectre_v3a_unsafe_list);
334+
return is_midr_in_range_list(spectre_v3a_unsafe_list);
335335
}
336336

337337
void spectre_v3a_enable_mitigation(const struct arm64_cpu_capabilities *__unused)
@@ -475,7 +475,7 @@ static enum mitigation_state spectre_v4_get_cpu_hw_mitigation_state(void)
475475
{ /* sentinel */ },
476476
};
477477

478-
if (is_midr_in_range_list(read_cpuid_id(), spectre_v4_safe_list))
478+
if (is_midr_in_range_list(spectre_v4_safe_list))
479479
return SPECTRE_UNAFFECTED;
480480

481481
/* CPU features are detected first */
@@ -878,13 +878,13 @@ u8 spectre_bhb_loop_affected(int scope)
878878
{},
879879
};
880880

881-
if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k32_list))
881+
if (is_midr_in_range_list(spectre_bhb_k32_list))
882882
k = 32;
883-
else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k24_list))
883+
else if (is_midr_in_range_list(spectre_bhb_k24_list))
884884
k = 24;
885-
else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k11_list))
885+
else if (is_midr_in_range_list(spectre_bhb_k11_list))
886886
k = 11;
887-
else if (is_midr_in_range_list(read_cpuid_id(), spectre_bhb_k8_list))
887+
else if (is_midr_in_range_list(spectre_bhb_k8_list))
888888
k = 8;
889889

890890
max_bhb_k = max(max_bhb_k, k);
@@ -926,8 +926,7 @@ static bool is_spectre_bhb_fw_affected(int scope)
926926
MIDR_ALL_VERSIONS(MIDR_CORTEX_A75),
927927
{},
928928
};
929-
bool cpu_in_list = is_midr_in_range_list(read_cpuid_id(),
930-
spectre_bhb_firmware_mitigated_list);
929+
bool cpu_in_list = is_midr_in_range_list(spectre_bhb_firmware_mitigated_list);
931930

932931
if (scope != SCOPE_LOCAL_CPU)
933932
return system_affected;

arch/arm64/kvm/vgic/vgic-v3.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ static const struct midr_range broken_seis[] = {
633633
static bool vgic_v3_broken_seis(void)
634634
{
635635
return ((kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_SEIS_MASK) &&
636-
is_midr_in_range_list(read_cpuid_id(), broken_seis));
636+
is_midr_in_range_list(broken_seis));
637637
}
638638

639639
/**

drivers/clocksource/arm_arch_timer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ static u64 __arch_timer_check_delta(void)
842842
{},
843843
};
844844

845-
if (is_midr_in_range_list(read_cpuid_id(), broken_cval_midrs)) {
845+
if (is_midr_in_range_list(broken_cval_midrs)) {
846846
pr_warn_once("Broken CNTx_CVAL_EL1, using 31 bit TVAL instead.\n");
847847
return CLOCKSOURCE_MASK(31);
848848
}

drivers/hwtracing/coresight/coresight-etm4x-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ static void etm4_fixup_wrong_ccitmin(struct etmv4_drvdata *drvdata)
12161216
* recorded value for 'drvdata->ccitmin' to workaround
12171217
* this problem.
12181218
*/
1219-
if (is_midr_in_range_list(read_cpuid_id(), etm_wrong_ccitmin_cpus)) {
1219+
if (is_midr_in_range_list(etm_wrong_ccitmin_cpus)) {
12201220
if (drvdata->ccitmin == 256)
12211221
drvdata->ccitmin = 4;
12221222
}

0 commit comments

Comments
 (0)