>> I don't think this patch is complete to add NMIP support to KVM
>
>Could you be more specific on whats left to be done?  From 
>what I could read in the doc, this seemed complete.
>

This is a good start, and we also need to add a vmexit handler to handle
exit reason 8, NMI pending.
And the major issue, I think, is how guest uses NMI, although from
virtualization view, we should not think from that, but we need make
sure all possible guest NMI usage model works well.
Thanks.
-Xin



>> and can you pls exclude it from current APIC patchsets? We 
>can revisit it later with more thoughts.
>
>I don't have a problem with excluding it.  Honestly, I 
>primarily wanted a working demonstration of how I envisioned 
>the kvm_irqpin mechanism to work more than anything.  The 
>woodcrest I have doesn't seem to support VNMI, so I am not 
>able to take advantage of this patch anyway.  Since the 
>woodcrest is pretty new, I assume most VMX systems would run 
>into similar limitations.  I haven't tried it yet on my merom 
>laptop, but I would guess it has the same problem since they 
>are both C2D.
>
>Regards,
>-Greg
>
>> 
>> -  Xin 
>> 
>>>-----  Original Message-----
>>>From: kvm-  devel-  [EMAIL PROTECTED] 
>>>[mailto:kvm-  devel-  [EMAIL PROTECTED] On Behalf Of 
>>>Gregory Haskins
>>>Sent: Friday, June 01, 2007 2:09 AM
>>>To: kvm-  [EMAIL PROTECTED]
>>>Subject: [kvm-  devel] [PATCH 6/9] KVM: Adds support for real 
>>>NMI injection onVMX processors
>>>
>>>Signed-  off-  by: Gregory Haskins <[EMAIL PROTECTED]>
>>>---
>>>
>>> drivers/kvm/vmx.c |   56 
>>>+++++++++++++++++++++++++++++++++++++++++++++++++----
>>> drivers/kvm/vmx.h |    3 +++
>>> 2 files changed, 55 insertions(+), 4 deletions(-  )
>>>
>>>diff --  git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
>>>index 82e40c9..7923a42 100644
>>>---   a/drivers/kvm/vmx.c
>>>+++ b/drivers/kvm/vmx.c
>>>@@ -  1301,7 +1301,14 @@ static int vmx_vcpu_setup(struct 
>kvm_vcpu *vcpu)
>>>                            PIN_BASED_VM_EXEC_CONTROL,
>>>                            PIN_BASED_EXT_INTR_MASK   /* 20.6.1 */
>>>                            | PIN_BASED_NMI_EXITING   /* 20.6.1 */
>>>+                           | PIN_BASED_VIRTUAL_NMI   /* 20.6.1 */
>>>                     );
>>>+
>>>+    if (!(vmcs_read32(PIN_BASED_VM_EXEC_CONTROL) & 
>>>PIN_BASED_VIRTUAL_NMI))
>>>+            printk(KERN_DEBUG "KVM: Warning -   Host 
>>>processor does " \
>>>+                   "not support virtual-  NMI injection.  
>>>Using IRQ " \
>>>+                   "method\n");
>>>+ 
>>>     vmcs_write32_fixedbits(MSR_IA32_VMX_PROCBASED_CTLS,
>>>                            CPU_BASED_VM_EXEC_CONTROL,
>>>                            CPU_BASED_HLT_EXITING         /* 
>>>20.6.2 */
>>>@@ -  1450,6 +1457,37 @@ static void inject_rmode_irq(struct 
>>>kvm_vcpu *vcpu, int irq)
>>>     vmcs_writel(GUEST_RSP, (vmcs_readl(GUEST_RSP) & 
>>>~0xffff) | (sp -   6));
>>> }
>>> 
>>>+static void do_nmi_requests(struct kvm_vcpu *vcpu)
>>>+{
>>>+    int nmi_window = 0;
>>>+
>>>+    BUG_ON(!(test_bit(kvm_irqpin_nmi, &vcpu-  >irq.pending)));
>>>+
>>>+    nmi_window =
>>>+            (((vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & 0xb) == 0)
>>>+             && (vmcs_read32(VM_ENTRY_INTR_INFO_FIELD)
>>>+                 & INTR_INFO_VALID_MASK));
>>>+
>>>+    if (nmi_window) {
>>>+            if (vcpu-  >rmode.active)
>>>+                    inject_rmode_irq(vcpu, 2);
>>>+            else
>>>+                    vmcs_write32(VM_ENTRY_INTR_INFO_FIELD,
>>>+                                 2 |
>>>+                                 INTR_TYPE_NMI |
>>>+                                 INTR_INFO_VALID_MASK);
>>>+
>>>+            __clear_bit(kvm_irqpin_nmi, &vcpu-  >irq.pending);
>>>+    } else {
>>>+            /*
>>>+             * NMIs blocked.  Wait for unblock.
>>>+             */
>>>+            u32 cbvec = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL);
>>>+            cbvec |= CPU_BASED_NMI_EXITING;
>>>+            vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cbvec); 
>>>+    }
>>>+}
>>>+
>>> static void do_intr_requests(struct kvm_vcpu *vcpu,
>>>                         struct kvm_run *kvm_run,
>>>                         kvm_irqpin_t pin)
>>>@@ -  1482,9 +1520,11 @@ static void do_intr_requests(struct 
>>>kvm_vcpu *vcpu,
>>>                     break;
>>>             case kvm_irqpin_nmi:
>>>                     /*
>>>-                     * FIXME: Someday we will handle this using the
>>>-                     * specific VMX NMI features.  For now, 
>>>just inject
>>>-                     * the NMI as a standard interrupt on vector 2
>>>+                     * We should only get here if the processor does
>>>+                     * not support virtual NMIs.  Inject 
>>>the NMI as a
>>>+                     * standard interrupt on vector 2.  The 
>>>implication is
>>>+                     * that NMIs are going to be subject to 
>>>RFLAGS.IF
>>>+                     * masking, unfortunately.
>>>                      */
>>>                     ack.flags |= KVM_IRQACKDATA_VECTOR_VALID;
>>>                     ack.vector = 2;
>>>@@ -  1534,6 +1574,8 @@ static void 
>>>clear_pending_controls(struct kvm_vcpu *vcpu,
>>>     else
>>>             cbvec &= ~CPU_BASED_VIRTUAL_INTR_PENDING;
>>> 
>>>+    cbvec &= ~CPU_BASED_NMI_EXITING;
>>>+
>>>     vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cbvec);
>>> }
>>> 
>>>@@ -  1550,7 +1592,6 @@ static void do_interrupt_requests(struct 
>>>kvm_vcpu *vcpu,
>>>             switch (pin) {
>>>             case kvm_irqpin_localint:
>>>             case kvm_irqpin_extint:
>>>-            case kvm_irqpin_nmi:
>>>                     do_intr_requests(vcpu, kvm_run, pin);
>>>                     break;
>>>             case kvm_irqpin_smi:
>>>@@ -  1558,6 +1599,13 @@ static void 
>>>do_interrupt_requests(struct kvm_vcpu *vcpu,
>>>                     printk(KERN_WARNING "KVM: dropping 
>>>unhandled SMI\n");
>>>                     __clear_bit(pin, &vcpu-  >irq.pending);
>>>                     break;
>>>+            case kvm_irqpin_nmi:
>>>+                    if (vmcs_read32(PIN_BASED_VM_EXEC_CONTROL)
>>>+                        & PIN_BASED_VIRTUAL_NMI)
>>>+                            do_nmi_requests(vcpu);
>>>+                    else
>>>+                            do_intr_requests(vcpu, kvm_run, pin);   
>>>+                    break;
>>>             case kvm_irqpin_invalid:
>>>                     /* drop */
>>>                     break;
>>>diff --  git a/drivers/kvm/vmx.h b/drivers/kvm/vmx.h
>>>index d0dc93d..d3fe017 100644
>>>---   a/drivers/kvm/vmx.h
>>>+++ b/drivers/kvm/vmx.h
>>>@@ -  35,6 +35,7 @@
>>> #define CPU_BASED_CR8_LOAD_EXITING      0x00080000
>>> #define CPU_BASED_CR8_STORE_EXITING     0x00100000
>>> #define CPU_BASED_TPR_SHADOW            0x00200000
>>>+#define CPU_BASED_NMI_EXITING           0x00400000
>>> #define CPU_BASED_MOV_DR_EXITING        0x00800000
>>> #define CPU_BASED_UNCOND_IO_EXITING     0x01000000
>>> #define CPU_BASED_ACTIVATE_IO_BITMAP    0x02000000
>>>@@ -  44,6 +45,7 @@
>>> 
>>> #define PIN_BASED_EXT_INTR_MASK 0x1
>>> #define PIN_BASED_NMI_EXITING   0x8
>>>+#define PIN_BASED_VIRTUAL_NMI   0x20
>>> 
>>> #define VM_EXIT_ACK_INTR_ON_EXIT        0x00008000
>>> #define VM_EXIT_HOST_ADD_SPACE_SIZE     0x00000200
>>>@@ -  221,6 +223,7 @@ enum vmcs_field {
>>> #define VECTORING_INFO_VALID_MASK           INTR_INFO_VALID_MASK
>>> 
>>> #define INTR_TYPE_EXT_INTR              (0 << 8) /* external 
>>>interrupt */
>>>+#define INTR_TYPE_NMI                   (2 << 8) /* 
>>>non-  maskable interrupt */
>>> #define INTR_TYPE_EXCEPTION             (3 << 8) /* processor 
>>>exception */
>>> 
>>> /*
>>>
>>>
>>>---------------------------------------------------------------
>>>----------
>>>This SF.net email is sponsored by DB2 Express
>>>Download DB2 Express C -   the FREE version of DB2 express and take
>>>control of your XML. No limits. Just data. Click to get it now.
>>>http://sourceforge.net/powerbar/db2/
>>>_______________________________________________
>>>kvm-  devel mailing list
>>>kvm-  [EMAIL PROTECTED]
>>>https://lists.sourceforge.net/lists/listinfo/kvm-  devel
>>>
>
>

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to