[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 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. I am half tempted to leave it out. > >> + 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]. > >> --- 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. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |