diff options
Diffstat (limited to 'kvm_ioapic.c')
-rw-r--r-- | kvm_ioapic.c | 64 |
1 files changed, 33 insertions, 31 deletions
diff --git a/kvm_ioapic.c b/kvm_ioapic.c index 09c88f1..3e53bcf 100644 --- a/kvm_ioapic.c +++ b/kvm_ioapic.c @@ -41,32 +41,12 @@ #include "kvm_ioapic.h" #include "irq.h" -static int -ioapic_deliver(struct kvm_ioapic *ioapic, int irq) -{ - union kvm_ioapic_redirect_entry *entry = &ioapic->redirtbl[irq]; - struct kvm_lapic_irq irqe; - - irqe.dest_id = entry->fields.dest_id; - irqe.vector = entry->fields.vector; - irqe.dest_mode = entry->fields.dest_mode; - irqe.trig_mode = entry->fields.trig_mode; - irqe.delivery_mode = entry->fields.delivery_mode << 8; - irqe.level = 1; - irqe.shorthand = 0; +static int ioapic_deliver(struct kvm_ioapic *, int); -#ifdef CONFIG_X86 - /* Always delivery PIT interrupt to vcpu 0 */ - if (irq == 0) { - irqe.dest_mode = 0; /* Physical mode. */ - /* - * need to read apic_id from apic regiest since - * it can be rewritten - */ - irqe.dest_id = ioapic->kvm->bsp_vcpu->vcpu_id; - } -#endif - return (kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe)); +struct kvm_ioapic * +ioapic_irqchip(struct kvm *kvm) +{ + return (kvm->arch.vioapic); } static unsigned long @@ -191,6 +171,34 @@ ioapic_write_indirect(struct kvm_ioapic *ioapic, uint32_t val) } } +static int +ioapic_deliver(struct kvm_ioapic *ioapic, int irq) +{ + union kvm_ioapic_redirect_entry *entry = &ioapic->redirtbl[irq]; + struct kvm_lapic_irq irqe; + + irqe.dest_id = entry->fields.dest_id; + irqe.vector = entry->fields.vector; + irqe.dest_mode = entry->fields.dest_mode; + irqe.trig_mode = entry->fields.trig_mode; + irqe.delivery_mode = entry->fields.delivery_mode << 8; + irqe.level = 1; + irqe.shorthand = 0; + +#ifdef CONFIG_X86 + /* Always delivery PIT interrupt to vcpu 0 */ + if (irq == 0) { + irqe.dest_mode = 0; /* Physical mode. */ + /* + * need to read apic_id from apic regiest since + * it can be rewritten + */ + irqe.dest_id = ioapic->kvm->bsp_vcpu->vcpu_id; + } +#endif + return (kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe)); +} + int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) { @@ -464,9 +472,3 @@ kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) return (0); } - -struct kvm_ioapic * -ioapic_irqchip(struct kvm *kvm) -{ - return (kvm->arch.vioapic); -} |