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

Re: [Xen-devel] [PATCH] x86: update Intel CPUID masking code to latest spec



Notice that Keir has checked in the patch as c/s 23726. However, test
shows the patch does not work.
The reason is: at the beginning of set_cpuidmask, it checks whether
any of the four masks are provided by xen parameters. When adding the
fifth mask, the check should be updated too.

Shan Haitao

2011/7/19 Jan Beulich <JBeulich@xxxxxxxxxx>:
> ..., which adds masking of the xsave feature leaf.
>
> Also add back (and fix to actually make it do what it was supposed to
> do from the beginning) the printing of what specific masking couldn't
> be done in case the user requested something the hardware doesn't
> support.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
>
> --- a/xen/arch/x86/cpu/common.c
> +++ b/xen/arch/x86/cpu/common.c
> @@ -20,10 +20,15 @@ size_param("cachesize", cachesize_overri
>
>  static bool_t __cpuinitdata use_xsave = 1;
>  boolean_param("xsave", use_xsave);
> +
>  unsigned int __devinitdata opt_cpuid_mask_ecx = ~0u;
>  integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx);
>  unsigned int __devinitdata opt_cpuid_mask_edx = ~0u;
>  integer_param("cpuid_mask_edx", opt_cpuid_mask_edx);
> +
> +unsigned int __devinitdata opt_cpuid_mask_xsave_eax = ~0u;
> +integer_param("cpuid_mask_xsave_eax", opt_cpuid_mask_xsave_eax);
> +
>  unsigned int __devinitdata opt_cpuid_mask_ext_ecx = ~0u;
>  integer_param("cpuid_mask_ext_ecx", opt_cpuid_mask_ext_ecx);
>  unsigned int __devinitdata opt_cpuid_mask_ext_edx = ~0u;
> --- a/xen/arch/x86/cpu/cpu.h
> +++ b/xen/arch/x86/cpu/cpu.h
> @@ -22,6 +22,7 @@ struct cpu_dev {
>  extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM];
>
>  extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx;
> +extern unsigned int opt_cpuid_mask_xsave_eax;
>  extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx;
>
>  extern int get_model_name(struct cpuinfo_x86 *c);
> --- a/xen/arch/x86/cpu/intel.c
> +++ b/xen/arch/x86/cpu/intel.c
> @@ -57,6 +57,9 @@ void set_cpuid_faulting(bool_t enable)
>  */
>  static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c)
>  {
> +       u32 eax, edx;
> +       const char *extra = "";
> +
>        if (!~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx &
>               opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
>                return;
> @@ -71,7 +74,11 @@ static void __devinit set_cpuidmask(cons
>                wrmsr(MSR_INTEL_CPUID_FEATURE_MASK,
>                      opt_cpuid_mask_ecx,
>                      opt_cpuid_mask_edx);
> -               if (!~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
> +               if (~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
> +                       extra = "extended ";
> +               else if (~opt_cpuid_mask_xsave_eax)
> +                       extra = "xsave ";
> +               else
>                        return;
>                break;
>  /*
> @@ -92,11 +99,25 @@ static void __devinit set_cpuidmask(cons
>                wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK,
>                      opt_cpuid_mask_ext_ecx,
>                      opt_cpuid_mask_ext_edx);
> +               if (!~opt_cpuid_mask_xsave_eax)
> +                       return;
> +               extra = "xsave ";
> +               break;
> +       case 0x2a:
> +               wrmsr(MSR_INTEL_CPUID1_FEATURE_MASK_V2,
> +                     opt_cpuid_mask_ecx,
> +                     opt_cpuid_mask_edx);
> +               rdmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK, eax, edx);
> +               wrmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK,
> +                     opt_cpuid_mask_xsave_eax, edx);
> +               wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK_V2,
> +                     opt_cpuid_mask_ext_ecx,
> +                     opt_cpuid_mask_ext_edx);
>                return;
>        }
>
> -       printk(XENLOG_ERR "Cannot set CPU feature mask on CPU#%d\n",
> -              smp_processor_id());
> +       printk(XENLOG_ERR "Cannot set CPU %sfeature mask on CPU#%d\n",
> +              extra, smp_processor_id());
>  }
>
>  void __devinit early_intel_workaround(struct cpuinfo_x86 *c)
> --- a/xen/include/asm-x86/msr-index.h
> +++ b/xen/include/asm-x86/msr-index.h
> @@ -492,6 +492,10 @@
>  #define MSR_INTEL_CPUID1_FEATURE_MASK  0x00000130
>  #define MSR_INTEL_CPUID80000001_FEATURE_MASK 0x00000131
>
> +#define MSR_INTEL_CPUID1_FEATURE_MASK_V2        0x00000132
> +#define MSR_INTEL_CPUID80000001_FEATURE_MASK_V2 0x00000133
> +#define MSR_INTEL_CPUIDD_01_FEATURE_MASK        0x00000134
> +
>  /* Intel cpuid faulting MSRs */
>  #define MSR_INTEL_PLATFORM_INFO                0x000000ce
>  #define MSR_INTEL_MISC_FEATURES_ENABLES        0x00000140
>
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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