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

Re: [Xen-devel] [PATCHv4 1/3] x86/fpu: Add a per-domain field to set the width of FIP/FDP



>>> On 25.02.16 at 16:10, <david.vrabel@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/xstate.c
> +++ b/xen/arch/x86/xstate.c
> @@ -249,7 +249,7 @@ void xsave(struct vcpu *v, uint64_t mask)
>      struct xsave_struct *ptr = v->arch.xsave_area;
>      uint32_t hmask = mask >> 32;
>      uint32_t lmask = mask;
> -    int word_size = mask & XSTATE_FP ? (cpu_has_fpu_sel ? 8 : 0) : -1;
> +    unsigned int fip_width = v->domain->arch.x87_fip_width;
>  #define XSAVE(pfx) \
>          alternative_io_3(".byte " pfx "0x0f,0xae,0x27\n", /* xsave */ \
>                           ".byte " pfx "0x0f,0xae,0x37\n", /* xsaveopt */ \
> @@ -261,7 +261,15 @@ void xsave(struct vcpu *v, uint64_t mask)
>                           "=m" (*ptr), \
>                           "a" (lmask), "d" (hmask), "D" (ptr))
>  
> -    if ( word_size <= 0 || !is_pv_32bit_vcpu(v) )
> +    if ( fip_width == 8 || !(mask & XSTATE_FP) )
> +    {
> +        XSAVE("0x48,");
> +    }
> +    else if ( fip_width == 4 )
> +    {
> +        XSAVE("");
> +    }
> +    else
>      {
>          typeof(ptr->fpu_sse.fip.sel) fcs = ptr->fpu_sse.fip.sel;
>          typeof(ptr->fpu_sse.fdp.sel) fds = ptr->fpu_sse.fdp.sel;
> @@ -301,25 +309,25 @@ void xsave(struct vcpu *v, uint64_t mask)
>              return;
>          }
>  
> -        if ( word_size > 0 &&
> -             !((ptr->fpu_sse.fip.addr | ptr->fpu_sse.fdp.addr) >> 32) )
> +        /*
> +         * If the FIP/FDP[63:32] are both zero, it is safe to use the
> +         * 32-bit restore to also restore the selectors.
> +         */
> +        if ( !((ptr->fpu_sse.fip.addr | ptr->fpu_sse.fdp.addr) >> 32) )
>          {
>              struct ix87_env fpu_env;
>  
>              asm volatile ( "fnstenv %0" : "=m" (fpu_env) );
>              ptr->fpu_sse.fip.sel = fpu_env.fcs;
>              ptr->fpu_sse.fdp.sel = fpu_env.fds;
> -            word_size = 4;
> +            fip_width = 4;
>          }
> -    }
> -    else
> -    {
> -        XSAVE("");
> -        word_size = 4;
> +        else
> +            fip_width = 8;
>      }
>  #undef XSAVE
> -    if ( word_size >= 0 )
> -        ptr->fpu_sse.x[FPU_WORD_SIZE_OFFSET] = word_size;
> +    if ( mask & XSTATE_FP )
> +        ptr->fpu_sse.x[FPU_WORD_SIZE_OFFSET] = fip_width;
>  }

This needed further fixing up, as two references to word_size
had been left in. Which means that patch 3 now will need to be
re-based. And please double check the adjustments.

Jan


_______________________________________________
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®.