aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel L. Somlo <gsomlo@gmail.com>2014-02-28 13:57:19 -0500
committerMichael S. Tsirkin <mst@redhat.com>2014-03-09 21:09:38 +0200
commit220c8ed536491315b4040d820328b8dfd60d67a7 (patch)
tree6c1002136e9e68984004b535845016bb0032d9e6
parentf1b7e0e498c03e5b4519eeea73b49aafe9d88618 (diff)
downloadqemu-220c8ed536491315b4040d820328b8dfd60d67a7.zip
qemu-220c8ed536491315b4040d820328b8dfd60d67a7.tar.gz
qemu-220c8ed536491315b4040d820328b8dfd60d67a7.tar.bz2
qemu: 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 the emulated ioapic. This patch modifies the emulated ioapic to completely ignore 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: Gabriel L. Somlo <somlo@cmu.edu> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--hw/intc/ioapic.c3
1 files changed, 0 insertions, 3 deletions
diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
index 652dd47..b527932 100644
--- a/hw/intc/ioapic.c
+++ b/hw/intc/ioapic.c
@@ -93,9 +93,6 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
uint32_t mask = 1 << vector;
uint64_t entry = s->ioredtbl[vector];
- if (entry & (1 << IOAPIC_LVT_POLARITY_SHIFT)) {
- level = !level;
- }
if (((entry >> IOAPIC_LVT_TRIGGER_MODE_SHIFT) & 1) ==
IOAPIC_TRIGGER_LEVEL) {
/* level triggered */