From 2327c57ff8286b9acf6eeea451513a122531ebbf Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Fri, 8 Aug 2014 05:59:21 +0200 Subject: [PATCH] fix bug 546: ignore ioapic polarity which adds support for OS X --- Makefile | 3 +- changelog.Debian | 6 +++ kvm-x86-ignore-ioapic-polarity.patch | 76 ++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 kvm-x86-ignore-ioapic-polarity.patch diff --git a/Makefile b/Makefile index a05aa75..16e7764 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ RELEASE=3.2 KERNEL_VER=2.6.32 -PKGREL=133 +PKGREL=134 # also include firmware of previous versrion into # the fw package: fwlist-2.6.32-PREV-pve KREL=31 @@ -176,6 +176,7 @@ ${KERNEL_SRC}/README: ${KERNEL_SRC}.org/README cd ${KERNEL_SRC}; patch -p1 <../add-tiocgdev-ioctl.patch #cd ${KERNEL_SRC}; patch -p1 <../fix-nfs-block-count.patch cd ${KERNEL_SRC}; patch -p1 <../fix-idr-header-for-drbd-compilation.patch + cd ${KERNEL_SRC}; patch -p1 <../kvm-x86-ignore-ioapic-polarity.patch sed -i ${KERNEL_SRC}/Makefile -e 's/^EXTRAVERSION.*$$/EXTRAVERSION=${EXTRAVERSION}/' touch $@ diff --git a/changelog.Debian b/changelog.Debian index 4ceb042..ade430c 100644 --- a/changelog.Debian +++ b/changelog.Debian @@ -1,3 +1,9 @@ +pve-kernel-2.6.32 (2.6.32-134) unstable; urgency=low + + * fix bug 546: ignore ioapic polarity which adds support for OS X + + -- Proxmox Support Team Fri, 08 Aug 2014 05:59:12 +0200 + pve-kernel-2.6.32 (2.6.32-133) unstable; urgency=low * fix bug #292: add postrm file for cleanup diff --git a/kvm-x86-ignore-ioapic-polarity.patch b/kvm-x86-ignore-ioapic-polarity.patch new file mode 100644 index 0000000..7bfd7b5 --- /dev/null +++ b/kvm-x86-ignore-ioapic-polarity.patch @@ -0,0 +1,76 @@ +From 100943c54e0947a07d2c0185368fc2fd848f7f28 Mon Sep 17 00:00:00 2001 +From: "Gabriel L. Somlo" +Date: Thu, 27 Feb 2014 23:06:17 -0500 +Subject: 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 +Signed-off-by: Gabriel L. Somlo +[Move documentation to KVM_IRQ_LINE, add ia64. - Paolo] +Signed-off-by: Paolo Bonzini + +diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c +index 53f44be..6a4309b 100644 +--- a/arch/ia64/kvm/kvm-ia64.c ++++ b/arch/ia64/kvm/kvm-ia64.c +@@ -197,6 +197,7 @@ int kvm_dev_ioctl_check_extension(long ext) + case KVM_CAP_IRQCHIP: + case KVM_CAP_MP_STATE: + case KVM_CAP_IRQ_INJECT_STATUS: ++ case KVM_CAP_IOAPIC_POLARITY_IGNORED: + r = 1; + break; + case KVM_CAP_COALESCED_MMIO: +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index d906391..a37da6b 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -1971,6 +1971,7 @@ int kvm_dev_ioctl_check_extension(long ext) + case KVM_CAP_XSAVE: + case KVM_CAP_GET_TSC_KHZ: + case KVM_CAP_KVMCLOCK_CTRL: ++ case KVM_CAP_IOAPIC_POLARITY_IGNORED: + r = 1; + break; + case KVM_CAP_COALESCED_MMIO: +diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h +index 7d76401..a7518be 100644 +--- a/include/linux/kvm.h ++++ b/include/linux/kvm.h +@@ -459,6 +459,7 @@ struct kvm_ppc_smmu_info { + #define KVM_CAP_GET_TSC_KHZ 61 + #define KVM_CAP_TSC_DEADLINE_TIMER 72 + #define KVM_CAP_KVMCLOCK_CTRL 76 ++#define KVM_CAP_IOAPIC_POLARITY_IGNORED 97 + + #ifdef KVM_CAP_IRQ_ROUTING + +diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c +index ce9ed99..1539d37 100644 +--- a/virt/kvm/ioapic.c ++++ b/virt/kvm/ioapic.c +@@ -206,7 +206,6 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id, + int 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; + else { +-- +cgit v0.10.1 + -- 2.39.5