|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/HVM: prevent infinite VM entry retries
On 27/11/14 12:39, Jan Beulich wrote:
> 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>
> Signed-off-by: Tim Deegan <tim@xxxxxxx>
> ---
> v2: Replace SVM change by what Tim suggested.
>
> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -2371,8 +2371,8 @@ void svm_vmexit_handler(struct cpu_user_
> goto out;
> case NESTEDHVM_VMEXIT_FATALERROR:
> gdprintk(XENLOG_ERR, "unexpected nestedsvm_vmexit()
> error\n");
> - goto exit_and_crash;
> -
> + domain_crash(v->domain);
> + goto out;
> default:
> BUG();
> case NESTEDHVM_VMEXIT_ERROR:
> @@ -2385,18 +2385,21 @@ void svm_vmexit_handler(struct cpu_user_
> case NESTEDHVM_VMEXIT_FATALERROR:
> gdprintk(XENLOG_ERR,
> "unexpected nestedsvm_check_intercepts() error\n");
> - goto exit_and_crash;
> + domain_crash(v->domain);
> + goto out;
> default:
> gdprintk(XENLOG_INFO, "nestedsvm_check_intercepts() returned
> %i\n",
> nsret);
> - goto exit_and_crash;
> + domain_crash(v->domain);
> + goto out;
> }
> }
>
> if ( unlikely(exit_reason == VMEXIT_INVALID) )
> {
I think it would be good to retain the printk here from previous
versions of the patch, specifically identifies the below vmcb dump as
caused by a failed vmentry. As it stands, it is a vmcb dump with no
other context.
Either way, Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> svm_vmcb_dump(__func__, vmcb);
> - goto exit_and_crash;
> + domain_crash(v->domain);
> + goto out;
> }
>
> perfc_incra(svmexits, exit_reason);
> @@ -2431,13 +2434,13 @@ void svm_vmexit_handler(struct cpu_user_
>
> case VMEXIT_EXCEPTION_DB:
> if ( !v->domain->debugger_attached )
> - goto exit_and_crash;
> + goto unexpected_exit_type;
> domain_pause_for_debugger();
> break;
>
> case VMEXIT_EXCEPTION_BP:
> if ( !v->domain->debugger_attached )
> - goto exit_and_crash;
> + goto unexpected_exit_type;
> /* AMD Vol2, 15.11: INT3, INTO, BOUND intercepts do not update RIP.
> */
> if ( (inst_len = __get_instruction_length(v, INSTR_INT3)) == 0 )
> break;
> @@ -2684,7 +2687,7 @@ void svm_vmexit_handler(struct cpu_user_
> break;
>
> default:
> - exit_and_crash:
> + unexpected_exit_type:
> gdprintk(XENLOG_ERR, "unexpected VMEXIT: exit reason = %#"PRIx64", "
> "exitinfo1 = %#"PRIx64", exitinfo2 = %#"PRIx64"\n",
> exit_reason,
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -134,18 +134,6 @@ static void vmx_vcpu_destroy(struct vcpu
> 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[] =
> @@ -2520,7 +2508,7 @@ static void vmx_failed_vmentry(unsigned
> vmcs_dump_vcpu(curr);
> printk("**************************************\n");
>
> - vmx_crash_or_fault(curr);
> + domain_crash(curr->domain);
> }
>
> void vmx_enter_realmode(struct cpu_user_regs *regs)
> @@ -3173,8 +3161,19 @@ void vmx_vmexit_handler(struct cpu_user_
> /* fall through */
> default:
> exit_and_crash:
> - gdprintk(XENLOG_WARNING, "Bad vmexit (reason %#lx)\n", exit_reason);
> - vmx_crash_or_fault(v);
> + {
> + 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);
> + }
> break;
> }
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |