]> xenbits.xensource.com Git - xen.git/commitdiff
x86/hvm: fix the unknown nested vmexit reason 80000021 bug
authorLiang Li <liang.z.li@intel.com>
Tue, 21 Apr 2015 07:16:06 +0000 (09:16 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 21 Apr 2015 07:16:06 +0000 (09:16 +0200)
This bug will be trigged when NMI happen in the L2 guest. The current
code handles the NMI incorrectly. According to Intel SDM 31.7.1.2
(Resuming Guest Software after Handling an Exception), If bit 31 of the
IDT-vectoring information fields is set, and the virtual NMIs VM-execution
control is 1, while bits 10:8 in the IDT-vectoring information field is
2, bit 3 in the interruptibility-state field should be cleared to avoid
the next VM entry fail.

Signed-off-by: Liang Li <liang.z.li@intel.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: f7708796db463410a97b5fa3dd5902f6e8a1d102
master date: 2015-04-10 11:35:46 -0400

xen/arch/x86/hvm/vmx/vmx.c

index f40f89dfb698265a0d9bf576302cec6c3e5bc2a9..8584f1fb12e884a008a6c28b2e33a0e339a5121b 100644 (file)
@@ -2606,7 +2606,8 @@ static void vmx_idtv_reinject(unsigned long idtv_info)
          * Clear NMI-blocking interruptibility info if an NMI delivery faulted.
          * Re-delivery will re-set it (see SDM 3B 25.7.1.2).
          */
-        if ( (idtv_info & INTR_INFO_INTR_TYPE_MASK) == (X86_EVENTTYPE_NMI<<8) )
+        if ( cpu_has_vmx_vnmi && ((idtv_info & INTR_INFO_INTR_TYPE_MASK) ==
+                                 (X86_EVENTTYPE_NMI<<8)) )
         {
             unsigned long intr_info;
 
@@ -2757,8 +2758,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
     hvm_maybe_deassert_evtchn_irq();
 
     __vmread(IDT_VECTORING_INFO, &idtv_info);
-    if ( !nestedhvm_vcpu_in_guestmode(v) && 
-         exit_reason != EXIT_REASON_TASK_SWITCH )
+    if ( exit_reason != EXIT_REASON_TASK_SWITCH )
         vmx_idtv_reinject(idtv_info);
 
     switch ( exit_reason )