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

Re: [Xen-devel] [PATCH v7 1/3] xen/libxc: Allow changing max number of hypervisor cpuid leaves



>>> On 25.03.14 at 00:18, <boris.ostrovsky@xxxxxxxxxx> wrote:
> Add support for changing max number of hypervisor leaves from configuration
> file.
> 
> This number can be specified using xl's standard 'cpuid' option. Only lowest
> 8 bits of leaf's 0x4000xx00 eax register are processed, all others are 
> ignored.
> 
> The changes allow us to revert commit 
> 80ecb40362365ba77e68fc609de8bd3b7208ae19
> which is most likely no longer needed now anyway (Solaris bug that it 
> addressed
> has been fixed and backported to earlier releases) but leave possibility of
> running unpatched version of Solaris by forcing number of leaves to 2 in the
> configuration file.
> 
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>

Reviewed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

> ---
>  tools/libxc/xc_cpuid_x86.c          |   11 +++++++++++
>  xen/arch/x86/traps.c                |   16 +++++++++-------
>  xen/include/public/arch-x86/cpuid.h |    2 ++
>  3 files changed, 22 insertions(+), 7 deletions(-)
> 
> diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c
> index bbbf9b8..45adcf0 100644
> --- a/tools/libxc/xc_cpuid_x86.c
> +++ b/tools/libxc/xc_cpuid_x86.c
> @@ -555,6 +555,17 @@ static int xc_cpuid_policy(
>  {
>      xc_dominfo_t        info;
>  
> +    /*
> +     * For hypervisor leaves (0x4000XXXX) only 0x4000xx00.EAX[7:0] bits 
> (max
> +     * number of leaves) can be set by user. Hypervisor will enforce this 
> so
> +     * all other bits are don't-care and we can set them to zero.
> +     */
> +    if ( (input[0] & 0xffff0000) == 0x40000000 )
> +    {
> +        regs[0] = regs[1] = regs[2] = regs[3] = 0;
> +        return 0;
> +    }
> +
>      if ( xc_domain_getinfo(xch, domid, 1, &info) == 0 )
>          return -EINVAL;
>  
> diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
> index c462317..e4dec4b 100644
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -677,15 +677,17 @@ int cpuid_hypervisor_leaves( uint32_t idx, uint32_t 
> sub_idx,
>      struct domain *d = current->domain;
>      /* Optionally shift out of the way of Viridian architectural leaves. */
>      uint32_t base = is_viridian_domain(d) ? 0x40000100 : 0x40000000;
> -    uint32_t limit;
> +    uint32_t limit, dummy;
>  
>      idx -= base;
> -
> -    /*
> -     * Some Solaris PV drivers fail if max > base + 2. Help them out by
> -     * hiding the PVRDTSCP leaf if PVRDTSCP is disabled.
> -     */
> -    limit = (d->arch.tsc_mode < TSC_MODE_PVRDTSCP) ? 2 : 3;
> +    if ( idx > XEN_CPUID_MAX_NUM_LEAVES )
> +        return 0; /* Avoid unnecessary pass through domain_cpuid() */
> +
> +    /* Number of leaves may be user-specified */
> +    domain_cpuid(d, base, 0, &limit, &dummy, &dummy, &dummy);
> +    limit &= 0xff;
> +    if ( (limit < 1) || (limit > XEN_CPUID_MAX_NUM_LEAVES) )
> +        limit = XEN_CPUID_MAX_NUM_LEAVES;
>  
>      if ( idx > limit ) 
>          return 0;
> diff --git a/xen/include/public/arch-x86/cpuid.h 
> b/xen/include/public/arch-x86/cpuid.h
> index d9bd627..19fc9dd 100644
> --- a/xen/include/public/arch-x86/cpuid.h
> +++ b/xen/include/public/arch-x86/cpuid.h
> @@ -65,4 +65,6 @@
>  #define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0
>  #define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD  (1u<<0)
>  
> +#define XEN_CPUID_MAX_NUM_LEAVES 3
> +
>  #endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */
> -- 
> 1.7.10.4




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