diff options
author | Jan Beulich <jbeulich@suse.com> | 2011-11-18 09:22:45 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2011-11-18 09:22:45 +0100 |
commit | 04678eb8f30a83620fa2c960431dfe4fb40d86f2 (patch) | |
tree | c2caef081e1024ab7b765435f108b025f5aa12aa /xen/arch/x86/xstate.c | |
parent | 8eca0db0e836a081d873de7e9eefb3763f065780 (diff) | |
download | xen-04678eb8f30a83620fa2c960431dfe4fb40d86f2.tar.gz xen-04678eb8f30a83620fa2c960431dfe4fb40d86f2.tar.bz2 xen-04678eb8f30a83620fa2c960431dfe4fb40d86f2.zip |
x86/xsave: provide guests with finit-like environment
Without the use of xsave, guests get their initial floating point
environment set up with finit. At least NetWare actually depends on
this (in particular on all exceptions being masked), so to be
consistent set the same environment also when using xsave. This is
also in line with all SSE exceptions getting masked initially.
To avoid further fragile casts in xstate_alloc_save_area() the patch
also changes xsave_struct's fpu_see member to have actually usable
fields.
The patch was tested in its technically identical, but modified-file-
wise different 4.1.2 version.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Charles Arnold <carnold@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/xstate.c')
-rw-r--r-- | xen/arch/x86/xstate.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c index 8b9c5583f6..e4de1429ea 100644 --- a/xen/arch/x86/xstate.c +++ b/xen/arch/x86/xstate.c @@ -97,7 +97,7 @@ bool_t xsave_enabled(const struct vcpu *v) int xstate_alloc_save_area(struct vcpu *v) { - void *save_area; + struct xsave_struct *save_area; if ( !cpu_has_xsave || is_idle_vcpu(v) ) return 0; @@ -109,8 +109,9 @@ int xstate_alloc_save_area(struct vcpu *v) if ( save_area == NULL ) return -ENOMEM; - ((u32 *)save_area)[6] = 0x1f80; /* MXCSR */ - *(uint64_t *)(save_area + 512) = XSTATE_FP_SSE; /* XSETBV */ + save_area->fpu_sse.fcw = FCW_DEFAULT; + save_area->fpu_sse.mxcsr = MXCSR_DEFAULT; + save_area->xsave_hdr.xstate_bv = XSTATE_FP_SSE; v->arch.xsave_area = save_area; v->arch.xcr0 = XSTATE_FP_SSE; |