[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 22/27] x86/cpuid: Perform max_leaf calculations in guest_cpuid()
>>> On 04.01.17 at 13:39, <andrew.cooper3@xxxxxxxxxx> wrote: > @@ -306,6 +310,9 @@ void recalculate_cpuid_policy(struct domain *d) > if ( !d->disable_migrate && !d->arch.vtsc ) > __clear_bit(X86_FEATURE_ITSC, fs); > > + if ( p->basic.max_leaf < 0xd ) XSTATE_CPUID > @@ -333,21 +340,50 @@ void guest_cpuid(const struct vcpu *v, unsigned int > leaf, > unsigned int subleaf, struct cpuid_leaf *res) > { > const struct domain *d = v->domain; > + const struct cpuid_policy *p = d->arch.cpuid; > > *res = EMPTY_LEAF; > > /* > * First pass: > * - Dispatch the virtualised leaves to their respective handlers. > + * - Perform max_leaf/subleaf calculations, maybe returning early. > */ > switch ( leaf ) > { > + case 0x0 ... 0x6: > + case 0x8 ... 0xc: > +#if 0 /* For when CPUID_GUEST_NR_BASIC isn't 0xd */ > + case 0xe ... CPUID_GUEST_NR_BASIC - 1: > +#endif Perhaps have a BUILD_BUG_ON() in an #else here? > + if ( leaf > p->basic.max_leaf ) > + return; > + break; > + > + case 0x7: > + if ( subleaf > p->feat.max_subleaf ) > + return; > + break; > + > + case 0xd: XSTATE_CPUID again, which raises the question whether switch() really is the best way to deal with things here. > --- a/xen/arch/x86/hvm/hvm.c > +++ b/xen/arch/x86/hvm/hvm.c > @@ -3305,27 +3305,6 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, > unsigned int *ebx, > if ( !edx ) > edx = &dummy; > > - if ( input & 0x7fffffff ) > - { > - /* > - * Requests outside the supported leaf ranges return zero on AMD > - * and the highest basic leaf output on Intel. Uniformly follow > - * the AMD model as the more sane one. > - */ I think this comment would better be moved instead of deleted. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |