Skip to contentSkip to conversation

FPU LWP 2/5: add mask option to xsave/xrstor

RFC PATCH New Wei Huang 1 participant 1 message Apr 14, 2011

lore
Share & tools
lore

Wei Huang

author
#0 lore raw

RFC PATCH 1/1 FPU LWP 2/5: add mask option to xsave/xrstor

This patch adds a mask option to xsave/xrstor. This mask is used by xsave and xrstor instructions to selectively save/restore memory area.

# HG changeset patch
# User Wei Huang <[email protected]>
# Date 1302811998 18000
# Branch lwp3
# Node ID f5c4d99cde695bd0342a96d3ea6d5b34bd6047af # Parent 4ed4e3d9106e691dddf3bbf54afd935ef0a9000f
FPU: Add mask option to xsave/xrstor

This patch adds a mask option to xsave/xrstor. This mask is used by xsave and xrstor instructions to selectively save/restore memory area.

xen/arch/x86/i387.c +16 -10
diff -r 4ed4e3d9106e -r f5c4d99cde69 xen/arch/x86/i387.c
@@ -127,36 +127,42 @@
     return cpu_has_xsave;	
 }
 
-static void xsave(struct vcpu *v)
+static void xsave(struct vcpu *v, uint64_t mask)
 {
     struct xsave_struct *ptr = v->arch.xsave_area;
+    uint32_t hmask = mask >> 32;
+    uint32_t lmask = mask;
 
     asm volatile (
         ".byte " REX_PREFIX "0x0f,0xae,0x27"
         :
-        : "a" (-1), "d" (-1), "D"(ptr)
+        : "a" (lmask), "d" (hmask), "D"(ptr)
         : "memory" );
 }
 
-static void xsaveopt(struct vcpu *v)
+static void xsaveopt(struct vcpu *v, uint64_t mask)
 {
     struct xsave_struct *ptr = v->arch.xsave_area;
+    uint32_t hmask = mask >> 32;
+    uint32_t lmask = mask;
 
     asm volatile (
         ".byte " REX_PREFIX "0x0f,0xae,0x37"
         :
-        : "a" (-1), "d" (-1), "D"(ptr)
+        : "a" (lmask), "d" (hmask), "D"(ptr)
         : "memory" );
 }
 
-static void xrstor(struct vcpu *v)
+static void xrstor(struct vcpu *v, uint64_t mask)
 {
     struct xsave_struct *ptr = v->arch.xsave_area;
+    uint32_t hmask = mask >> 32;
+    uint32_t lmask = mask;
 
     asm volatile (
         ".byte " REX_PREFIX "0x0f,0xae,0x2f"
         :
-        : "m" (*ptr), "a" (-1), "d" (-1), "D"(ptr) );
+        : "m" (*ptr), "a" (lmask), "d" (hmask), "D"(ptr) );
 }
 
 /******************************/
@@ -185,7 +191,7 @@
      * we set all supported feature mask before doing save/restore.
      */
     set_xcr0(v->arch.xcr0_accum);
-    xrstor(v);
+    xrstor(v, XCNTXT_MASK);
     set_xcr0(v->arch.xcr0);
 }
 
@@ -270,10 +276,10 @@
      */
     set_xcr0(v->arch.xcr0_accum);
     if ( cpu_has_xsaveopt )
-        xsaveopt(v);
+        xsaveopt(v, XCNTXT_MASK);
     else
-        xsave(v);
-    set_xcr0(v->arch.xcr0);    
+        xsave(v, XCNTXT_MASK);
+    set_xcr0(v->arch.xcr0);
 }
 
 /* Save x87 FPU, MMX, SSE and SSE2 state */
xen/include/asm-x86/i387.h +11 -9
diff -r 4ed4e3d9106e -r f5c4d99cde69 xen/include/asm-x86/i387.h
@@ -23,15 +23,17 @@
 extern u64 xfeature_mask;
 
 #define XSAVE_AREA_MIN_SIZE (512 + 64) /* FP/SSE + XSAVE.HEADER */
-#define XSTATE_FP       (1ULL << 0)
-#define XSTATE_SSE      (1ULL << 1)
-#define XSTATE_YMM      (1ULL << 2)
-#define XSTATE_LWP      (1ULL << 62) /* AMD lightweight profiling */
-#define XSTATE_FP_SSE   (XSTATE_FP | XSTATE_SSE)
-#define XCNTXT_MASK     (XSTATE_FP | XSTATE_SSE | XSTATE_YMM | XSTATE_LWP)
-#define XSTATE_YMM_OFFSET  XSAVE_AREA_MIN_SIZE
-#define XSTATE_YMM_SIZE    256
-#define XSAVEOPT        (1 << 0)
+#define XSTATE_YMM_OFFSET   XSAVE_AREA_MIN_SIZE
+#define XSTATE_YMM_SIZE     256
+
+#define XSTATE_FP           (1ULL << 0)
+#define XSTATE_SSE          (1ULL << 1)
+#define XSTATE_YMM          (1ULL << 2)
+#define XSTATE_LWP          (1ULL << 62) /* AMD lightweight profiling */
+#define XSTATE_FP_SSE       (XSTATE_FP | XSTATE_SSE)
+#define XCNTXT_MASK         (XSTATE_FP | XSTATE_SSE | XSTATE_YMM | XSTATE_LWP)
+
+#define XSAVEOPT            (1 << 0)
 
 #define XCR_XFEATURE_ENABLED_MASK   0
 

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel