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
  28/*
  29 * check if there are pending timer events
  30 * to be processed.
  31 */
  32int 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}
  41EXPORT_SYMBOL(kvm_cpu_has_pending_timer);
  42
  43/*
  44 * check if there is pending interrupt without
  45 * intack.
  46 */
  47int 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}
  60EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
  61
  62/*
  63 * Read pending interrupt vector and intack.
  64 */
  65int 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(s);
  76                }
  77        }
  78        return vector;
  79}
  80EXPORT_SYMBOL_GPL(kvm_cpu_get_interrupt);
  81
  82void 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}
  88EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
  89
  90void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
  91{
  92        kvm_apic_timer_intr_post(vcpu, vec);
  93        kvm_pit_timer_intr_post(vcpu, vec);
  94        /* TODO: PIT, RTC etc. */
  95}
  96EXPORT_SYMBOL_GPL(kvm_timer_intr_post);
  97
  98void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
  99{
 100        __kvm_migrate_apic_timer(vcpu);
 101        __kvm_migrate_pit_timer(vcpu);
 102}
 103