[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/hvm: Don't let hvm_set_efer() raise #GP behind the emulators back
c/s 49de10f3c "x86/hvm: Don't raise #GP behind the emulators back for MSR accesses" missed an edge case. hvm_set_efer() raises #GP itself, so deliberately avoided the goto gp_fault path in hvm_msr_write_intercept(). With the above change, guest updates to MSR_EFER which end up faulting raises hvm_msr_write_intercept() returning X86EMUL_EXCEPTION. The second #GP gets combined to #DF and handed back to the guest. Update hvm_set_efer() to avoid raising #GP, requiring its callers to do so. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CC: Jan Beulich <JBeulich@xxxxxxxx> --- CC: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> CC: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx> --- xen/arch/x86/hvm/hvm.c | 2 -- xen/arch/x86/hvm/svm/nestedsvm.c | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 5372a9a..9eeb0a2 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1989,7 +1989,6 @@ int hvm_set_efer(uint64_t value) printk(XENLOG_G_WARNING "%pv: Invalid EFER update: %#"PRIx64" -> %#"PRIx64" - %s\n", v, v->arch.hvm_vcpu.guest_efer, value, errstr); - hvm_inject_hw_exception(TRAP_gp_fault, 0); return X86EMUL_EXCEPTION; } @@ -1998,7 +1997,6 @@ int hvm_set_efer(uint64_t value) { gdprintk(XENLOG_WARNING, "Trying to change EFER.LME with paging enabled\n"); - hvm_inject_hw_exception(TRAP_gp_fault, 0); return X86EMUL_EXCEPTION; } diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c index ca11b96..5979b56 100644 --- a/xen/arch/x86/hvm/svm/nestedsvm.c +++ b/xen/arch/x86/hvm/svm/nestedsvm.c @@ -278,6 +278,8 @@ static int nsvm_vcpu_hostrestore(struct vcpu *v, struct cpu_user_regs *regs) /* EFER */ v->arch.hvm_vcpu.guest_efer = n1vmcb->_efer; rc = hvm_set_efer(n1vmcb->_efer); + if ( rc == X86EMUL_EXCEPTION ) + hvm_inject_hw_exception(TRAP_gp_fault, 0); if (rc != X86EMUL_OKAY) gdprintk(XENLOG_ERR, "hvm_set_efer failed, rc: %u\n", rc); @@ -538,6 +540,8 @@ static int nsvm_vmcb_prepare4vmrun(struct vcpu *v, struct cpu_user_regs *regs) /* EFER */ v->arch.hvm_vcpu.guest_efer = ns_vmcb->_efer; rc = hvm_set_efer(ns_vmcb->_efer); + if ( rc == X86EMUL_EXCEPTION ) + hvm_inject_hw_exception(TRAP_gp_fault, 0); if (rc != X86EMUL_OKAY) gdprintk(XENLOG_ERR, "hvm_set_efer failed, rc: %u\n", rc); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |