apic polarity in KVM does not work: too many things assume active high. Let's not pretend it works, let's just ignore polarity flag. If we ever want to emulate it exactly, this will need a feature flag anyway. Also report this to userspace: this makes it possible to report the interrupt active-low in ACPI, this way we are closer to real hardware. This patch fixes OSX running on KVM. Reported-by: "Gabriel L. Somlo" <gsomlo@xxxxxxxxx> Signed-off-by: Michael S. Tsirkin <mst@xxxxxxxxxx> --- Gabriel, could you confirm this fixes OSX for you? If you can play with linux tweaking interrupt to active low, that would be very nice too: it's weekend here. diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 902f124..db29b27 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -674,6 +676,7 @@ struct kvm_ppc_smmu_info { #define KVM_CAP_ARM_EL1_32BIT 93 #define KVM_CAP_SPAPR_MULTITCE 94 #define KVM_CAP_EXT_EMUL_CPUID 95 +#define KVM_CAP_X86_IOAPIC_POLARITY_IGNORED 96 #ifdef KVM_CAP_IRQ_ROUTING diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 2d68297..ad170b4 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, irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], irq_source_id, level); entry = ioapic->redirtbl[irq]; - irq_level ^= entry.fields.polarity; if (!irq_level) { ioapic->irr &= ~mask; ret = 1; -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html