|
[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 14:52, Jan Beulich wrote:
>>>> 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".
Ok.
>
>>>> + 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.)
Very good point, although I still think I'd still prefer a logic block
in this form inside a case 0 ... 0x3fffffff to avoid potential leakage
if other logic changes.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |