From: Mike Gilbert Date: Sat, 30 Dec 2017 17:48:20 +0000 (-0500) Subject: basic: detect_vm_cpuid: fix hypervisor detection X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=7b0acd5d3752492b8fb182c59976fd1a0ee61031;p=elogind.git 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 --- diff --git a/src/basic/virt.c b/src/basic/virt.c index 15dc860ad..21e11b698 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -79,8 +79,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;