From patchwork Tue Mar 21 18:17:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Durrant X-Patchwork-Id: 9637269 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id EC8F660216 for ; Tue, 21 Mar 2017 18:19:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E33EE2041F for ; Tue, 21 Mar 2017 18:19:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D84B12833B; Tue, 21 Mar 2017 18:19:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 64FA82041F for ; Tue, 21 Mar 2017 18:19:46 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cqOLa-0000Vy-V0; Tue, 21 Mar 2017 18:17:30 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cqOLZ-0000Uk-Ew for xen-devel@lists.xenproject.org; Tue, 21 Mar 2017 18:17:29 +0000 Received: from [85.158.143.35] by server-5.bemta-6.messagelabs.com id 73/E3-27545-83E61D85; Tue, 21 Mar 2017 18:17:28 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprCIsWRWlGSWpSXmKPExsXitHSDva5F3sU Ig5mT+Sy+b5nM5MDocfjDFZYAxijWzLyk/IoE1ow7nQ3MBW9VK95fusDawLhDrouRk0NCwF/i +KR9TCA2m4COxNSnl1i7GDk4RARUJG7vNQAxmQXKJTom1IJUCAuESxx80sYIYrMIqEocmH2VB cTmFXCT2HDoGCPERDmJ88d/MoPYnALuEt82bQKLCwHVdHceZIKwVSTWT53FBtErKHFy5hOwOc wCEhIHX7xgnsDIOwtJahaS1AJGplWM6sWpRWWpRbqGeklFmekZJbmJmTm6hgZmermpxcWJ6ak 5iUnFesn5uZsYgWHDAAQ7GHc+dzrEKMnBpCTKm+h0MUKILyk/pTIjsTgjvqg0J7X4EKMMB4eS BO/LHKCcYFFqempFWmYOMIBh0hIcPEoivG9A0rzFBYm5xZnpEKlTjMYcc2bvfsPEcathzxsmI Za8/LxUKXHe2SClAiClGaV5cINgkXWJUVZKmJcR6DQhnoLUotzMElT5V4ziHIxKwrxnQabwZO aVwO17BXQKE9ApZXsugJxSkoiQkmpglA3/Pi1sv+mLDSvSUmevFz3144n7kWli3zZvaOaf5D1 /w67X1Ywzil657fhg0JX+LnTVluWz+06XzSl9pmqbJKFq1RYQxZq87vyyb8s5NHN9r0qe2PKR j9NP6Pf96CA3/3XbQ6RXip3j8tx0Iibb60ZPbK7rAUueZCu51Q0slQaH3yxkWaXwT4mlOCPRU Iu5qDgRANaxdZCnAgAA X-Env-Sender: prvs=246d8669f=Paul.Durrant@citrix.com X-Msg-Ref: server-9.tower-21.messagelabs.com!1490120244!63374732!3 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 8243 invoked from network); 21 Mar 2017 18:17:27 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP; 21 Mar 2017 18:17:27 -0000 X-IronPort-AV: E=Sophos;i="5.36,200,1486425600"; d="scan'208";a="424078515" From: Paul Durrant To: Date: Tue, 21 Mar 2017 18:17:18 +0000 Message-ID: <1490120242-3587-3-git-send-email-paul.durrant@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1490120242-3587-1-git-send-email-paul.durrant@citrix.com> References: <1490120242-3587-1-git-send-email-paul.durrant@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper , Paul Durrant , Jan Beulich Subject: [Xen-devel] [PATCH v3 2/6] x86/viridian: don't put Xen version information in CPUID leaf 2 X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP The Hypervisor Top Level Functional Specification v5.0a states in section 2.5: "The hypervisor version information is encoded in leaf 0x40000002. Two version numbers are provided: the main version and the service version. The main version includes a major and minor version number and a build number. These correspond to Microsoft Windows release numbers." It also goes on to advise clients (i.e. guest versions of Windows) to use the following algorithm to determine compatibility with the hypervisor enlightenments: if greater than { your version is compatible } else if equal to and greater than or equal to { your version is compatible } else { your version is NOT compatible } So, clearly putting Xen hypervisor version information in that leaf is spurious, but we probably get away with it because Xen's major version is lower than the major version of Windows in which Hyper-V first appeared (Server 2008). This patch changes the leaf to use the kernel major and minor versions, and build number from Windows Server 2008 (64-bit) by default. These default values can be overriden from the Xen command line using new 'viridian-version' parameter. Signed-off-by: Paul Durrant --- Cc: Jan Beulich Cc: Andrew Cooper v3: - Use a combined version parameter v2: - Use full version information (including build number) from Windows Server 2008 - Add command line parameters to allow version information to be overridden --- docs/misc/xen-command-line.markdown | 8 ++++++ xen/arch/x86/hvm/viridian.c | 50 +++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index bad20db..f029e66 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -1616,6 +1616,14 @@ The optional `keep` parameter causes Xen to continue using the vga console even after dom0 has been started. The default behaviour is to relinquish control to dom0. +### viridian-version +> `= ,,` + +> Default: `6,0,1772` + +, and must be integers specified in hexadecimal. The values will be +encoded in guest CPUID 0x40000002 if viridian enlightenments are enabled. + ### vpid (Intel) > `= ` diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c index a71f928..8a5c831 100644 --- a/xen/arch/x86/hvm/viridian.c +++ b/xen/arch/x86/hvm/viridian.c @@ -106,6 +106,19 @@ typedef struct { #define CPUID6A_MSR_BITMAPS (1 << 1) #define CPUID6A_NESTED_PAGING (1 << 3) +/* + * Version and build number reported by CPUID leaf 2 + * + * These numbers are chosen to match the version numbers reported by + * Windows Server 2008. + */ +static char __initdata viridian_version[sizeof("0xVVVV,0xVVVV,0xVVVVVVVV")] = ""; +string_param("viridian-version", viridian_version); + +static uint16_t viridian_major = 6; +static uint16_t viridian_minor = 0; +static uint32_t viridian_build = 0x1772; + void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) { @@ -134,8 +147,8 @@ void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf, own version number. */ if ( d->arch.hvm_domain.viridian.guest_os_id.raw == 0 ) break; - res->a = 1; /* Build number */ - res->b = (xen_major_version() << 16) | xen_minor_version(); + res->a = viridian_build; + res->b = ((uint32_t)viridian_major << 16) | viridian_minor; res->c = 0; /* SP */ res->d = 0; /* Service branch and number */ break; @@ -910,6 +923,39 @@ static int viridian_load_vcpu_ctxt(struct domain *d, hvm_domain_context_t *h) HVM_REGISTER_SAVE_RESTORE(VIRIDIAN_VCPU, viridian_save_vcpu_ctxt, viridian_load_vcpu_ctxt, 1, HVMSR_PER_VCPU); +static int __init viridian_init(void) +{ + char *t, *v = viridian_version; + unsigned int n[3], i = 0; + + if ( *v == '\0' ) + return 0; + + while ( (t = strsep(&v, ",")) != NULL ) + { + const char *e; + + n[i++] = simple_strtoul(t, &e, 16); + if ( *e != '\0' ) + goto fail; + } + if ( i != 3 ) + goto fail; + + if (n[0] > 0xffff || n[1] > 0xffff) + goto fail; + + viridian_major = n[0]; + viridian_minor = n[1]; + viridian_build = n[2]; + return 0; + +fail: + printk(XENLOG_WARNING "Invalid viridian-version, using default\n"); + return 0; +} +__initcall(viridian_init); + /* * Local variables: * mode: C