On Sun, Apr 14, 2013 at 09:04:26PM +0200, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kis...@siemens.com>
> 
> The logic for checking if interrupts can be injected has to be applied
> also on NMIs. The difference is that if NMI interception is on these
> events are consumed and blocked by the VM exit.
> 
> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
Applied, thanks.

> ---
>  arch/x86/kvm/vmx.c |   26 ++++++++++++++++++++++++++
>  1 files changed, 26 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 74dea94..9ad30d8 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -4190,6 +4190,12 @@ static bool nested_exit_on_intr(struct kvm_vcpu *vcpu)
>               PIN_BASED_EXT_INTR_MASK;
>  }
>  
> +static bool nested_exit_on_nmi(struct kvm_vcpu *vcpu)
> +{
> +     return get_vmcs12(vcpu)->pin_based_vm_exec_control &
> +             PIN_BASED_NMI_EXITING;
> +}
> +
>  static void enable_irq_window(struct kvm_vcpu *vcpu)
>  {
>       u32 cpu_based_vm_exec_control;
> @@ -4315,6 +4321,26 @@ static void vmx_set_nmi_mask(struct kvm_vcpu *vcpu, 
> bool masked)
>  
>  static int vmx_nmi_allowed(struct kvm_vcpu *vcpu)
>  {
> +     if (is_guest_mode(vcpu)) {
> +             struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
> +
> +             if (to_vmx(vcpu)->nested.nested_run_pending)
> +                     return 0;
> +             if (nested_exit_on_nmi(vcpu)) {
> +                     nested_vmx_vmexit(vcpu);
> +                     vmcs12->vm_exit_reason = EXIT_REASON_EXCEPTION_NMI;
> +                     vmcs12->vm_exit_intr_info = NMI_VECTOR |
> +                             INTR_TYPE_NMI_INTR | INTR_INFO_VALID_MASK;
> +                     /*
> +                      * The NMI-triggered VM exit counts as injection:
> +                      * clear this one and block further NMIs.
> +                      */
> +                     vcpu->arch.nmi_pending = 0;
> +                     vmx_set_nmi_mask(vcpu, true);
> +                     return 0;
> +             }
> +     }
> +
>       if (!cpu_has_virtual_nmis() && to_vmx(vcpu)->soft_vnmi_blocked)
>               return 0;
>  
> -- 
> 1.7.3.4

--
                        Gleb.
--
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