diff options
author | Sheng Yang <sheng.yang@intel.com> | 2008-05-15 09:52:48 +0800 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-05-18 17:19:46 +0300 |
commit | 9455f6eb00f3d63273c757710adcc6c60affe9c0 (patch) | |
tree | 72fcebcb3f8b943bbd4f2e7205c609fc1e5a79b2 /virt | |
parent | c94c08b62166f0fb1063a01bc66f9e9121d06c66 (diff) |
KVM: IOAPIC/LAPIC: Enable NMI support
Signed-off-by: Sheng Yang <sheng.yang@intel.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/ioapic.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 4232fd75dd20..99a1736327ec 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c @@ -146,6 +146,11 @@ static void ioapic_inj_irq(struct kvm_ioapic *ioapic, kvm_apic_set_irq(vcpu, vector, trig_mode); } +static void ioapic_inj_nmi(struct kvm_vcpu *vcpu) +{ + kvm_inject_nmi(vcpu); +} + static u32 ioapic_get_delivery_bitmask(struct kvm_ioapic *ioapic, u8 dest, u8 dest_mode) { @@ -239,8 +244,19 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq) } } break; - - /* TODO: NMI */ + case IOAPIC_NMI: + for (vcpu_id = 0; deliver_bitmask != 0; vcpu_id++) { + if (!(deliver_bitmask & (1 << vcpu_id))) + continue; + deliver_bitmask &= ~(1 << vcpu_id); + vcpu = ioapic->kvm->vcpus[vcpu_id]; + if (vcpu) + ioapic_inj_nmi(vcpu); + else + ioapic_debug("NMI to vcpu %d failed\n", + vcpu->vcpu_id); + } + break; default: printk(KERN_WARNING "Unsupported delivery mode %d\n", delivery_mode); |