From patchwork Fri Dec 28 20:01:23 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Mammedov X-Patchwork-Id: 208581 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 93C8F2C007C for ; Sat, 29 Dec 2012 07:42:01 +1100 (EST) Received: from localhost ([::1]:43136 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tog9E-00061f-Hj for incoming@patchwork.ozlabs.org; Fri, 28 Dec 2012 15:03:16 -0500 Received: from eggs.gnu.org ([208.118.235.92]:40542) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tog8c-0004t3-Ei for qemu-devel@nongnu.org; Fri, 28 Dec 2012 15:02:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tog8a-0003TO-PR for qemu-devel@nongnu.org; Fri, 28 Dec 2012 15:02:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57262) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tog8a-0003TG-II for qemu-devel@nongnu.org; Fri, 28 Dec 2012 15:02:36 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qBSK2Z1Z025878 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Dec 2012 15:02:36 -0500 Received: from dell-pet610-01.lab.eng.brq.redhat.com (dell-pet610-01.lab.eng.brq.redhat.com [10.34.42.20]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qBSK2Owo012028; Fri, 28 Dec 2012 15:02:34 -0500 From: Igor Mammedov To: qemu-devel@nongnu.org Date: Fri, 28 Dec 2012 21:01:23 +0100 Message-Id: <1356724895-24118-9-git-send-email-imammedo@redhat.com> In-Reply-To: <1356724895-24118-1-git-send-email-imammedo@redhat.com> References: <1356724895-24118-1-git-send-email-imammedo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: ehabkost@redhat.com, afaerber@suse.de Subject: [Qemu-devel] [PATCH 08/20] target-i386: move kvm_check_features_against_host() check to realize time X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org kvm_check_features_against_host() should be called when features can't be changed and when features are convereted to properties it would be possible to change them until realize time, so correct way is to call kvm_check_features_against_host() in x86_cpu_realize() - calling kvm_check_features_against_host() makes sense only when qemu is compiled --enable-kvm, so move it inside CONFIG_KVM ifdef and compile it and other kvm specific functions only if CONFIG_KVM is defined to avoid *-user target build breakage. Signed-off-by: Igor Mammedov Reviewed-by: Eduardo Habkost --- v2: - squash in ifdef-ing kvm specific functions into this patch v3: - fit commit message into 80 column limit, no change to content --- target-i386/cpu.c | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 97cce89..d93bf5a 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -862,7 +862,6 @@ static int cpu_x86_fill_model_id(char *str) } return 0; } -#endif /* Fill a x86_def_t struct with information about the host CPU, and * the CPU features supported by the host hardware + host kernel @@ -871,7 +870,6 @@ static int cpu_x86_fill_model_id(char *str) */ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def) { -#ifdef CONFIG_KVM KVMState *s = kvm_state; uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0; @@ -930,7 +928,6 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def) * unsupported ones later. */ x86_cpu_def->svm_features = -1; -#endif /* CONFIG_KVM */ } static int unavailable_host_feature(struct model_features_t *f, uint32_t mask) @@ -954,19 +951,20 @@ static int unavailable_host_feature(struct model_features_t *f, uint32_t mask) * * This function may be called only if KVM is enabled. */ -static int kvm_check_features_against_host(x86_def_t *guest_def) +static int kvm_check_features_against_host(X86CPU *cpu) { + CPUX86State *env = &cpu->env; x86_def_t host_def; uint32_t mask; int rv, i; struct model_features_t ft[] = { - {&guest_def->features, &host_def.features, + {&env->cpuid_features, &host_def.features, ~0, feature_name, 0x00000000}, - {&guest_def->ext_features, &host_def.ext_features, + {&env->cpuid_ext_features, &host_def.ext_features, ~CPUID_EXT_HYPERVISOR, ext_feature_name, 0x00000001}, - {&guest_def->ext2_features, &host_def.ext2_features, + {&env->cpuid_ext2_features, &host_def.ext2_features, ~PPRO_FEATURES, ext2_feature_name, 0x80000000}, - {&guest_def->ext3_features, &host_def.ext3_features, + {&env->cpuid_ext3_features, &host_def.ext3_features, ~CPUID_EXT3_SVM, ext3_feature_name, 0x80000001}}; assert(kvm_enabled()); @@ -981,6 +979,7 @@ static int kvm_check_features_against_host(x86_def_t *guest_def) } return rv; } +#endif /* CONFIG_KVM */ static void x86_cpuid_version_get_family(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) @@ -1273,7 +1272,9 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *name) } } if (kvm_enabled() && name && strcmp(name, "host") == 0) { +#ifdef CONFIG_KVM kvm_cpu_fill_host(x86_cpu_def); +#endif } else if (!def) { return -1; } else { @@ -1428,10 +1429,6 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) x86_cpu_def->kvm_features &= ~minus_kvm_features; x86_cpu_def->svm_features &= ~minus_svm_features; x86_cpu_def->cpuid_7_0_ebx_features &= ~minus_7_0_ebx_features; - if (check_cpuid && kvm_enabled()) { - if (kvm_check_features_against_host(x86_cpu_def) && enforce_cpuid) - goto error; - } return 0; error: @@ -2106,6 +2103,12 @@ void x86_cpu_realize(Object *obj, Error **errp) env->cpuid_svm_features &= TCG_SVM_FEATURES; } else { #ifdef CONFIG_KVM + if (check_cpuid && kvm_check_features_against_host(cpu) + && enforce_cpuid) { + error_setg(errp, "Host's CPU doesn't support requested features"); + return; + } + filter_features_for_kvm(cpu); #endif }