WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] x86: add strictly sanity check for XSAVE/XRSTOR

To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] x86: add strictly sanity check for XSAVE/XRSTOR
From: "Wei, Gang" <gang.wei@xxxxxxxxx>
Date: Fri, 18 Feb 2011 10:45:03 +0800
Accept-language: zh-CN, en-US
Acceptlanguage: zh-CN, en-US
Cc: "wei.huang2@xxxxxxx" <wei.huang2@xxxxxxx>, Keir Fraser <keir@xxxxxxx>, "Wei, Gang" <gang.wei@xxxxxxxxx>
Delivery-date: Thu, 17 Feb 2011 18:47:11 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AcvOSPtNY1iWQhS8TKOXCx9nhUW9CAAy6Ucg
Thread-topic: [PATCH] x86: add strictly sanity check for XSAVE/XRSTOR
This patch is trying to make issues around XSAVE/XRSTOR induced in future easy 
to be exposed.

Jimmy

x86: add strictly sanity check for XSAVE/XRSTOR

Signed-off-by: Wei Gang <gang.wei@xxxxxxxxx>

diff -r 137ad3347504 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c     Mon Feb 14 17:02:55 2011 +0000
+++ b/xen/arch/x86/domctl.c     Fri Feb 18 16:00:41 2011 +0800
@@ -1604,8 +1604,13 @@ void arch_get_info_guest(struct vcpu *v,
 
     /* Fill legacy context from xsave area first */
     if ( cpu_has_xsave )
+    {
+        ASSERT(xsave_cntxt_size >= XSAVE_AREA_MIN_SIZE);
+        ASSERT(v->arch.xsave_area);
+
         memcpy(v->arch.xsave_area, &v->arch.guest_context.fpu_ctxt,
                sizeof(v->arch.guest_context.fpu_ctxt));
+    }
 
     if ( !is_pv_32on64_domain(v->domain) )
         memcpy(c.nat, &v->arch.guest_context, sizeof(*c.nat)); diff -r 
137ad3347504 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Mon Feb 14 17:02:55 2011 +0000
+++ b/xen/arch/x86/hvm/hvm.c    Fri Feb 18 16:03:23 2011 +0800
@@ -777,6 +777,9 @@ static int hvm_load_cpu_ctxt(struct doma
     {
         struct xsave_struct *xsave_area = v->arch.xsave_area;
 
+        ASSERT(xsave_cntxt_size >= XSAVE_AREA_MIN_SIZE);
+        ASSERT(v->arch.xsave_area);
+
         memcpy(v->arch.xsave_area, ctxt.fpu_regs, sizeof(ctxt.fpu_regs));
         xsave_area->xsave_hdr.xstate_bv = XSTATE_FP_SSE;
         v->arch.xcr0_accum = XSTATE_FP_SSE; @@ -834,6 +837,7 @@ static int 
hvm_save_cpu_xsave_states(str
     if ( !cpu_has_xsave )
         return 0;   /* do nothing */
 
+    ASSERT(xsave_cntxt_size >= XSAVE_AREA_MIN_SIZE);
     for_each_vcpu ( d, v )
     {
         if ( _hvm_init_entry(h, CPU_XSAVE_CODE, v->vcpu_id, 
HVM_CPU_XSAVE_SIZE) ) @@ -846,8 +850,12 @@ static int 
hvm_save_cpu_xsave_states(str
         ctxt->xcr0 = v->arch.xcr0;
         ctxt->xcr0_accum = v->arch.xcr0_accum;
         if ( v->fpu_initialised )
+        {
+            ASSERT(v->arch.xsave_area);
+
             memcpy(&ctxt->save_area,
                 v->arch.xsave_area, xsave_cntxt_size);
+        }
     }
 
     return 0;
@@ -873,6 +881,9 @@ static int hvm_load_cpu_xsave_states(str
         gdprintk(XENLOG_ERR, "HVM restore: domain has no vcpu %u\n", vcpuid);
         return -EINVAL;
     }
+
+    ASSERT(xsave_cntxt_size >= XSAVE_AREA_MIN_SIZE);
+    ASSERT(v->arch.xsave_area);
 
     /* Customized checking for entry since our entry is of variable length */
     desc = (struct hvm_save_descriptor *)&h->data[h->cur]; diff -r 
137ad3347504 xen/arch/x86/i387.c
--- a/xen/arch/x86/i387.c       Mon Feb 14 17:02:55 2011 +0000
+++ b/xen/arch/x86/i387.c       Fri Feb 18 16:00:41 2011 +0800
@@ -71,6 +71,9 @@ void setup_fpu(struct vcpu *v)
 
     if ( cpu_has_xsave )
     {
+        ASSERT(xsave_cntxt_size >= XSAVE_AREA_MIN_SIZE);
+        ASSERT(v->arch.xsave_area);
+
         /*
          * XCR0 normally represents what guest OS set. In case of Xen itself, 
          * we set all supported feature mask before doing save/restore.
@@ -118,6 +121,9 @@ void save_init_fpu(struct vcpu *v)
 
     if ( cpu_has_xsave )
     {
+        ASSERT(xsave_cntxt_size >= XSAVE_AREA_MIN_SIZE);
+        ASSERT(v->arch.xsave_area);
+
         /* XCR0 normally represents what guest OS set. In case of Xen itself,
          * we set all accumulated feature mask before doing save/restore.
          */

Attachment: xsave_sanity_check.patch
Description: xsave_sanity_check.patch

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