[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/HVM: don't crash guest upon problems occurring in user mode
commit 28b4baacd599e8c10e6dac055f6a939bb730fb8a Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Tue Nov 25 10:08:57 2014 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Nov 25 10:08:57 2014 +0100 x86/HVM: don't crash guest upon problems occurring in user mode This extends commit 5283b310 ("x86/HVM: only kill guest when unknown VM exit occurred in guest kernel mode") to a few more cases, including the failed VM entry one that XSA-110 was needed to be issued for. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Tim Deegan <tim@xxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Release-Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- xen/arch/x86/hvm/svm/svm.c | 17 +++++++++++------ xen/arch/x86/hvm/vmx/vmx.c | 29 +++++++++++++++-------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 8aca6e6..9398690 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -90,6 +90,15 @@ static bool_t amd_erratum383_found __read_mostly; static uint64_t osvw_length, osvw_status; static DEFINE_SPINLOCK(osvw_lock); +/* Only crash the guest if the problem originates in kernel mode. */ +static void svm_crash_or_fault(struct vcpu *v) +{ + if ( vmcb_get_cpl(v->arch.hvm_svm.vmcb) ) + hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + else + domain_crash(v->domain); +} + void __update_guest_eip(struct cpu_user_regs *regs, unsigned int inst_len) { struct vcpu *curr = current; @@ -100,7 +109,7 @@ void __update_guest_eip(struct cpu_user_regs *regs, unsigned int inst_len) if ( unlikely(inst_len > 15) ) { gdprintk(XENLOG_ERR, "Bad instruction length %u\n", inst_len); - domain_crash(curr->domain); + svm_crash_or_fault(curr); return; } @@ -2680,11 +2689,7 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) "exitinfo1 = %#"PRIx64", exitinfo2 = %#"PRIx64"\n", exit_reason, (u64)vmcb->exitinfo1, (u64)vmcb->exitinfo2); - if ( vmcb_get_cpl(vmcb) ) - hvm_inject_hw_exception(TRAP_invalid_op, - HVM_DELIVER_NO_ERROR_CODE); - else - domain_crash(v->domain); + svm_crash_or_fault(v); break; } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 0bf92b2..2907afa 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -134,6 +134,18 @@ static void vmx_vcpu_destroy(struct vcpu *v) passive_domain_destroy(v); } +/* Only crash the guest if the problem originates in kernel mode. */ +static void vmx_crash_or_fault(struct vcpu *v) +{ + struct segment_register ss; + + vmx_get_segment_register(v, x86_seg_ss, &ss); + if ( ss.attr.fields.dpl ) + hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + else + domain_crash(v->domain); +} + static DEFINE_PER_CPU(struct vmx_msr_state, host_msr_state); static const u32 msr_index[] = @@ -2508,7 +2520,7 @@ static void vmx_failed_vmentry(unsigned int exit_reason, vmcs_dump_vcpu(curr); printk("**************************************\n"); - domain_crash(curr->domain); + vmx_crash_or_fault(curr); } void vmx_enter_realmode(struct cpu_user_regs *regs) @@ -3161,19 +3173,8 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) /* fall through */ default: exit_and_crash: - { - struct segment_register ss; - - gdprintk(XENLOG_WARNING, "Bad vmexit (reason %#lx)\n", - exit_reason); - - vmx_get_segment_register(v, x86_seg_ss, &ss); - if ( ss.attr.fields.dpl ) - hvm_inject_hw_exception(TRAP_invalid_op, - HVM_DELIVER_NO_ERROR_CODE); - else - domain_crash(v->domain); - } + gdprintk(XENLOG_WARNING, "Bad vmexit (reason %#lx)\n", exit_reason); + vmx_crash_or_fault(v); break; } -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |