diff options
author | Gleb Natapov <gleb@redhat.com> | 2012-04-30 14:45:49 +0300 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-05-06 15:59:49 +0300 |
commit | 9b72d3b07dd99ac8ab2b84de5004a295af460536 (patch) | |
tree | 1142d76d9688772df00f1ce78faaf0075493448f | |
parent | 57c22e5f35aa4b9b2fe11f73f3e62bbf9ef36190 (diff) |
KVM guest: make kvm_para_available() check hypervisor bit reading cpuid leaf
This cpuid range does not exist on real HW and Intel spec says that
"Information returned for highest basic information leaf" will be
returned. Not very well defined.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | arch/x86/include/asm/kvm_para.h | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h index 99c4bbe0cca..a7a7a94b94c 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -178,14 +178,16 @@ static inline int kvm_para_available(void) unsigned int eax, ebx, ecx, edx; char signature[13]; - cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx); - memcpy(signature + 0, &ebx, 4); - memcpy(signature + 4, &ecx, 4); - memcpy(signature + 8, &edx, 4); - signature[12] = 0; - - if (strcmp(signature, "KVMKVMKVM") == 0) - return 1; + if (cpu_has_hypervisor) { + cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx); + memcpy(signature + 0, &ebx, 4); + memcpy(signature + 4, &ecx, 4); + memcpy(signature + 8, &edx, 4); + signature[12] = 0; + + if (strcmp(signature, "KVMKVMKVM") == 0) + return 1; + } return 0; } |