linux/arch/x86/kvm/irq.c
<<
>>
Prefs
   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#include "x86.h"
  28
  29/*
  30 * check if there are pending timer events
  31 * to be processed.
  32 */
  33int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
  34{
  35        int ret;
  36
  37        ret = pit_has_pending_timer(vcpu);
  38        ret |= apic_has_pending_timer(vcpu);
  39
  40        return ret;
  41}
  42EXPORT_SYMBOL(kvm_cpu_has_pending_timer);
  43
  44/*
  45 * check if there is pending interrupt without
  46 * intack.
  47 */
  48int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
  49{
  50        struct kvm_pic *s;
  51
  52        if (!irqchip_in_kernel(v->kvm))
  53                return v->arch.interrupt.pending;
  54
  55        if (kvm_apic_has_interrupt(v) == -1) {  /* LAPIC */
  56                if (kvm_apic_accept_pic_intr(v)) {
  57                        s = pic_irqchip(v->kvm);        /* PIC */
  58                        return s->output;
  59                } else
  60                        return 0;
  61        }
  62        return 1;
  63}
  64EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
  65
  66/*
  67 * Read pending interrupt vector and intack.
  68 */
  69int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
  70{
  71        struct kvm_pic *s;
  72        int vector;
  73
  74        if (!irqchip_in_kernel(v->kvm))
  75                return v->arch.interrupt.nr;
  76
  77        vector = kvm_get_apic_interrupt(v);     /* APIC */
  78        if (vector == -1) {
  79                if (kvm_apic_accept_pic_intr(v)) {
  80                        s = pic_irqchip(v->kvm);
  81                        s->output = 0;          /* PIC */
  82                        vector = kvm_pic_read_irq(v->kvm);
  83                }
  84        }
  85        return vector;
  86}
  87EXPORT_SYMBOL_GPL(kvm_cpu_get_interrupt);
  88
  89void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu)
  90{
  91        kvm_inject_apic_timer_irqs(vcpu);
  92        kvm_inject_pit_timer_irqs(vcpu);
  93        /* TODO: PIT, RTC etc. */
  94}
  95EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
  96
  97void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
  98{
  99        __kvm_migrate_apic_timer(vcpu);
 100        __kvm_migrate_pit_timer(vcpu);
 101}
 102