From 3ae72e6ba936ba53b418f3401169d21a71f235b4 Mon Sep 17 00:00:00 2001 Message-Id: <3ae72e6ba936ba53b418f3401169d21a71f235b4.1351793582.git.minovotn@redhat.com> In-Reply-To: References: From: Eduardo Habkost Date: Thu, 25 Oct 2012 19:28:21 +0200 Subject: [PATCH 8/8] target-i386: kvm_cpu_fill_host: use GET_SUPPORTED_CPUID RH-Author: Eduardo Habkost Message-id: <1351193301-31675-9-git-send-email-ehabkost@redhat.com> Patchwork-id: 43649 O-Subject: [RHEL6.4 qemu-kvm PATCH 8/8] target-i386: kvm_cpu_fill_host: use GET_SUPPORTED_CPUID Bugzilla: 691638 RH-Acked-by: Marcelo Tosatti RH-Acked-by: Gleb Natapov RH-Acked-by: Laszlo Ersek Bugzilla: 691638 Upstream status: equivalent patch submitted Message-Id: <1351115047-27828-4-git-send-email-ehabkost@redhat.com> Change the kvm_cpu_fill_host() function to use kvm_arch_get_supported_cpuid() instead of running the CPUID instruction directly, when checking for supported CPUID features. This should solve two problems at the same time: * "-cpu host" was not enabling features that don't need support on the host CPU (e.g. x2apic); * "check" and "enforce" options were not detecting problems when the host CPU did support a feature, but the KVM kernel code didn't support it. Signed-off-by: Eduardo Habkost --- target-i386/cpuid.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) Signed-off-by: Michal Novotny --- target-i386/cpuid.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/target-i386/cpuid.c b/target-i386/cpuid.c index 04e1aae..4828df7 100644 --- a/target-i386/cpuid.c +++ b/target-i386/cpuid.c @@ -751,13 +751,13 @@ static int cpu_x86_fill_model_id(char *str) */ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def) { + KVMState *s = kvm_state; uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0; assert(kvm_enabled()); x86_cpu_def->name = "host"; host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx); - x86_cpu_def->level = eax; x86_cpu_def->vendor1 = ebx; x86_cpu_def->vendor2 = edx; x86_cpu_def->vendor3 = ecx; @@ -766,21 +766,24 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def) x86_cpu_def->family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF); x86_cpu_def->model = ((eax >> 4) & 0x0F) | ((eax & 0xF0000) >> 12); x86_cpu_def->stepping = eax & 0x0F; - x86_cpu_def->ext_features = ecx; - x86_cpu_def->features = edx; + + x86_cpu_def->level = kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX); + x86_cpu_def->features = kvm_arch_get_supported_cpuid(s, 0x1, 0, R_EDX); + x86_cpu_def->ext_features = kvm_arch_get_supported_cpuid(s, 0x1, 0, R_ECX); if (x86_cpu_def->level >= 7) { - x86_cpu_def->cpuid_7_0_ebx_features = kvm_arch_get_supported_cpuid(kvm_state, 0x7, 0, R_EBX); + x86_cpu_def->cpuid_7_0_ebx_features = + kvm_arch_get_supported_cpuid(s, 0x7, 0, R_EBX); } else { x86_cpu_def->cpuid_7_0_ebx_features = 0; } - host_cpuid(0x80000000, 0, &eax, &ebx, &ecx, &edx); - x86_cpu_def->xlevel = eax; + x86_cpu_def->xlevel = kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX); + x86_cpu_def->ext2_features = + kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX); + x86_cpu_def->ext3_features = + kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_ECX); - host_cpuid(0x80000001, 0, &eax, &ebx, &ecx, &edx); - x86_cpu_def->ext2_features = edx; - x86_cpu_def->ext3_features = ecx; cpu_x86_fill_model_id(x86_cpu_def->model_id); x86_cpu_def->vendor_override = 0; x86_cpu_def->pmu_passthrough = true; -- 1.7.11.7