diff options
author | Keir Fraser <keir@xen.org> | 2010-11-16 14:09:13 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2010-11-16 14:09:13 +0000 |
commit | 561e9179370c6927160eb797e1dccc5351d13eb3 (patch) | |
tree | 234ffc9f15a18f3dd1d128adca7a70efdd4be1de /xen/arch/x86/i387.c | |
parent | 430203d65f9e17b22b4a7ba404f535a7bba1a1ff (diff) | |
download | xen-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.c | 25 |
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; } /* |