summaryrefslogtreecommitdiff
path: root/kvm_irq.c
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2011-04-28 15:23:54 -0700
committerRobert Mustacchi <rm@joyent.com>2011-04-28 15:23:54 -0700
commit98bf1f0d717fde84f1cb7c799441138775c4ea41 (patch)
treed056feefac3236f23edfca0c40652dc3b2417ad1 /kvm_irq.c
parent9004dbec827f0fb5ef487efc36856f74bcb10dac (diff)
downloadillumos-kvm-98bf1f0d717fde84f1cb7c799441138775c4ea41.tar.gz
HVM-143 kvm C files should all have the kvm_ prefix on them
Diffstat (limited to 'kvm_irq.c')
-rw-r--r--kvm_irq.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/kvm_irq.c b/kvm_irq.c
new file mode 100644
index 0000000..7d698b6
--- /dev/null
+++ b/kvm_irq.c
@@ -0,0 +1,93 @@
+/*
+ * irq.c: API for in kernel interrupt controller
+ * Copyright (c) 2007, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ * Authors:
+ * Yaozu (Eddie) Dong <Eddie.dong@intel.com>
+ *
+ * Ported to illumos by Joyent.
+ * Copyright 2011 Joyent, Inc. All rights reserved.
+ */
+
+/*
+ * XXX These header includes are really broken
+ */
+#include "msr.h"
+#include "irqflags.h"
+#include "kvm_host.h"
+#include "kvm_x86host.h"
+#include "iodev.h"
+#include "kvm.h"
+#include "irq.h"
+#include "ioapic.h"
+
+/* XXX This should never exist */
+extern int irqchip_in_kernel(struct kvm *);
+
+/*
+ * check if there are pending timer events
+ * to be processed.
+ */
+int
+kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
+{
+ int ret;
+
+ ret = pit_has_pending_timer(vcpu);
+ ret |= apic_has_pending_timer(vcpu);
+
+ return (ret);
+}
+
+void
+kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu)
+{
+ kvm_inject_apic_timer_irqs(vcpu);
+ kvm_inject_pit_timer_irqs(vcpu);
+ /* TODO: PIT, RTC etc. */
+}
+
+void
+kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)
+{
+ int i;
+
+ ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID);
+
+ mutex_enter(&kvm->irq_lock);
+ if (irq_source_id < 0 ||
+ irq_source_id >= BITS_PER_LONG) {
+#ifdef XXX
+ printk(KERN_ERR "kvm: IRQ source ID out of range!\n");
+#else
+ XXX_KVM_PROBE;
+#endif
+ goto unlock;
+ }
+ clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap);
+ if (!irqchip_in_kernel(kvm))
+ goto unlock;
+
+ for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) {
+ clear_bit(irq_source_id, &kvm->arch.vioapic->irq_states[i]);
+ if (i >= 16)
+ continue;
+#ifdef CONFIG_X86
+ clear_bit(irq_source_id, &pic_irqchip(kvm)->irq_states[i]);
+#endif
+ }
+unlock:
+ mutex_exit(&kvm->irq_lock);
+}