]> err.no Git - linux-2.6/blobdiff - drivers/kvm/irq.c
[Blackfin] arch: Add proper SW System Reset delay sequence
[linux-2.6] / drivers / kvm / irq.c
index 0b4430a0cae078fea81910db40f207a6cf0f757c..7628c7ff628ff1db90f3a9a4d20df792bb59f4ad 100644 (file)
@@ -33,8 +33,11 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
        struct kvm_pic *s;
 
        if (kvm_apic_has_interrupt(v) == -1) {  /* LAPIC */
-               s = pic_irqchip(v->kvm);        /* PIC */
-               return s->output;
+               if (kvm_apic_accept_pic_intr(v)) {
+                       s = pic_irqchip(v->kvm);        /* PIC */
+                       return s->output;
+               } else
+                       return 0;
        }
        return 1;
 }
@@ -50,9 +53,11 @@ int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
 
        vector = kvm_get_apic_interrupt(v);     /* APIC */
        if (vector == -1) {
-               s = pic_irqchip(v->kvm);
-               s->output = 0;          /* PIC */
-               vector = kvm_pic_read_irq(s);
+               if (kvm_apic_accept_pic_intr(v)) {
+                       s = pic_irqchip(v->kvm);
+                       s->output = 0;          /* PIC */
+                       vector = kvm_pic_read_irq(s);
+               }
        }
        return vector;
 }
@@ -70,11 +75,24 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
 {
        int ipi_pcpu = vcpu->cpu;
 
+       if (waitqueue_active(&vcpu->wq)) {
+               wake_up_interruptible(&vcpu->wq);
+               ++vcpu->stat.halt_wakeup;
+       }
        if (vcpu->guest_mode)
                smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0, 0);
 }
 
-void kvm_ioapic_update_eoi(struct kvm *kvm, int vector)
+void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu)
+{
+       kvm_inject_apic_timer_irqs(vcpu);
+       /* TODO: PIT, RTC etc. */
+}
+EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
+
+void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
 {
-       /* TODO: for kernel IOAPIC */
+       kvm_apic_timer_intr_post(vcpu, vec);
+       /* TODO: PIT, RTC etc. */
 }
+EXPORT_SYMBOL_GPL(kvm_timer_intr_post);