aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation
diff options
context:
space:
mode:
authorGabriel L. Somlo <gsomlo@gmail.com>2014-02-27 23:06:17 -0500
committerPaolo Bonzini <pbonzini@redhat.com>2014-03-13 06:58:21 -0400
commit100943c54e0947a07d2c0185368fc2fd848f7f28 (patch)
treea69aea55ffa31a8d365974f8c9217a339cdfb27f /Documentation
parentfacb0139698923dc7b7d15cafbb319219969f4fd (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 'Documentation')
-rw-r--r--Documentation/virtual/kvm/api.txt16
1 files changed, 15 insertions, 1 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 6cd63a9010fb..4714f282a43e 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -612,6 +612,20 @@ On some architectures it is required that an interrupt controller model has
612been previously created with KVM_CREATE_IRQCHIP. Note that edge-triggered 612been previously created with KVM_CREATE_IRQCHIP. Note that edge-triggered
613interrupts require the level to be set to 1 and then back to 0. 613interrupts require the level to be set to 1 and then back to 0.
614 614
615On real hardware, interrupt pins can be active-low or active-high. This
616does not matter for the level field of struct kvm_irq_level: 1 always
617means active (asserted), 0 means inactive (deasserted).
618
619x86 allows the operating system to program the interrupt polarity
620(active-low/active-high) for level-triggered interrupts, and KVM used
621to consider the polarity. However, due to bitrot in the handling of
622active-low interrupts, the above convention is now valid on x86 too.
623This is signaled by KVM_CAP_X86_IOAPIC_POLARITY_IGNORED. Userspace
624should not present interrupts to the guest as active-low unless this
625capability is present (or unless it is not using the in-kernel irqchip,
626of course).
627
628
615ARM/arm64 can signal an interrupt either at the CPU level, or at the 629ARM/arm64 can signal an interrupt either at the CPU level, or at the
616in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to 630in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to
617use PPIs designated for specific cpus. The irq field is interpreted 631use PPIs designated for specific cpus. The irq field is interpreted
@@ -628,7 +642,7 @@ The irq_type field has the following values:
628 642
629(The irq_id field thus corresponds nicely to the IRQ ID in the ARM GIC specs) 643(The irq_id field thus corresponds nicely to the IRQ ID in the ARM GIC specs)
630 644
631In both cases, level is used to raise/lower the line. 645In both cases, level is used to assert/deassert the line.
632 646
633struct kvm_irq_level { 647struct kvm_irq_level {
634 union { 648 union {