FPU LWP 2/5: add mask option to xsave/xrstor
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.
Signed-off-by Wei Huang <[email protected]>
# 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.
Signed-off-by Wei Huang <[email protected]>
xen/arch/x86/i387.c +16 -10
@@ -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; asmvolatile (".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; asmvolatile (".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; asmvolatile (".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
@@ -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