aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/i387.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2010-11-16 14:09:13 +0000
committerKeir Fraser <keir@xen.org>2010-11-16 14:09:13 +0000
commit561e9179370c6927160eb797e1dccc5351d13eb3 (patch)
tree234ffc9f15a18f3dd1d128adca7a70efdd4be1de /xen/arch/x86/i387.c
parent430203d65f9e17b22b4a7ba404f535a7bba1a1ff (diff)
downloadxen-561e9179370c6927160eb797e1dccc5351d13eb3.tar.gz
xen-561e9179370c6927160eb797e1dccc5351d13eb3.tar.bz2
xen-561e9179370c6927160eb797e1dccc5351d13eb3.zip
x86: Clean up vcpu initialisation (especially xsave save area)
Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/i387.c')
-rw-r--r--xen/arch/x86/i387.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c
index 1398b8fa5b..82dd88e920 100644
--- a/xen/arch/x86/i387.c
+++ b/xen/arch/x86/i387.c
@@ -204,12 +204,33 @@ void xsave_init(void)
}
}
-void xsave_init_save_area(void *save_area)
+int xsave_alloc_save_area(struct vcpu *v)
{
- memset(save_area, 0, xsave_cntxt_size);
+ void *save_area;
+
+ if ( !cpu_has_xsave )
+ return 0;
+
+ /* XSAVE/XRSTOR requires the save area be 64-byte-boundary aligned. */
+ save_area = _xmalloc(xsave_cntxt_size, 64);
+ if ( save_area == NULL )
+ return -ENOMEM;
+ memset(save_area, 0, xsave_cntxt_size);
((u32 *)save_area)[6] = 0x1f80; /* MXCSR */
*(uint64_t *)(save_area + 512) = XSTATE_FP_SSE; /* XSETBV */
+
+ v->arch.xsave_area = save_area;
+ v->arch.xcr0 = XSTATE_FP_SSE;
+ v->arch.xcr0_accum = XSTATE_FP_SSE;
+
+ return 0;
+}
+
+void xsave_free_save_area(struct vcpu *v)
+{
+ xfree(v->arch.xsave_area);
+ v->arch.xsave_area = NULL;
}
/*