From patchwork Fri Jan 11 02:10:17 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Mammedov X-Patchwork-Id: 211202 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 E3BE42C0180 for ; Fri, 11 Jan 2013 13:56:17 +1100 (EST) Received: from localhost ([::1]:55263 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtU7S-0007Tl-GH for incoming@patchwork.ozlabs.org; Thu, 10 Jan 2013 21:13:18 -0500 Received: from eggs.gnu.org ([208.118.235.92]:60646) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtU6U-000546-QI for qemu-devel@nongnu.org; Thu, 10 Jan 2013 21:12:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TtU6T-0000Vh-6b for qemu-devel@nongnu.org; Thu, 10 Jan 2013 21:12:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40724) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtU6S-0000VX-Ue for qemu-devel@nongnu.org; Thu, 10 Jan 2013 21:12:17 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0B2CGGJ003739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 10 Jan 2013 21:12:16 -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-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r0B2CAdv021266; Thu, 10 Jan 2013 21:12:15 -0500 From: Igor Mammedov To: qemu-devel@nongnu.org Date: Fri, 11 Jan 2013 03:10:17 +0100 Message-Id: <1357870231-26762-4-git-send-email-imammedo@redhat.com> In-Reply-To: <1357870231-26762-1-git-send-email-imammedo@redhat.com> References: <1357870231-26762-1-git-send-email-imammedo@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 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 03/17] 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() Signed-off-by: Igor Mammedov --- v3: - call kvm_check_features_against_host() outside of #ifdef CONFIG_KVM to avoid adding ifdefs in it and around unavailable_host_feature() - rebased on top of "disable kvm_mmu + -cpu "enforce" fixes (v3)" 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 | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index ea68bc0..c4ff761 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1022,27 +1022,28 @@ static int unavailable_host_feature(FeatureWordInfo *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, FEAT_1_EDX }, - {&guest_def->ext_features, &host_def.ext_features, + {&env->cpuid_ext_features, &host_def.ext_features, FEAT_1_ECX }, - {&guest_def->ext2_features, &host_def.ext2_features, + {&env->cpuid_ext2_features, &host_def.ext2_features, FEAT_8000_0001_EDX }, - {&guest_def->ext3_features, &host_def.ext3_features, + {&env->cpuid_ext3_features, &host_def.ext3_features, FEAT_8000_0001_ECX }, - {&guest_def->ext4_features, &host_def.ext4_features, + {&env->cpuid_ext4_features, &host_def.ext4_features, FEAT_C000_0001_EDX }, - {&guest_def->cpuid_7_0_ebx_features, &host_def.cpuid_7_0_ebx_features, + {&env->cpuid_7_0_ebx_features, &host_def.cpuid_7_0_ebx_features, FEAT_7_0_EBX }, - {&guest_def->svm_features, &host_def.svm_features, + {&env->cpuid_svm_features, &host_def.svm_features, FEAT_SVM }, - {&guest_def->kvm_features, &host_def.kvm_features, + {&env->cpuid_kvm_features, &host_def.kvm_features, FEAT_KVM }, }; @@ -1471,10 +1472,6 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features) x86_cpu_def->kvm_features &= ~minus_features[FEAT_KVM]; x86_cpu_def->svm_features &= ~minus_features[FEAT_SVM]; x86_cpu_def->cpuid_7_0_ebx_features &= ~minus_features[FEAT_7_0_EBX]; - if (check_cpuid && kvm_enabled()) { - if (kvm_check_features_against_host(x86_cpu_def) && enforce_cpuid) - goto error; - } return 0; error: @@ -2177,6 +2174,11 @@ void x86_cpu_realize(Object *obj, Error **errp) #ifdef CONFIG_KVM filter_features_for_kvm(cpu); #endif + if (check_cpuid && kvm_check_features_against_host(cpu) + && enforce_cpuid) { + error_setg(errp, "Host's CPU doesn't support requested features"); + return; + } } #ifndef CONFIG_USER_ONLY