[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 05.01.17 at 15:28, <andrew.cooper3@xxxxxxxxxx> wrote: > On 05/01/17 13:51, Jan Beulich wrote: >>> @@ -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? > > The presence of this was to be a reminder to whomever tries upping > max_leaf beyond 0xd. Then again, there is a reasonable chance it will > be me. Well, that's why the recommendation to add a BUILD_BUG_ON() - that's a reminder to that "whoever". >>> + if ( leaf > p->basic.max_leaf ) >>> + return; >>> + break; >>> + >>> + case 0x7: >>> + if ( subleaf > p->feat.max_subleaf ) >>> + return; >>> + break; >>> + >>> + case 0xd: >> XSTATE_CPUID again, > > I considered this, but having a mix of named an numbered leaves is worse > than having them uniformly numbered, especially when visually checking > the conditions around the #if 0 case above. > > I had considered making a cpuid-index.h for leaf names, but most leaves > are more commonly referred to by number than name, so I am really not > sure if that would be helpful or hindering in the long run. > >> which raises the question whether switch() really is the best way to deal > with things here. > > What else would you suggest? One way or another (better shown in the > context of the following patch), we need one block per union{} to apply > max_leaf calculations and read the base data from p->$FOO.raw[$IDX]. Actually, perhaps a mixture: Inside the default case have if ( leaf == 0x7 ) { if ( subleaf > p->feat.max_subleaf ) return; } else if ( leaf == 0xd) { if ( subleaf > ARRAY_SIZE(p->xstate.raw) ) return; } if ( leaf > p->basic.max_leaf ) return; Which (by making the last one if rather than else-if) also fixes an issue I've spotted only now: So far you exclude leaves 7 and 0xd from the basic.max_leaf checking. (And this way that check could also go first.) >>> --- 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. > > Where would you like it? It doesn't have an easy logical place to live > in guest_cpuid(). The best I can think of is probably as an extension > of the "First Pass" comment. Right there, yes, as an extension to the line you're already adding. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |