On 22.04.2010, at 12:33, Joerg Roedel wrote:

> The patch introducing nested nmi handling had a bug. The
> check does not belong to enable_nmi_window but must be in
> nmi_allowed. This patch fixes this.
> 
> Signed-off-by: Joerg Roedel <joerg.roe...@amd.com>
> ---
> arch/x86/kvm/svm.c |   16 +++++++++-------
> 1 files changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
> index ab78eb8..ec20584 100644
> --- a/arch/x86/kvm/svm.c
> +++ b/arch/x86/kvm/svm.c
> @@ -2771,8 +2771,12 @@ static int svm_nmi_allowed(struct kvm_vcpu *vcpu)
> {
>       struct vcpu_svm *svm = to_svm(vcpu);
>       struct vmcb *vmcb = svm->vmcb;
> -     return !(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) &&
> -             !(svm->vcpu.arch.hflags & HF_NMI_MASK);
> +     int ret;
> +     ret = !(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) &&
> +           !(svm->vcpu.arch.hflags & HF_NMI_MASK);
> +     ret = ret && gif_set(svm) && nested_svm_nmi(svm);
> +
> +     return ret;
> }
> 
> static bool svm_get_nmi_mask(struct kvm_vcpu *vcpu)
> @@ -2841,11 +2845,9 @@ static void enable_nmi_window(struct kvm_vcpu *vcpu)
>        * Something prevents NMI from been injected. Single step over possible
>        * problem (IRET or exception injection or interrupt shadow)
>        */
> -     if (gif_set(svm) && nested_svm_nmi(svm)) {
> -             svm->nmi_singlestep = true;
> -             svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF);
> -             update_db_intercept(vcpu);
> -     }
> +     svm->nmi_singlestep = true;
> +     svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF);
> +     update_db_intercept(vcpu);

So we're always messing with the nested guest state when the host wants to 
inject an nmi into the l1 guest? Is that safe?


Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to