|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 6/6] x86/xstate: Fix latent bugs in compress_xsave_states()
>>> On 12.09.16 at 14:59, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 12/09/16 13:27, Jan Beulich wrote:
>>>>> On 12.09.16 at 11:51, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> void compress_xsave_states(struct vcpu *v, const void *src, unsigned int
>>> size)
>>> {
>>> struct xsave_struct *xsave = v->arch.xsave_area;
>>> uint16_t comp_offsets[sizeof(xfeature_mask)*8];
>>> - u64 xstate_bv = ((const struct xsave_struct
>>> *)src)->xsave_hdr.xstate_bv;
>>> - u64 valid;
>>> + u64 xstate_bv, valid;
>>> +
>>> + BUG_ON(!v->arch.xcr0_accum);
>>> + BUG_ON(size != xstate_ctxt_size(v->arch.xcr0_accum));
>>> + BUG_ON(xsave_area_compressed(src));
>>>
>>> - ASSERT(!xsave_area_compressed(src));
>> Same remark here as on the earlier patch wrt BUG_ON() vs ASSERT().
>
> Same answer.
Well, it's certainly a matter of taste how much of the above to consider
bounds checking. I for one would take only the middle one as such.
>>> + xstate_bv = ((const struct xsave_struct *)src)->xsave_hdr.xstate_bv;
>>>
>>> if ( !(v->arch.xcr0_accum & XSTATE_XSAVES_ONLY) )
>>> {
>>> + /*
>>> + * TODO: This logic doesn't currently handle restoration of xsave
>>> + * state which would force the vcpu from uncompressed to
>>> compressed.
>>> + */
>>> + BUG_ON(xstate_bv & XSTATE_XSAVES_ONLY);
>> I don't think this is a valid concern of yours: The function can't be
>> used to restore features not xcr0_accum anyway (or else that
>> field would need updating). Afaict validate_xstate() already prevents
>> this as intended.
>
> This is all currently dead code. I guess the question really depends on
> what we plan to do with compressed states.
>
> Strictly speaking, no XSAVES state can every be present in xcr0, by
> design. If we retroactively consider xcr0_accum to be "all states in
> use",
I think that's the only viable model, considering how the domctl works:
xcr0_accum needs to represent the combination of features ever
enabled in XCR0 and XSS.
> then the if condition in context does become relevant when Xen
> starts supporting XSAVES-only components.
>
> In such a case, it is definitely wrong to memcpy() the uncompressed
> buffer, as Xen will try and use xrstors and corrupt all guest state.
How? If the guest never enabled any bit in XSS, how can any such
bit be set in xstate_bv (which is always a subset of XCR0|XSS).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |