1 /* 2 * irq.c: API for in kernel interrupt controller 3 * Copyright (c) 2007, Intel Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 16 * Place - Suite 330, Boston, MA 02111-1307 USA. 17 * Authors: 18 * Yaozu (Eddie) Dong <Eddie.dong@intel.com> 19 * 20 */ 21 22 #include <linux/module.h> 23 #include <linux/kvm_host.h> 24 25 #include "irq.h" 26 #include "i8254.h" 27 28 /* 29 * check if there are pending timer events 30 * to be processed. 31 */ 32 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) 33 { 34 int ret; 35 36 ret = pit_has_pending_timer(vcpu); 37 ret |= apic_has_pending_timer(vcpu); 38 39 return ret; 40 } 41 EXPORT_SYMBOL(kvm_cpu_has_pending_timer); 42 43 /* 44 * check if there is pending interrupt without 45 * intack. 46 */ 47 int kvm_cpu_has_interrupt(struct kvm_vcpu *v) 48 { 49 struct kvm_pic *s; 50 51 if (kvm_apic_has_interrupt(v) == -1) { /* LAPIC */ 52 if (kvm_apic_accept_pic_intr(v)) { 53 s = pic_irqchip(v->kvm); /* PIC */ 54 return s->output; 55 } else 56 return 0; 57 } 58 return 1; 59 } 60 EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt); 61 62 /* 63 * Read pending interrupt vector and intack. 64 */ 65 int kvm_cpu_get_interrupt(struct kvm_vcpu *v) 66 { 67 struct kvm_pic *s; 68 int vector; 69 70 vector = kvm_get_apic_interrupt(v); /* APIC */ 71 if (vector == -1) { 72 if (kvm_apic_accept_pic_intr(v)) { 73 s = pic_irqchip(v->kvm); 74 s->output = 0; /* PIC */ 75 vector = kvm_pic_read_irq(v->kvm); 76 } 77 } 78 return vector; 79 } 80 EXPORT_SYMBOL_GPL(kvm_cpu_get_interrupt); 81 82 void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu) 83 { 84 kvm_inject_apic_timer_irqs(vcpu); 85 kvm_inject_pit_timer_irqs(vcpu); 86 /* TODO: PIT, RTC etc. */ 87 } 88 EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs); 89 90 void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec) 91 { 92 kvm_apic_timer_intr_post(vcpu, vec); 93 /* TODO: PIT, RTC etc. */ 94 } 95 EXPORT_SYMBOL_GPL(kvm_timer_intr_post); 96 97 void __kvm_migrate_timers(struct kvm_vcpu *vcpu) 98 { 99 __kvm_migrate_apic_timer(vcpu); 100 __kvm_migrate_pit_timer(vcpu); 101 } 102