|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/svm: Fix svm_update_guest_efer() for domains using shadow paging
>>> On 08.10.18 at 13:03, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 08/10/18 11:12, Jan Beulich wrote:
>>>>> On 05.10.18 at 19:02, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> --- a/xen/arch/x86/hvm/svm/svm.c
>>> +++ b/xen/arch/x86/hvm/svm/svm.c
>>> @@ -649,13 +649,32 @@ void svm_update_guest_cr(struct vcpu *v, unsigned int
> cr, unsigned int flags)
>>> static void svm_update_guest_efer(struct vcpu *v)
>>> {
>>> struct vmcb_struct *vmcb = v->arch.hvm.svm.vmcb;
>>> - bool lma = v->arch.hvm.guest_efer & EFER_LMA;
>>> - uint64_t new_efer;
>>> + unsigned long guest_efer = v->arch.hvm.guest_efer,
>>> + xen_efer = read_efer();
>>>
>>> - new_efer = (v->arch.hvm.guest_efer | EFER_SVME) & ~EFER_LME;
>>> - if ( lma )
>>> - new_efer |= EFER_LME;
>>> - vmcb_set_efer(vmcb, new_efer);
>>> + if ( paging_mode_shadow(v->domain) )
>>> + {
>>> + /* EFER.NX is a Xen-owned bit and is not under guest control. */
>>> + guest_efer &= ~EFER_NX;
>>> + guest_efer |= xen_efer & EFER_NX;
>>> +
>>> + /*
>>> + * CR0.PG is a Xen-owned bit, and remains set even when the guest
>>> has
>>> + * logically disabled paging.
>>> + *
>>> + * LMA was calculated using the guest CR0.PG setting, but LME needs
>>> + * clearing to avoid interacting with Xen's CR0.PG setting. As
>>> writes
>>> + * to CR0 are intercepted, it is safe to leave LME clear at this
>>> + * point, and fix up both LME and LMA when CR0.PG is set.
>>> + */
>>> + if ( !(guest_efer & EFER_LMA) )
>>> + guest_efer &= ~EFER_LME;
>>> + }
>> I think this wants an "else", either ASSERT()ing that what the removed
>> code did is actually the case (arranged for by the callers), or
>> retaining the original logic in some form.
>
> No - the original logic does not want keeping. It is a latent bug in
> the HAP case, because if the guest could write to CR0, setting CR0.PG
> would fail to activate long mode.
Hmm, perhaps we're talking of different parts of the original code:
I think you talk about the clearing of LME, whereas I am mostly
concerned about the dropped implication of LME from LMA. Also
note that I suggested keeping some form of the old code only as
one option; the other was to add an ASSERT() verifying that the
callers have taken care of that implication. In particular for these
...
>> This looks particularly relevant
>> when hvm_efer_valid() was called with -1 as its cr0_pg argument, as
>> in that case there was not necessarily any correlation enforced
>> between EFER.LMA and CR0.PG.
>
> On the subject of passing -1, all of that logic is horrible, but it is
> only ever used when LME/LMA is being recalculated around other state
> changes.
... cases I couldn't really convince myself that all callers really
guarantee this.
Anyway - don't read this as an objection to the change. I agree
SVM and VMX should be in line with one another wherever
possible.
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 |