|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |