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