diff options
author | Gabriel L. Somlo <gsomlo@gmail.com> | 2014-02-27 23:06:17 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-03-13 06:58:21 -0400 |
commit | 100943c54e0947a07d2c0185368fc2fd848f7f28 (patch) | |
tree | a69aea55ffa31a8d365974f8c9217a339cdfb27f /virt/kvm | |
parent | facb0139698923dc7b7d15cafbb319219969f4fd (diff) |
kvm: x86: ignore ioapic polarity
Both QEMU and KVM have already accumulated a significant number of
optimizations based on the hard-coded assumption that ioapic polarity
will always use the ActiveHigh convention, where the logical and
physical states of level-triggered irq lines always match (i.e.,
active(asserted) == high == 1, inactive == low == 0). QEMU guests
are expected to follow directions given via ACPI and configure the
ioapic with polarity 0 (ActiveHigh). However, even when misbehaving
guests (e.g. OS X <= 10.9) set the ioapic polarity to 1 (ActiveLow),
QEMU will still use the ActiveHigh signaling convention when
interfacing with KVM.
This patch modifies KVM to completely ignore ioapic polarity as set by
the guest OS, enabling misbehaving guests to work alongside those which
comply with the ActiveHigh polarity specified by QEMU's ACPI tables.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Gabriel L. Somlo <somlo@cmu.edu>
[Move documentation to KVM_IRQ_LINE, add ia64. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/ioapic.c | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index ce9ed99ad7dc..1539d3757a04 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
@@ -328,7 +328,6 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id, | |||
328 | irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], | 328 | irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], |
329 | irq_source_id, level); | 329 | irq_source_id, level); |
330 | entry = ioapic->redirtbl[irq]; | 330 | entry = ioapic->redirtbl[irq]; |
331 | irq_level ^= entry.fields.polarity; | ||
332 | if (!irq_level) { | 331 | if (!irq_level) { |
333 | ioapic->irr &= ~mask; | 332 | ioapic->irr &= ~mask; |
334 | ret = 1; | 333 | ret = 1; |