|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 07/13] libx86: Introduce a helper to serialise cpuid_policy objects
>>> On 17.07.18 at 12:02, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 16/07/18 11:45, Jan Beulich wrote:
>>>>> On 13.07.18 at 22:03, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> +int x86_cpuid_copy_to_buffer(const struct cpuid_policy *p,
>>> + cpuid_leaf_buffer_t leaves,
>>> + uint32_t *nr_entries_p)
>>> +{
>>> + const uint32_t nr_entries = *nr_entries_p;
>>> + uint32_t curr_entry = 0, leaf, subleaf;
>>> +
>>> +#define COPY_LEAF(l, s, data) \
>>> + ({ int ret; \
>>> + if ( (ret = copy_leaf_to_buffer( \
>>> + l, s, data, leaves, &curr_entry, nr_entries)) ) \
>>> + return ret; \
>>> + })
>>> +
>>> + /* Basic leaves. */
>>> + for ( leaf = 0; leaf <= MIN(p->basic.max_leaf,
>>> + ARRAY_SIZE(p->basic.raw) - 1); ++leaf )
>> Here and ...
>>
>>> + {
>>> + switch ( leaf )
>>> + {
>>> + case 0x4:
>>> + for ( subleaf = 0; subleaf < ARRAY_SIZE(p->cache.raw);
>>> ++subleaf )
>>> + COPY_LEAF(leaf, subleaf, &p->cache.raw[subleaf]);
>> ... here ...
>>
>>> + break;
>>> +
>>> + case 0x7:
>>> + for ( subleaf = 0;
>>> + subleaf <= MIN(p->feat.max_subleaf,
>>> + ARRAY_SIZE(p->feat.raw) - 1); ++subleaf )
>>> + COPY_LEAF(leaf, subleaf, &p->feat.raw[subleaf]);
>> ... but even more importantly here I wonder whether some form(s) of
>> for_each_...() wouldn't be helpful to introduce: Such constructs are a
>> prime source of future copy-and-past mistakes, perhaps just missing
>> a single of the distinguishing field names. If there was exactly one
>> instance of those field names, that risk would imo be much reduced.
>>
>> For example (completely untested)
>>
>> #define for_each_subleaf(which, limit) \
>> for ( subleaf = 0; subleaf <= MIN(limit, ARRAY_SIZE(p->which.raw) - 1);
> ++subleaf )
>> COPY_LEAF(leaf, subleaf, p->which.raw[subleaf]);
>>
>> albeit I realize that the specification of "limit" would then still require
>> an open-coded use of "which", and I have no good idea how to
>> avoid it.
>
> This pattern shows up in several locations, but in addition to the
> problems you've found here, such a construct would be even harder for
> p->extd.max_leaf which has to account for truncating the top bits out of
> the limit.
Dropping the top bits could be done universally, e.g. by AND-ing the
leaf with 0xffff.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |