|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/6] x86/cpuid: Introduce recalculate_xstate()
On 16/01/17 16:45, Jan Beulich wrote:
>>>> On 16.01.17 at 12:40, <andrew.cooper3@xxxxxxxxxx> wrote:
>> All data in the xstate union, other than the Da1 feature word, is derived
>> from
>> other state; either feature bits from other words, or layout information
>> which
>> has already been collected by Xen's xstate driver.
>>
>> Recalculate the xstate information for each policy object when the feature
>> bits may have changed.
>>
>> The XSTATE_XSAVES_ONLY define needs extending to a 64bit value to avoid
>> problems when taking its converse for masking purposes.
> I don't understand this part - plain 0 is a signed quantity, so ~0 would
> be sign extended to 64 bits as needed.
Hmm, now you point this out, I can't see how I came to this conclusion
to start with. I will drop it.
>
>> --- a/xen/arch/x86/cpuid.c
>> +++ b/xen/arch/x86/cpuid.c
>> @@ -80,6 +80,103 @@ static void sanitise_featureset(uint32_t *fs)
>> (fs[FEATURESET_e1d] & ~CPUID_COMMON_1D_FEATURES));
>> }
>>
>> +static void recalculate_xstate(struct cpuid_policy *p)
>> +{
>> + uint64_t xstates = XSTATE_FP_SSE;
>> + uint32_t xstate_size = XSTATE_AREA_MIN_SIZE;
>> + unsigned int i, Da1 = p->xstate.Da1;
>> +
>> + /*
>> + * The Da1 leaf is the only piece if information preserved. Everything
>> + * else is derived from other feature state.
>> + */
> Almost.
>
>> + memset(&p->xstate, 0, sizeof(p->xstate));
>> +
>> + if ( !p->basic.xsave )
>> + return;
> You're clobbering it here (but in all reality it should be zero in this
> case).
sanitise_featureset() should have made it all zero in the absence of xsave.
>
>> @@ -154,6 +152,13 @@ struct cpuid_policy
>> };
>> uint32_t /* b */:32, xss_low, xss_high;
>> };
>> +
>> + /* Per-component common state. Valid for i >= 2. */
>> + struct {
>> + uint32_t size, offset;
>> + bool xss:1, align:1;
>> + uint32_t /* c */:30, /* d */:32;
>> + } comp[CPUID_GUEST_NR_XSTATE];
> Hmm, can we rely on this functioning on varying complier variants?
> I think the standard doesn't exclude a uint32_t type bitfield to
> start on a 4-byte boundary if not following another uint32_t one.
> IOW I think we'd be better off giving the same type to all fields we
> want to share a storage unit.
Hmm. In this case, something like:
bool xss:1, align:1;
uint32_t _res_d;
ought to work.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |