[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 |