All of lore.kernel.org
 help / color / mirror / Atom feed
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
	xen-devel <xen-devel@lists.xenproject.org>
Cc: Jun Nakajima <jun.nakajima@intel.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: Re: [PATCH] x86/xsave: initialization improvements
Date: Thu, 29 Aug 2013 11:13:01 +0100	[thread overview]
Message-ID: <CE44DD3D.3234D%keir.xen@gmail.com> (raw)
In-Reply-To: <521F32E402000078000EF56B@nat28.tlf.novell.com>

On 29/08/2013 10:39, "Jan Beulich" <JBeulich@suse.com> wrote:

> - properly validate available feature set on APs
> - also validate xsaveopt availability on APs
> - properly indicate whether the initialization is on the BSP (we
>   shouldn't be using "cpu == 0" checks for this)
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/cpu/common.c
> +++ b/xen/arch/x86/cpu/common.c
> @@ -304,7 +304,7 @@ void __cpuinit identify_cpu(struct cpuin
> clear_bit(X86_FEATURE_XSAVE, boot_cpu_data.x86_capability);
>  
> if ( cpu_has_xsave )
> -  xstate_init();
> +  xstate_init(c == &boot_cpu_data);
>  
> /*
> * The vendor-specific functions might have changed features.  Now
> --- a/xen/arch/x86/xstate.c
> +++ b/xen/arch/x86/xstate.c
> @@ -251,11 +251,10 @@ void xstate_free_save_area(struct vcpu *
>  }
>  
>  /* Collect the information of processor's extended state */
> -void xstate_init(void)
> +void xstate_init(bool_t bsp)
>  {
> -    u32 eax, ebx, ecx, edx;
> -    int cpu = smp_processor_id();
> -    u32 min_size;
> +    u32 eax, ebx, ecx, edx, min_size;
> +    u64 feature_mask;
>  
>      if ( boot_cpu_data.cpuid_level < XSTATE_CPUID )
>          return;
> @@ -264,6 +263,7 @@ void xstate_init(void)
>  
>      BUG_ON((eax & XSTATE_FP_SSE) != XSTATE_FP_SSE);
>      BUG_ON((eax & XSTATE_YMM) && !(eax & XSTATE_SSE));
> +    feature_mask = (((u64)edx << 32) | eax) & XCNTXT_MASK;
>  
>      /* FP/SSE, XSAVE.HEADER, YMM */
>      min_size =  XSTATE_AREA_MIN_SIZE;
> @@ -275,31 +275,33 @@ void xstate_init(void)
>       * Set CR4_OSXSAVE and run "cpuid" to get xsave_cntxt_size.
>       */
>      set_in_cr4(X86_CR4_OSXSAVE);
> -    if ( !set_xcr0((((u64)edx << 32) | eax) & XCNTXT_MASK) )
> +    if ( !set_xcr0(feature_mask) )
>          BUG();
>      cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
>  
> -    if ( cpu == 0 )
> +    if ( bsp )
>      {
> +        xfeature_mask = feature_mask;
>          /*
>           * xsave_cntxt_size is the max size required by enabled features.
>           * We know FP/SSE and YMM about eax, and nothing about edx at
> present.
>           */
>          xsave_cntxt_size = ebx;
> -        xfeature_mask = eax + ((u64)edx << 32);
> -        xfeature_mask &= XCNTXT_MASK;
>          printk("%s: using cntxt_size: %#x and states: %#"PRIx64"\n",
>              __func__, xsave_cntxt_size, xfeature_mask);
> -
> -        /* Check XSAVEOPT feature. */
> -        cpuid_count(XSTATE_CPUID, 1, &eax, &ebx, &ecx, &edx);
> -        cpu_has_xsaveopt = !!(eax & XSTATE_FEATURE_XSAVEOPT);
>      }
>      else
>      {
> +        BUG_ON(xfeature_mask != feature_mask);
>          BUG_ON(xsave_cntxt_size != ebx);
> -        BUG_ON(xfeature_mask != (xfeature_mask & XCNTXT_MASK));
>      }
> +
> +    /* Check XSAVEOPT feature. */
> +    cpuid_count(XSTATE_CPUID, 1, &eax, &ebx, &ecx, &edx);
> +    if ( bsp )
> +        cpu_has_xsaveopt = !!(eax & XSTATE_FEATURE_XSAVEOPT);
> +    else
> +        BUG_ON(!cpu_has_xsaveopt != !(eax & XSTATE_FEATURE_XSAVEOPT));
>  }
>  
>  int handle_xsetbv(u32 index, u64 new_bv)
> --- a/xen/include/asm-x86/xstate.h
> +++ b/xen/include/asm-x86/xstate.h
> @@ -82,6 +82,6 @@ int __must_check handle_xsetbv(u32 index
>  /* extended state init and cleanup functions */
>  void xstate_free_save_area(struct vcpu *v);
>  int xstate_alloc_save_area(struct vcpu *v);
> -void xstate_init(void);
> +void xstate_init(bool_t bsp);
>  
>  #endif /* __ASM_XSTATE_H */
> 
> 
> 

  reply	other threads:[~2013-08-29 10:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-29  9:39 [PATCH] x86/xsave: initialization improvements Jan Beulich
2013-08-29 10:13 ` Keir Fraser [this message]
2013-08-29 10:17 ` Andrew Cooper
2013-08-29 10:49   ` Jan Beulich
2013-08-29 11:25     ` Andrew Cooper
2013-08-29 12:26       ` Jan Beulich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CE44DD3D.3234D%keir.xen@gmail.com \
    --to=keir.xen@gmail.com \
    --cc=JBeulich@suse.com \
    --cc=donald.d.dugger@intel.com \
    --cc=jun.nakajima@intel.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.