[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/5] X86: Fix xsave bug for nonlazy xstates
On 19/11/13 10:46, Liu, Jinsong wrote: > From 0d6072a31977aa509d04e0b0dc1642508a1ed87b Mon Sep 17 00:00:00 2001 > From: Liu Jinsong <jinsong.liu@xxxxxxxxx> > Date: Tue, 19 Nov 2013 18:27:36 +0800 > Subject: [PATCH 1/5] X86: Fix xsave bug for nonlazy xstates > > Nonlazy xstates should be xsaved each time when vcpu_save_fpu. > Operation to nonlazy xstates will not trigger #NM exception, > so whenever vcpu scheduled in it got restored and whenever > scheduled out it should get saved. > > Currently this bug affects AMD LWP feature, and later Intel > MPX feature. With the bugfix both LWP and MPX will work fine. > > Signed-off-by: Liu Jinsong <jinsong.liu@xxxxxxxxx> > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > --- > xen/arch/x86/i387.c | 30 ++++++++++++++++++++++++++---- > 1 files changed, 26 insertions(+), 4 deletions(-) > > diff --git a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c > index 7649274..e7a590b 100644 > --- a/xen/arch/x86/i387.c > +++ b/xen/arch/x86/i387.c > @@ -133,10 +133,33 @@ static inline void fpu_frstor(struct vcpu *v) > /*******************************/ > /* FPU Save Functions */ > /*******************************/ > + > +static inline uint64_t fpu_xsave_mask(struct vcpu *v) > +{ > + if ( v->fpu_dirtied ) > + { > + if ( v->arch.nonlazy_xstate_used ) > + return XSTATE_ALL; > + else > + return XSTATE_LAZY; > + } > + else > + { > + if ( v->arch.nonlazy_xstate_used ) > + return XSTATE_NONLAZY; > + else > + return 0; > + } > +} > + > /* Save x87 extended state */ > static inline void fpu_xsave(struct vcpu *v) > { > bool_t ok; > + uint64_t mask = fpu_xsave_mask(v); > + > + if ( !mask ) > + return; > > ASSERT(v->arch.xsave_area); > /* > @@ -145,7 +168,7 @@ static inline void fpu_xsave(struct vcpu *v) > */ > ok = set_xcr0(v->arch.xcr0_accum | XSTATE_FP_SSE); > ASSERT(ok); > - xsave(v, v->arch.nonlazy_xstate_used ? XSTATE_ALL : XSTATE_LAZY); > + xsave(v, mask); > ok = set_xcr0(v->arch.xcr0 ?: XSTATE_FP_SSE); > ASSERT(ok); > } > @@ -257,9 +280,6 @@ void vcpu_restore_fpu_lazy(struct vcpu *v) > */ > void vcpu_save_fpu(struct vcpu *v) > { > - if ( !v->fpu_dirtied ) > - return; > - > ASSERT(!is_idle_vcpu(v)); > > /* This can happen, if a paravirtualised guest OS has set its CR0.TS. */ > @@ -267,6 +287,8 @@ void vcpu_save_fpu(struct vcpu *v) > > if ( cpu_has_xsave ) > fpu_xsave(v); > + else if ( !v->fpu_dirtied ) > + ; /* Nothing */ > else if ( cpu_has_fxsr ) > fpu_fxsave(v); > else _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |