KVM: VMX: set "blocked by NMI" flag if EPT violation happens during IRET from NMI
authorGleb Natapov <gleb@redhat.com>
Sun, 15 Sep 2013 08:07:23 +0000 (11:07 +0300)
committerGleb Natapov <gleb@redhat.com>
Tue, 17 Sep 2013 16:09:47 +0000 (19:09 +0300)
Set "blocked by NMI" flag if EPT violation happens during IRET from NMI
otherwise NMI can be called recursively causing stack corruption.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
arch/x86/kvm/vmx.c

index 48735936860cc13d5beb0d9daa3ff1bdac6148a9..a1216de9ffda3b8ed6c38565c66e1e5c7c87c313 100644 (file)
@@ -5339,6 +5339,15 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu)
                return 0;
        }
 
+       /*
+        * EPT violation happened while executing iret from NMI,
+        * "blocked by NMI" bit has to be set before next VM entry.
+        * There are errata that may cause this bit to not be set:
+        * AAK134, BY25.
+        */
+       if (exit_qualification & INTR_INFO_UNBLOCK_NMI)
+               vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO, GUEST_INTR_STATE_NMI);
+
        gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS);
        trace_kvm_page_fault(gpa, exit_qualification);