From 8481e3e71e704a10af0b6d53d4b015b2b8e1e16b Mon Sep 17 00:00:00 2001 From: Mike Gilbert Date: Sat, 30 Dec 2017 12:48:20 -0500 Subject: [PATCH] basic: detect_vm_cpuid: fix hypervisor detection The __get_cpuid() function only calls __cpuid() if __get_cpuid_max() returns a value that is less than or equal to the leaf value. In QEMU/KVM, I found that the special hypervisor leaf value (0x40000000U) is always larger than the value retured by __get_cpuid_max(). Avoid this problem by calling the __cpuid() macro directly once we have checked the hypervisor bit from leaf 1. Fixes: d31b0033b7743393562a2e9d3c1e74afea981c13 --- src/basic/virt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/basic/virt.c b/src/basic/virt.c index 2ea3f0749f..fe582833a7 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -78,8 +78,7 @@ static int detect_vm_cpuid(void) { unsigned j; /* There is a hypervisor, see what it is */ - if (__get_cpuid(0x40000000U, &eax, &ebx, &ecx, &edx) == 0) - return VIRTUALIZATION_NONE; + __cpuid(0x40000000U, eax, ebx, ecx, edx); sig.sig32[0] = ebx; sig.sig32[1] = ecx;