The fact that a host cpu supports a feature doesn't mean that QEMU and KVM will also support it, yet -cpuid host brings host features wholesale.
We need to whitelist each feature separately to make sure we support it. This patch adds KVM whitelisting (by simply using KVM_GET_SUPPORTED_CPUID instead of the CPUID instruction). Signed-off-by: Avi Kivity <a...@redhat.com> --- target-i386/cpuid.c | 27 ++++----------------------- 1 files changed, 4 insertions(+), 23 deletions(-) diff --git a/target-i386/cpuid.c b/target-i386/cpuid.c index 1e8bcff..edac377 100644 --- a/target-i386/cpuid.c +++ b/target-i386/cpuid.c @@ -107,33 +107,14 @@ void host_cpuid(uint32_t function, uint32_t count, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { #if defined(CONFIG_KVM) - uint32_t vec[4]; - -#ifdef __x86_64__ - asm volatile("cpuid" - : "=a"(vec[0]), "=b"(vec[1]), - "=c"(vec[2]), "=d"(vec[3]) - : "0"(function), "c"(count) : "cc"); -#else - asm volatile("pusha \n\t" - "cpuid \n\t" - "mov %%eax, 0(%2) \n\t" - "mov %%ebx, 4(%2) \n\t" - "mov %%ecx, 8(%2) \n\t" - "mov %%edx, 12(%2) \n\t" - "popa" - : : "a"(function), "c"(count), "S"(vec) - : "memory", "cc"); -#endif - if (eax) - *eax = vec[0]; + *eax = kvm_arch_get_supported_cpuid(kvm_state, function, count, R_EAX); if (ebx) - *ebx = vec[1]; + *ebx = kvm_arch_get_supported_cpuid(kvm_state, function, count, R_EBX); if (ecx) - *ecx = vec[2]; + *ecx = kvm_arch_get_supported_cpuid(kvm_state, function, count, R_ECX); if (edx) - *edx = vec[3]; + *edx = kvm_arch_get_supported_cpuid(kvm_state, function, count, R_EDX); #endif } -- 1.7.7.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html