[PATCH v5 13/35] x86/cpu: Use parsed CPUID(0x80000000)
"Ahmed S. Darwish" <[email protected]> Fri, 5 Sep 2025 14:14:53 +0200
| Newsgroups | dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
At the early boot code, use parsed CPUID(0x80000000) access instead of a
direct CPUID query.
Note that the modified code has the check:
extended_cpuid_level = ((eax & 0xffff0000) == 0x80000000) ? eax : 0;
to protect against Intel 32-bit machines without an extended range, where
a CPUID(0x80000000) query will repeat the max-valid standard CPUID leaf
output. A similar check is already done at the CPUID parser's own
CPUID(0x80000000) code:
if ((l->max_ext_leaf & 0xffff0000) != 0x80000000) {
// Handle error
}
Thus, for the modified call-site code, the parsed CPUID access NULL
check:
el0 = cpuid_leaf(c, 0x80000000);
extended_cpuid_level = el0 ? el0->max_ext_leaf : 0;
is sufficient.
Signed-off-by: Ahmed S. Darwish <[email protected]>
---
arch/x86/kernel/cpu/common.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index f989c8099490..0a0340a7ac1c 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -971,6 +971,7 @@ static void init_speculation_control(struct cpuinfo_x86 *c)
void get_cpu_cap(struct cpuinfo_x86 *c)
{
+ const struct leaf_0x80000000_0 *el0;
u32 eax, ebx, ecx, edx;
/* Intel-defined flags: level 0x00000001 */
@@ -1006,12 +1007,8 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
c->x86_capability[CPUID_D_1_EAX] = eax;
}
- /*
- * Check if extended CPUID leaves are implemented: Max extended
- * CPUID leaf must be in the 0x80000001-0x8000ffff range.
- */
- eax = cpuid_eax(0x80000000);
- c->extended_cpuid_level = ((eax & 0xffff0000) == 0x80000000) ? eax : 0;
+ el0 = cpuid_leaf(c, 0x80000000);
+ c->extended_cpuid_level = el0 ? el0->max_ext_leaf : 0;
if (c->extended_cpuid_level >= 0x80000001) {
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
--
2.50.1