>>> On Thu, May 31, 2007 at 10:43 PM, in message <[EMAIL PROTECTED]>, "Li, Xin B" <[EMAIL PROTECTED]> wrote: > 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. > 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