[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.5 RFC v2] x86/HVM: Unconditionally crash guests on repeated vmentry failures
On 27/11/14 11:16, Jan Beulich wrote: >>>> On 27.11.14 at 11:26, <tim@xxxxxxx> wrote: >> At 08:42 +0000 on 27 Nov (1417074133), Jan Beulich wrote: >>>>>> On 26.11.14 at 18:43, <andrew.cooper3@xxxxxxxxxx> wrote: >>>> My v1 patch only fixes the VMX side of things. SVM doesn't explicitly >>>> identify a failed vmentry and lets it fall into the default case of the >>>> vmexit handler. As such, with v1, the infinite loop still affects AMD >>>> hardware. >>> Right; I should have said "something along the lines of v1". An SVM >>> part is needed, but that should probably extend beyond what you >>> proposed in v2: There are a number of "goto exit_and_crash" >>> statements ahead of where you place your addition. I think they >>> all need to be treated similarly. >>> >>> I therefore think we should revert the VMX part of 28b4baacd5 >>> and make SVM behavior consistent with what results for VMX: >>> Crash the guest unconditionally on VMEXIT_INVALID, without >>> looking for recurring VM entry failures. See below/attached. >>> >>> Jan >>> >>> x86/HVM: prevent infinite VM entry retries >>> >>> This reverts the VMX side of commit 28b4baac ("x86/HVM: don't crash >>> guest upon problems occurring in user mode") and gets SVM in line with >>> the resulting VMX behavior. This is because Andrew validly says >>> >>> "A failed vmentry is overwhelmingly likely to be caused by corrupt >>> VMC[SB] state. As a result, injecting a fault and retrying the the >>> vmentry is likely to fail in the same way." >>> >>> Reported-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> >>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> >> Looking at the SVM side, AFAICT you're trying to filter out >> VMEXIT_INVALID exits that couldn't be handled by nested SVM, but I >> think it's fine just to always crash on nested-SVM failures: we know >> the guest wasn't in user mode because it successfully executed VMRUN. >> And looking at it, the other users of that label are for unexpected >> debugging exits, which can't be caused by the guest userspace either. >> >> So how about this for the SVM side, reverting to crashing for >> everything except new, unsupported exit types? > Generally a good idea, but there are two paths to exit_and_crash > (for VMEXIT_EXCEPTION_DB and VMEXIT_EXCEPTION_BP) which I > think would better crash only conditionally. I would agree - these two should only be conditional crashes. If the intercepts are enabled, userspace is perfectly capable of generating the conditions behind the back of the kernel. ~Andrew > >> --- a/xen/arch/x86/hvm/svm/svm.c >> +++ b/xen/arch/x86/hvm/svm/svm.c >> @@ -2675,16 +2675,18 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) >> break; >> >> default: >> - exit_and_crash: >> gdprintk(XENLOG_ERR, "unexpected VMEXIT: exit reason = %#"PRIx64", >> " >> "exitinfo1 = %#"PRIx64", exitinfo2 = %#"PRIx64"\n", >> exit_reason, >> (u64)vmcb->exitinfo1, (u64)vmcb->exitinfo2); >> - if ( vmcb_get_cpl(vmcb) ) >> + if ( vmcb_get_cpl(vmcb) ) { >> hvm_inject_hw_exception(TRAP_invalid_op, >> HVM_DELIVER_NO_ERROR_CODE); >> - else >> - domain_crash(v->domain); >> + break; >> + } >> + /* else fall through */ >> + exit_and_crash: >> + domain_crash(v->domain); >> break; >> } > Additionally this re-arrangement would make some domain_crash() > invocations "silent" (i.e. no other accompanying message), but that's > of course easy to fix. > > And finally, if doing it that way we might better remove the > exit_and_crash label altogether and call domain_crash() directly > in the places we mean it to be called. > > Jan > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |