[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86: Clean up vcpu initialisation (especially xsave save area)



# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1289916553 0
# Node ID a6f9006a1d70a3d8654d07313862c2c982c95875
# Parent  894d10d315c2e714f7c3f2e4c0f12c3097e20d13
x86: Clean up vcpu initialisation (especially xsave save area)

Signed-off-by: Keir Fraser <keir@xxxxxxx>
---
 xen/arch/x86/domain.c      |   84 ++++++++++++++++++---------------------------
 xen/arch/x86/i387.c        |   27 ++++++++++++--
 xen/include/asm-x86/i387.h |    5 +-
 3 files changed, 61 insertions(+), 55 deletions(-)

diff -r 894d10d315c2 -r a6f9006a1d70 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Tue Nov 16 13:01:43 2010 +0000
+++ b/xen/arch/x86/domain.c     Tue Nov 16 14:09:13 2010 +0000
@@ -343,60 +343,44 @@ int vcpu_initialise(struct vcpu *v)
 
     paging_vcpu_init(v);
 
-    if ( cpu_has_xsave )
-    {
-        /* XSAVE/XRSTOR requires the save area be 64-byte-boundary aligned. */
-        void *xsave_area = _xmalloc(xsave_cntxt_size, 64);
-        if ( xsave_area == NULL )
-            return -ENOMEM;
-
-        xsave_init_save_area(xsave_area);
-        v->arch.xsave_area = xsave_area;
-        v->arch.xcr0 = XSTATE_FP_SSE;
-        v->arch.xcr0_accum = XSTATE_FP_SSE;
-    }
+    v->arch.perdomain_ptes = perdomain_ptes(d, v);
+
+    spin_lock_init(&v->arch.shadow_ldt_lock);
+
+    if ( (rc = xsave_alloc_save_area(v)) != 0 )
+        return rc;
 
     if ( is_hvm_domain(d) )
     {
         if ( (rc = hvm_vcpu_initialise(v)) != 0 )
-        {
-            xfree(v->arch.xsave_area);
-            return rc;
-        }
-    }
-    else
-    {
-        /* PV guests by default have a 100Hz ticker. */
-        if ( !is_idle_domain(d) )
-            v->periodic_period = MILLISECS(10);
-
-        /* PV guests get an emulated PIT too for video BIOSes to use. */
-        if ( !is_idle_domain(d) && (v->vcpu_id == 0) )
-            pit_init(v, cpu_khz);
-
-        v->arch.schedule_tail = continue_nonidle_domain;
-        v->arch.ctxt_switch_from = paravirt_ctxt_switch_from;
-        v->arch.ctxt_switch_to   = paravirt_ctxt_switch_to;
-
-        if ( is_idle_domain(d) )
-        {
-            v->arch.schedule_tail = continue_idle_domain;
-            v->arch.cr3           = __pa(idle_pg_table);
-        }
-
-        v->arch.guest_context.ctrlreg[4] =
-            real_cr4_to_pv_guest_cr4(mmu_cr4_features);
-    }
-
-    v->arch.perdomain_ptes = perdomain_ptes(d, v);
-
-    spin_lock_init(&v->arch.shadow_ldt_lock);
-
-    rc = 0;
-    if ( is_pv_32on64_vcpu(v) )
-        rc = setup_compat_l4(v);
+            xsave_free_save_area(v);
+        return rc;
+    }
+
+    /* PV guests by default have a 100Hz ticker. */
+    if ( !is_idle_domain(d) )
+        v->periodic_period = MILLISECS(10);
+
+    /* PV guests get an emulated PIT too for video BIOSes to use. */
+    if ( !is_idle_domain(d) && (v->vcpu_id == 0) )
+        pit_init(v, cpu_khz);
+
+    v->arch.schedule_tail = continue_nonidle_domain;
+    v->arch.ctxt_switch_from = paravirt_ctxt_switch_from;
+    v->arch.ctxt_switch_to   = paravirt_ctxt_switch_to;
+
+    if ( is_idle_domain(d) )
+    {
+        v->arch.schedule_tail = continue_idle_domain;
+        v->arch.cr3           = __pa(idle_pg_table);
+    }
+
+    v->arch.guest_context.ctrlreg[4] =
+        real_cr4_to_pv_guest_cr4(mmu_cr4_features);
+
+    rc = is_pv_32on64_vcpu(v) ? setup_compat_l4(v) : 0;
     if ( rc )
-        xfree(v->arch.xsave_area);
+        xsave_free_save_area(v);
 
     return rc;
 }
@@ -406,7 +390,7 @@ void vcpu_destroy(struct vcpu *v)
     if ( is_pv_32on64_vcpu(v) )
         release_compat_l4(v);
 
-    xfree(v->arch.xsave_area);
+    xsave_free_save_area(v);
 
     if ( is_hvm_vcpu(v) )
         hvm_vcpu_destroy(v);
diff -r 894d10d315c2 -r a6f9006a1d70 xen/arch/x86/i387.c
--- a/xen/arch/x86/i387.c       Tue Nov 16 13:01:43 2010 +0000
+++ b/xen/arch/x86/i387.c       Tue Nov 16 14:09:13 2010 +0000
@@ -204,12 +204,33 @@ void xsave_init(void)
     }
 }
 
-void xsave_init_save_area(void *save_area)
-{
+int xsave_alloc_save_area(struct vcpu *v)
+{
+    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;
 }
 
 /*
diff -r 894d10d315c2 -r a6f9006a1d70 xen/include/asm-x86/i387.h
--- a/xen/include/asm-x86/i387.h        Tue Nov 16 13:01:43 2010 +0000
+++ b/xen/include/asm-x86/i387.h        Tue Nov 16 14:09:13 2010 +0000
@@ -17,8 +17,9 @@ extern unsigned int xsave_cntxt_size;
 extern unsigned int xsave_cntxt_size;
 extern u64 xfeature_mask;
 
-extern void xsave_init(void);
-extern void xsave_init_save_area(void *save_area);
+void xsave_init(void);
+int xsave_alloc_save_area(struct vcpu *v);
+void xsave_free_save_area(struct vcpu *v);
 
 #define XSTATE_FP       (1 << 0)
 #define XSTATE_SSE      (1 << 1)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.