[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Re: [PATCH] x86: add strictly sanity check for XSAVE/XRSTOR
On 19/02/2011 01:21, "Kay, Allen M" <allen.m.kay@xxxxxxxxx> wrote: > This patch was meant to address that checking cpu_has_xsave is not enough. Well obviously it is, else the new checks would not be coded as assertions. > Since it only checks the availability of the feature but it does not check > whether memory has allocated properly or not. It is possible that xsave can > be used without memory being properly allocated and results in clobbering of > memory. We have already encountered two random boot failures caused by xsave > patch in the past due to this so we want to put some safeguard to ensure this > will not happen again. > > Maybe the proper thing to do is to have a new function call xsave_enabled(), > this function then checks for whether memory has allocated properly in > addition to checking cpu_has_xsave. > > What do you think or do you have a better suggestion? Yeah, a new function xsave_enabled() which encapsulates the check of cpu_has_xsave, plus your new assertions, would be acceptable I think. -- Keir > Allen > > -----Original Message----- > From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx > [mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Keir Fraser > Sent: Thursday, February 17, 2011 11:13 PM > To: Wei, Gang; xen-devel@xxxxxxxxxxxxxxxxxxx > Cc: wei.huang2@xxxxxxx > Subject: [Xen-devel] Re: [PATCH] x86: add strictly sanity check for > XSAVE/XRSTOR > > On 18/02/2011 02:45, "Wei, Gang" <gang.wei@xxxxxxxxx> wrote: > >> This patch is trying to make issues around XSAVE/XRSTOR induced in future >> easy >> to be exposed. > > The fact that xsave_alloc_save_area() is called unconditionally on the vcpu > allocation path suffices I think. It's pretty easy to eyeball that no > successfully initialised non-idle vcpu can have an xsave area smaller than > min_size. > > I like assertions a lot, but not carpet bombed all over the code. > > -- Keir > > >> 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. >> */ > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |