From patchwork Mon Jun 22 21:47:24 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 31876 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n5MLiPLu020577 for ; Mon, 22 Jun 2009 21:44:25 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751089AbZFVVoT (ORCPT ); Mon, 22 Jun 2009 17:44:19 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751136AbZFVVoT (ORCPT ); Mon, 22 Jun 2009 17:44:19 -0400 Received: from outbound-dub.frontbridge.com ([213.199.154.16]:33054 "EHLO IE1EHSOBE003.bigfish.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751055AbZFVVoS (ORCPT ); Mon, 22 Jun 2009 17:44:18 -0400 Received: from mail71-dub-R.bigfish.com (10.5.252.3) by IE1EHSOBE003.bigfish.com (10.5.252.23) with Microsoft SMTP Server id 8.1.340.0; Mon, 22 Jun 2009 21:44:20 +0000 Received: from mail71-dub (localhost.localdomain [127.0.0.1]) by mail71-dub-R.bigfish.com (Postfix) with ESMTP id 47D1D650263; Mon, 22 Jun 2009 21:44:20 +0000 (UTC) X-SpamScore: 1 X-BigFish: VPS1(zzzz1202hzzz32i17ch62h) X-Spam-TCS-SCL: 1:0 Received: by mail71-dub (MessageSwitch) id 1245707059359095_18086; Mon, 22 Jun 2009 21:44:19 +0000 (UCT) Received: from ausb3extmailp02.amd.com (ausb3extmailp02.amd.com [163.181.251.22]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail71-dub.bigfish.com (Postfix) with ESMTP id F1095D70046; Mon, 22 Jun 2009 21:44:18 +0000 (UTC) Received: from ausb3twp01.amd.com (ausb3twp01.amd.com [163.181.250.37]) by ausb3extmailp02.amd.com (Switch-3.2.7/Switch-3.2.7) with ESMTP id n5MLiEj3017555; Mon, 22 Jun 2009 16:44:17 -0500 X-WSS-ID: 0KLNTPE-01-TFQ-01 Received: from sausexbh1.amd.com (sausexbh1.amd.com [163.181.22.101]) by ausb3twp01.amd.com (Tumbleweed MailGate 3.5.1) with ESMTP id 2419B1943D0; Mon, 22 Jun 2009 16:44:01 -0500 (CDT) Received: from sausexmb1.amd.com ([163.181.3.156]) by sausexbh1.amd.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 22 Jun 2009 16:44:13 -0500 Received: from SDRSEXMB1.amd.com ([172.20.3.116]) by sausexmb1.amd.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 22 Jun 2009 16:44:12 -0500 Received: from localhost.localdomain ([165.204.15.42]) by SDRSEXMB1.amd.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 22 Jun 2009 23:43:36 +0200 From: Andre Przywara To: aliguori@us.ibm.com CC: avi@redhat.com, qemu-devel@nongnu.org, kvm@vger.kernel.org, Andre Przywara Subject: [PATCH 1/2] allow hypervisor CPUID bit to be overriden Date: Mon, 22 Jun 2009 23:47:24 +0200 Message-ID: <1245707244-743-1-git-send-email-andre.przywara@amd.com> X-Mailer: git-send-email 1.6.1.3 X-OriginalArrivalTime: 22 Jun 2009 21:43:36.0720 (UTC) FILETIME=[7F809100:01C9F382] MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org KVM defaults to the hypervisor CPUID bit to be set, whereas pure QEMU clears it. On some occasions one want to set or clear it the other way round (for instance to get HyperV running inside a guest). Allow the default to be overridden on the command line and fix some whitespace damage on the way. Signed-off-by: Andre Przywara --- target-i386/helper.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-) diff --git a/target-i386/helper.c b/target-i386/helper.c index 8a76abd..529f962 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -44,7 +44,7 @@ static const char *ext_feature_name[] = { "pni" /* Intel,AMD sse3 */, NULL, NULL, "monitor", "ds_cpl", "vmx", NULL /* Linux smx */, "est", "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL, NULL, NULL, "dca", NULL, NULL, NULL, NULL, "popcnt", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, "hypervisor", }; static const char *ext2_feature_name[] = { "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce", @@ -59,30 +59,30 @@ static const char *ext3_feature_name[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; -static void add_flagname_to_bitmaps(char *flagname, uint32_t *features, - uint32_t *ext_features, - uint32_t *ext2_features, +static void add_flagname_to_bitmaps(const char *flagname, uint32_t *features, + uint32_t *ext_features, + uint32_t *ext2_features, uint32_t *ext3_features) { int i; int found = 0; - for ( i = 0 ; i < 32 ; i++ ) + for ( i = 0 ; i < 32 ; i++ ) if (feature_name[i] && !strcmp (flagname, feature_name[i])) { *features |= 1 << i; found = 1; } - for ( i = 0 ; i < 32 ; i++ ) + for ( i = 0 ; i < 32 ; i++ ) if (ext_feature_name[i] && !strcmp (flagname, ext_feature_name[i])) { *ext_features |= 1 << i; found = 1; } - for ( i = 0 ; i < 32 ; i++ ) + for ( i = 0 ; i < 32 ; i++ ) if (ext2_feature_name[i] && !strcmp (flagname, ext2_feature_name[i])) { *ext2_features |= 1 << i; found = 1; } - for ( i = 0 ; i < 32 ; i++ ) + for ( i = 0 ; i < 32 ; i++ ) if (ext3_feature_name[i] && !strcmp (flagname, ext3_feature_name[i])) { *ext3_features |= 1 << i; found = 1; @@ -330,6 +330,11 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model) goto error; memcpy(x86_cpu_def, def, sizeof(*def)); + if (kvm_enabled()) { + add_flagname_to_bitmaps("hypervisor", &plus_features, + &plus_ext_features, &plus_ext2_features, &plus_ext3_features); + } + featurestr = strtok(NULL, ","); while (featurestr) { @@ -1523,10 +1528,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, *ebx = (env->cpuid_apic_id << 24) | 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */ *ecx = env->cpuid_ext_features; *edx = env->cpuid_features; - - /* "Hypervisor present" bit required for Microsoft SVVP */ - if (kvm_enabled()) - *ecx |= (1 << 31); break; case 2: /* cache info: needed for Pentium Pro compatibility */