Re: [x86/cpuid] Question regarding historic leaf 0x80000000 code
Andrew Cooper <[email protected]>
| Newsgroups | dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 20/03/2025 7:33 pm, Ahmed S. Darwish wrote: > Hi hpa, > > As you probably know by now, we're working on a centralized "CPUID table" > data model, on top of the cleanups at: > > https://lore.kernel.org/x86-cpuid/[email protected] > https://lore.kernel.org/x86-cpuid/[email protected] > https://lore.kernel.org/x86-cpuid/[email protected] > > The idea is to remove all the direct CPUID queries from the x86 code, and > access a pre-filled table instead (with caveats outside the scope of this > question.) > > While changing the CPUID queries one by one, I've stumbled with: > > => arch/x86/kernel/cpu/common.c > void get_cpu_cap(struct cpuinfo_x86 *c) > { > ... > /* AMD-defined flags: level 0x80000001 */ > eax = cpuid_eax(0x80000000); > c->extended_cpuid_level = eax; > > if ((eax & 0xffff0000) == 0x80000000) { > if (eax >= 0x80000001) { > cpuid(0x80000001, &eax, &ebx, &ecx, &edx); > > c->x86_capability[CPUID_8000_0001_ECX] = ecx; > c->x86_capability[CPUID_8000_0001_EDX] = edx; > } > } > ... > } > > You've contributed that snippet here: > > https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?h=2.4.0-test11pre5&id=67ad24e6d39c3 > > Do you remember what was the rationale for the "if (eax & 0xffff0000) == > 0x80000000" check? > > You've also contriubted a similar check to head_32.S: > > https://lore.kernel.org/r/[email protected] > > /* Check if extended functions are implemented */ > movl $0x80000000, %eax > cpuid > /* Value must be in the range 0x80000001 to 0x8000ffff */ > subl $0x80000001, %eax > cmpl $(0x8000ffff-0x80000001), %eax > ja .Lenable_paging > > So I would assume, it would be safe to have a similar check in our > centralized "system CPUID table" scanner. > > In all cases, if you know more details, it would be great to know, so > that I add it in the centralized CPUID table patch queue changelog (in a > separate patch.) The problem is that for an out-of-range leaf, Intel returns the data from the maximum in-range leaf, rather than zeroes. On pre-AMD64-capable Intel CPUs, you'll get what amounts to junk in a query for leaf 0x80000000, where it's probably leaf 5 or so. Checking for the upper half of the output matching the input is a way of distinguishing Intel behaviour from all the other vendors. ~Andrew