WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] x86 hvm: Move CPUID.0xd (XSAVE) configura

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86 hvm: Move CPUID.0xd (XSAVE) configuration into libxc.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 23 Dec 2010 05:35:18 -0800
Delivery-date: Thu, 23 Dec 2010 05:48:20 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1292579662 0
# Node ID 5f10b4c2c24bf51303e35504e848d01fbf9ffd63
# Parent  7d567f932e0bc83ae84a6a41e6a85d89fb69c1b1
x86 hvm: Move CPUID.0xd (XSAVE) configuration into libxc.

Signed-off-by: Keir Fraser <keir@xxxxxxx>
---
 tools/libxc/xc_cpuid_x86.c |   57 +++++++++++++++++++++++++++++++++++++++++----
 xen/arch/x86/hvm/hvm.c     |   35 ---------------------------
 2 files changed, 53 insertions(+), 39 deletions(-)

diff -r 7d567f932e0b -r 5f10b4c2c24b tools/libxc/xc_cpuid_x86.c
--- a/tools/libxc/xc_cpuid_x86.c        Fri Dec 17 09:25:00 2010 +0000
+++ b/tools/libxc/xc_cpuid_x86.c        Fri Dec 17 09:54:22 2010 +0000
@@ -171,7 +171,8 @@ static void xc_cpuid_hvm_policy(
     DECLARE_DOMCTL;
     char brand[13];
     unsigned long pae;
-    int is_pae, xsave_supported;
+    int is_pae;
+    uint64_t xfeature_mask;
 
     xc_get_hvm_param(xch, domid, HVM_PARAM_PAE_ENABLED, &pae);
     is_pae = !!pae;
@@ -181,7 +182,7 @@ static void xc_cpuid_hvm_policy(
     domctl.cmd = XEN_DOMCTL_getvcpuextstate;
     domctl.domain = domid;
     do_domctl(xch, &domctl);
-    xsave_supported = (domctl.u.vcpuextstate.xfeature_mask != 0);
+    xfeature_mask = domctl.u.vcpuextstate.xfeature_mask;
 
     switch ( input[0] )
     {
@@ -204,7 +205,7 @@ static void xc_cpuid_hvm_policy(
                     bitmaskof(X86_FEATURE_SSE4_2) |
                     bitmaskof(X86_FEATURE_POPCNT) |
                     bitmaskof(X86_FEATURE_AES) |
-                    (xsave_supported ?
+                    ((xfeature_mask != 0) ?
                      (bitmaskof(X86_FEATURE_AVX) |
                       bitmaskof(X86_FEATURE_XSAVE)) : 0));
 
@@ -242,6 +243,46 @@ static void xc_cpuid_hvm_policy(
             clear_bit(X86_FEATURE_PAE, regs[3]);
         break;
 
+    case 0x0000000d:
+#define XSTATE_FP       (1 << 0)
+#define XSTATE_SSE      (1 << 1)
+#define XSTATE_YMM      (1 << 2)
+#define XSAVEOPT        (1 << 0)
+#define XSTATE_YMM_SIZE 256
+        if ( xfeature_mask == 0 )
+        {
+            regs[0] = regs[1] = regs[2] = regs[3] = 0;
+            break;
+        }
+        switch ( input[1] )
+        {
+        case 0:
+            /* We only enable the features we know. */
+            regs[0] = xfeature_mask;
+            /* FP/SSE + XSAVE.HEADER + YMM. */
+            regs[2] = 512 + 64;
+            if ( regs[0] & XSTATE_YMM )
+                regs[2] += XSTATE_YMM_SIZE;
+            regs[1] = regs[2];
+            regs[3] = 0;
+            break;
+        case 1:
+            regs[0] &= XSAVEOPT;
+            regs[1] = regs[2] = regs[3] = 0;
+            break;
+        case 2:
+            if ( !(xfeature_mask & XSTATE_YMM) )
+                break;
+            regs[0] = XSTATE_YMM_SIZE;
+            regs[1] = 512 + 64; /* FP/SSE + XSAVE.HEADER */
+            regs[2] = regs[3] = 0;
+            break;
+        default:
+            regs[0] = regs[1] = regs[2] = regs[3] = 0;
+            break;
+        }
+        break;
+
     case 0x80000000:
         if ( regs[0] > DEF_MAX_EXT )
             regs[0] = DEF_MAX_EXT;
@@ -373,6 +414,7 @@ static void xc_cpuid_pv_policy(
         break;
     case 5: /* MONITOR/MWAIT */
     case 0xa: /* Architectural Performance Monitor Features */
+    case 0xd: /* XSAVE */
     case 0x8000000a: /* SVM revision and features */
     case 0x8000001b: /* Instruction Based Sampling */
         regs[0] = regs[1] = regs[2] = regs[3] = 0;
@@ -468,12 +510,19 @@ int xc_cpuid_apply_policy(xc_interface *
                 if ( (regs[0] & 0x1f) != 0 )
                     continue;
             }
+
+            /* XSAVE information, subleaves 0-2. */
+            if ( (input[0] == 0xd) && (input[1]++ < 2) )
+                continue;
         }
 
         input[0]++;
-        input[1] = (input[0] == 4) ? 0 : XEN_CPUID_INPUT_UNUSED;
         if ( !(input[0] & 0x80000000u) && (input[0] > base_max ) )
             input[0] = 0x80000000u;
+
+        input[1] = XEN_CPUID_INPUT_UNUSED;
+        if ( (input[0] == 4) || (input[0] == 0xd) )
+            input[1] = 0;
 
         if ( (input[0] & 0x80000000u) && (input[0] > ext_max) )
             break;
diff -r 7d567f932e0b -r 5f10b4c2c24b xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Fri Dec 17 09:25:00 2010 +0000
+++ b/xen/arch/x86/hvm/hvm.c    Fri Dec 17 09:54:22 2010 +0000
@@ -2144,41 +2144,6 @@ void hvm_cpuid(unsigned int input, unsig
         /* Fix the x2APIC identifier. */
         *edx = v->vcpu_id * 2;
         break;
-    case 0xd:
-        if ( cpu_has_xsave )
-        {
-            /*
-             *  Fix up "Processor Extended State Enumeration". We present
-             *  FPU(bit0), SSE(bit1) and YMM(bit2) to HVM guest for now.
-             */
-            *eax = *ebx = *ecx = *edx = 0;
-            switch ( count )
-            {
-            case 0:
-                /* No HW defines bit in EDX yet. */
-                *edx = 0;
-                /* We only enable the features we know. */
-                *eax = xfeature_mask;
-                /* FP/SSE + XSAVE.HEADER + YMM. */
-                *ecx = 512 + 64 + ((*eax & XSTATE_YMM) ? XSTATE_YMM_SIZE : 0);
-                /* Let ebx equal ecx at present. */
-                *ebx = *ecx;
-                break;
-            case 2:
-                if ( !(xfeature_mask & XSTATE_YMM) )
-                    break;
-                *eax = XSTATE_YMM_SIZE;
-                *ebx = XSTATE_YMM_OFFSET;
-                break;
-            case 1:
-                if ( cpu_has_xsaveopt )
-                    *eax = XSAVEOPT;
-                break;
-            default:
-                break;
-            }
-        }
-        break;
     case 0x80000001:
         /* We expose RDTSCP feature to guest only when
            tsc_mode == TSC_MODE_DEFAULT and host_tsc_is_safe() returns 1 */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86 hvm: Move CPUID.0xd (XSAVE) configuration into libxc., Xen patchbot-unstable <=