virt: fix detection of avx2 and friends
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 8 Jan 2024 10:59:32 +0000 (19:59 +0900)
committerLennart Poettering <lennart@poettering.net>
Mon, 8 Jan 2024 15:04:17 +0000 (16:04 +0100)
To get the CPUID with EAX=7, we need explicitly set 0 to ECX.

From IntelĀ® Architecture Instruction Set Extensions Programming
Reference and Related Specifications,
===
Leaf 07H output depends on the initial value in ECX.
If ECX contains an invalid sub leaf index, EAX/EBX/ECX/EDX return 0
===

Fixes #30822.

src/basic/virt.c

index 09aebabcd5e35a4d3fc503eb202a531dd86d60d9..2800f63f52db2129b58fe68877e76dcdf624b0e0 100644 (file)
@@ -997,7 +997,7 @@ static bool real_has_cpu_with_flag(const char *flag) {
                         return true;
         }
 
-        if (__get_cpuid(7, &eax, &ebx, &ecx, &edx)) {
+        if (__get_cpuid_count(7, 0, &eax, &ebx, &ecx, &edx)) {
                 if (given_flag_in_set(flag, leaf7_ebx, ELEMENTSOF(leaf7_ebx), ebx))
                         return true;
         }