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

Re: [Xen-devel] [PATCH] x86/xsave: simplify xcomp_bv initialization



On Thu, Dec 17, 2015 at 09:58:38AM -0700, Jan Beulich wrote:
> This eliminates a number of pointless conditionals: Bits 0 and 1 of
> xcomp_bv don't matter anyway, and as long as none of bits 2..62 are
> set, setting bit 63 is pointless too.
> 
We should set bit 63 of the xcomp_bv when initialization.
From the initialization log of xen, I got that xrstors will 
excute first(before xsaves). xrstors will check bit 63 of xcopm_bv. 
If it is not set, on the xsaves-support machine xen will hung.
(I test the patch on skylake machine base on the master branch)

> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> Noticed while working on XSA-165.
> 
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -912,9 +912,7 @@ int arch_set_info_guest(
>          if ( v->arch.xsave_area )
>          {
>              v->arch.xsave_area->xsave_hdr.xstate_bv = XSTATE_FP_SSE;
> -            if ( cpu_has_xsaves || cpu_has_xsavec )
> -                v->arch.xsave_area->xsave_hdr.xcomp_bv = XSTATE_FP_SSE |
> -                                                         
> XSTATE_COMPACTION_ENABLED;
> +            v->arch.xsave_area->xsave_hdr.xcomp_bv = 0;
>          }
>      }
>      else if ( v->arch.xsave_area )
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -2092,9 +2092,7 @@ static int hvm_load_cpu_ctxt(struct doma
>  
>          memcpy(v->arch.xsave_area, ctxt.fpu_regs, sizeof(ctxt.fpu_regs));
>          xsave_area->xsave_hdr.xstate_bv = XSTATE_FP_SSE;
> -        if ( cpu_has_xsaves || cpu_has_xsavec )
> -            xsave_area->xsave_hdr.xcomp_bv = XSTATE_FP_SSE |
> -                                             XSTATE_COMPACTION_ENABLED;
> +        xsave_area->xsave_hdr.xcomp_bv = 0;
>      }
>      else
>          memcpy(v->arch.fpu_ctxt, ctxt.fpu_regs, sizeof(ctxt.fpu_regs));
> @@ -5562,9 +5560,7 @@ void hvm_vcpu_reset_state(struct vcpu *v
>      if ( v->arch.xsave_area )
>      {
>          v->arch.xsave_area->xsave_hdr.xstate_bv = XSTATE_FP;
> -        if ( cpu_has_xsaves || cpu_has_xsavec )
> -            v->arch.xsave_area->xsave_hdr.xcomp_bv = XSTATE_FP |
> -                                                     
> XSTATE_COMPACTION_ENABLED;
> +        v->arch.xsave_area->xsave_hdr.xcomp_bv = 0;
>      }
>  
>      v->arch.vgc_flags = VGCF_online;
> --- a/xen/arch/x86/i387.c
> +++ b/xen/arch/x86/i387.c
> @@ -270,11 +270,7 @@ int vcpu_init_fpu(struct vcpu *v)
>          return rc;
>  
>      if ( v->arch.xsave_area )
> -    {
>          v->arch.fpu_ctxt = &v->arch.xsave_area->fpu_sse;
> -        if ( cpu_has_xsaves || cpu_has_xsavec )
> -            v->arch.xsave_area->xsave_hdr.xcomp_bv = 
> XSTATE_COMPACTION_ENABLED;
> -    }
>      else
>      {
>          v->arch.fpu_ctxt = _xzalloc(sizeof(v->arch.xsave_area->fpu_sse), 16);
> 
> 
> 

> x86/xsave: simplify xcomp_bv initialization
> 
> This eliminates a number of pointless conditionals: Bits 0 and 1 of
> xcomp_bv don't matter anyway, and as long as none of bits 2..62 are
> set, setting bit 63 is pointless too.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> Noticed while working on XSA-165.
> 
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -912,9 +912,7 @@ int arch_set_info_guest(
>          if ( v->arch.xsave_area )
>          {
>              v->arch.xsave_area->xsave_hdr.xstate_bv = XSTATE_FP_SSE;
> -            if ( cpu_has_xsaves || cpu_has_xsavec )
> -                v->arch.xsave_area->xsave_hdr.xcomp_bv = XSTATE_FP_SSE |
> -                                                         
> XSTATE_COMPACTION_ENABLED;
> +            v->arch.xsave_area->xsave_hdr.xcomp_bv = 0;
>          }
>      }
>      else if ( v->arch.xsave_area )
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -2092,9 +2092,7 @@ static int hvm_load_cpu_ctxt(struct doma
>  
>          memcpy(v->arch.xsave_area, ctxt.fpu_regs, sizeof(ctxt.fpu_regs));
>          xsave_area->xsave_hdr.xstate_bv = XSTATE_FP_SSE;
> -        if ( cpu_has_xsaves || cpu_has_xsavec )
> -            xsave_area->xsave_hdr.xcomp_bv = XSTATE_FP_SSE |
> -                                             XSTATE_COMPACTION_ENABLED;
> +        xsave_area->xsave_hdr.xcomp_bv = 0;
>      }
>      else
>          memcpy(v->arch.fpu_ctxt, ctxt.fpu_regs, sizeof(ctxt.fpu_regs));
> @@ -5562,9 +5560,7 @@ void hvm_vcpu_reset_state(struct vcpu *v
>      if ( v->arch.xsave_area )
>      {
>          v->arch.xsave_area->xsave_hdr.xstate_bv = XSTATE_FP;
> -        if ( cpu_has_xsaves || cpu_has_xsavec )
> -            v->arch.xsave_area->xsave_hdr.xcomp_bv = XSTATE_FP |
> -                                                     
> XSTATE_COMPACTION_ENABLED;
> +        v->arch.xsave_area->xsave_hdr.xcomp_bv = 0;
>      }
>  
>      v->arch.vgc_flags = VGCF_online;
> --- a/xen/arch/x86/i387.c
> +++ b/xen/arch/x86/i387.c
> @@ -270,11 +270,7 @@ int vcpu_init_fpu(struct vcpu *v)
>          return rc;
>  
>      if ( v->arch.xsave_area )
> -    {
>          v->arch.fpu_ctxt = &v->arch.xsave_area->fpu_sse;
> -        if ( cpu_has_xsaves || cpu_has_xsavec )
> -            v->arch.xsave_area->xsave_hdr.xcomp_bv = 
> XSTATE_COMPACTION_ENABLED;
> -    }
>      else
>      {
>          v->arch.fpu_ctxt = _xzalloc(sizeof(v->arch.xsave_area->fpu_sse), 16);


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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