|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.12] x86/p2m: Drop erroneous #VE-enabled check in ept_set_entry()
>>> On 25.01.19 at 15:15, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 25/01/2019 13:25, Jan Beulich wrote:
>>>>> On 25.01.19 at 12:10, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> On 25/01/2019 10:25, Jan Beulich wrote:
>>>>>>> On 24.01.19 at 19:28, <andrew.cooper3@xxxxxxxxxx> wrote:
>>>>> Code clearing the "Suppress VE" bit in an EPT entry isn't nececsserily
> running
>>>>> in current context. In ALTP2M_external mode, it definitely is not, and
>>>>> in
> PV
>>>>> context, vcpu_altp2m(current) acts upon the HVM union.
>>>>>
>>>>> Even if we could sensibly resolve the target vCPU, it may legitimately
>>>>> not
> be
>>>>> fully set up at this point, so rejecting the EPT modification would be
> buggy.
>>>>>
>>>>> There is a path in hvm_hap_nested_page_fault() which explicitly emulates
>>>>> #VE
>>>>> in the cpu_has_vmx_virt_exceptions case, so the -EOPNOTSUPP part of this
>>>>> condition is also wrong.
>>>>> [...]
>>>>> --- a/xen/arch/x86/mm/p2m-ept.c
>>>>> +++ b/xen/arch/x86/mm/p2m-ept.c
>>>>> @@ -702,16 +702,6 @@ ept_set_entry(struct p2m_domain *p2m, gfn_t gfn_,
>>>>> mfn_t
> mfn,
>>>>>
>>>>> ASSERT(ept);
>>>>>
>>>>> - if ( !sve )
>>>>> - {
>>>>> - if ( !cpu_has_vmx_virt_exceptions )
>>>>> - return -EOPNOTSUPP;
>>>>> -
>>>>> - /* #VE should be enabled for this vcpu. */
>>>>> - if ( gfn_eq(vcpu_altp2m(current).veinfo_gfn, INVALID_GFN) )
>>>>> - return -ENXIO;
>>>>> - }
>>>> How about retaining the latter, but qualifying it with
>>>> current->domain == d?
>>> Why? There is a paragraph in the commit message explaining why this
>>> check is wrong even when it isn't an out-of-bounds read.
>> I'm struggling. For clarity I've retained all of the relevant parts
>> of the description in context above. I can't identify where you
>> talk about an out of bounds read there. So
>> - for the first paragraph, acting upon the wrong side of the union
>> does not apply with the added qualifier,
>> - for the second paragraph, the domain itself requesting an action
>> upon something not fully initialized yet looks to deserve an error
>> return;
>
> The issue is here. Setting up EPT.SVE is largely unrelated to setting
> up set delivery of #VE.
>
> This is like asking "can I execute an `int3` instruction before setting
> up an IDT?" Sure - it's not a clever idea to try, but you don't get
> back an -EINVAL for trying to execute `int3` before `lidt`.
>
> Furthermore, even with this interlock in place, it doesn't guarantee
> that #VE delivery will work - there are further in-guest steps required
> not to end up with #DF.
>
>> it looks wrong to me to request #VE without first setting
>> up the page needed for its proper delivery (I'd even question
>> the validity of doing so by a controlling domain, but I accept that
>> we can't work out the correct vCPU to check - perhaps the right
>> thing would be to check all of them, as the P2M is per-domain,
>> not per-vCPU),
>
> Redirecting #VE internally is an optimisation over causing an
> EPT_VIOLATION vmexit. One of these two will happen.
>
> As it turns out, some corner cases will VMExit anyway, so its not
> actually safe for a guest to use this infrastructure on itself, without
> an external introspection agent.
>
> It is definitely not acceptable to prevent an external agent from
> configuring EPT head of time, so its internal agent can take over
> handling of #VE when it is ready.
Well, my question was really only whether to deny the operation for
a guest on itself.
> So, overall, the only thing this check does is force the ordering of two
> startup actions (which are fine to mis-order if you know what you are
> doing) inside a Xen-aware in-guest agent, but doesn't interact with a
> number of related things which can ultimately lead to a guest crash.
>
> Or, in other words, it is simply not a useful thing to enforce.
Okay, having looked some more at the SDM I see that #VE can't
really occur without the veinfo_gfn first having got set up (and
stored in the VMCS), as there's a respective VM entry check
disallowing the enable bit to be set without a valid address. IOW
I agree now with this last statement of yours:
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
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 |