[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] x86/viridian: don't put Xen version information in CPUID leaf 2



commit 422db534e80869aef8a89e220604c17ae4bea8a0
Author:     Paul Durrant <paul.durrant@xxxxxxxxxx>
AuthorDate: Thu Mar 23 15:51:14 2017 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Mar 23 15:51:14 2017 +0100

    x86/viridian: don't put Xen version information in CPUID leaf 2
    
    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 <your-main-version> greater than <hypervisor-main-version>
    {
        your version is compatible
    }
    else if <your-main-version> equal to <hypervisor-main-version> and
     <your-service-version> greater than or equal to 
<hypervisor-service-version>
    {
        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 <paul.durrant@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
 docs/misc/xen-command-line.markdown |  8 ++++++
 xen/arch/x86/hvm/viridian.c         | 56 +++++++++++++++++++++++++++++++++++--
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/docs/misc/xen-command-line.markdown 
b/docs/misc/xen-command-line.markdown
index bad20db..c81d693 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
+> `= [<major>],[<minor>],[<build>]`
+
+> Default: `6,0,0x1772`
+
+<major>, <minor> and <build> must be integers. The values will be
+encoded in guest CPUID 0x40000002 if viridian enlightenments are enabled.
+
 ### vpid (Intel)
 > `= <boolean>`
 
diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c
index b740224..d59294f 100644
--- a/xen/arch/x86/hvm/viridian.c
+++ b/xen/arch/x86/hvm/viridian.c
@@ -164,6 +164,16 @@ 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 uint16_t __read_mostly viridian_major = 6;
+static uint16_t __read_mostly viridian_minor = 0;
+static uint32_t __read_mostly viridian_build = 0x1772;
+
 void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf,
                            uint32_t subleaf, struct cpuid_leaf *res)
 {
@@ -194,8 +204,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;
@@ -990,6 +1000,48 @@ 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 void __init parse_viridian_version(char *arg)
+{
+    const char *t;
+    unsigned int n[3];
+    unsigned int i = 0;
+
+    n[0] = viridian_major;
+    n[1] = viridian_minor;
+    n[2] = viridian_build;
+
+    while ( (t = strsep(&arg, ",")) != NULL )
+    {
+        const char *e;
+
+        if ( *t == '\0' )
+            continue;
+
+        n[i++] = simple_strtoul(t, &e, 0);
+        if ( *e != '\0' )
+            goto fail;
+    }
+    if ( i != 3 )
+        goto fail;
+
+    if ( ((typeof(viridian_major))n[0] != n[0]) ||
+         ((typeof(viridian_minor))n[1] != n[1]) ||
+         ((typeof(viridian_build))n[2] != n[2]) )
+        goto fail;
+
+    viridian_major = n[0];
+    viridian_minor = n[1];
+    viridian_build = n[2];
+
+    printk("viridian-version = %#x,%#x,%#x\n",
+           viridian_major, viridian_minor, viridian_build);
+    return;
+
+ fail:
+    printk(XENLOG_WARNING "Invalid viridian-version, using default\n");
+}
+custom_param("viridian-version", parse_viridian_version);
+
 /*
  * Local variables:
  * mode: C
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.