[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xen: event channel remapping for emulated MSIs
# HG changeset patch # User Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> # Date 1341319141 -3600 # Node ID 42f76d536b116d2ebad1b6705ae51ecd171d2581 # Parent 2cffb7bf6e5738af59d52446155d49aaeadac540 xen: event channel remapping for emulated MSIs Linux PV on HVM guests remap all the MSIs onto event channels, including MSIs corresponding to QEMU's emulated devices. This patch makes sure that we handle correctly the case of emulated MSI that have been remapped, sending a pirq to the guest instead. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Tested-by: Deep Debroy <ddebroy@xxxxxxxxx> Committed-by: Keir Fraser <keir@xxxxxxx> --- diff -r 2cffb7bf6e57 -r 42f76d536b11 xen/arch/x86/hvm/irq.c --- a/xen/arch/x86/hvm/irq.c Tue Jul 03 13:38:19 2012 +0100 +++ b/xen/arch/x86/hvm/irq.c Tue Jul 03 13:39:01 2012 +0100 @@ -281,6 +281,31 @@ void hvm_inject_msi(struct domain *d, ui >> MSI_DATA_TRIGGER_SHIFT; uint8_t vector = data & MSI_DATA_VECTOR_MASK; + if ( !vector ) + { + int pirq = ((addr >> 32) & 0xffffff00) | ((addr >> 12) & 0xff); + if ( pirq > 0 ) + { + struct pirq *info = pirq_info(d, pirq); + + /* if it is the first time, allocate the pirq */ + if (info->arch.hvm.emuirq == IRQ_UNBOUND) + { + spin_lock(&d->event_lock); + map_domain_emuirq_pirq(d, pirq, IRQ_MSI_EMU); + spin_unlock(&d->event_lock); + } else if (info->arch.hvm.emuirq != IRQ_MSI_EMU) + { + printk("%s: pirq %d does not correspond to an emulated MSI\n", __func__, pirq); + return; + } + send_guest_pirq(d, info); + return; + } else { + printk("%s: error getting pirq from MSI: pirq = %d\n", __func__, pirq); + } + } + vmsi_deliver(d, vector, dest, dest_mode, delivery_mode, trig_mode); } diff -r 2cffb7bf6e57 -r 42f76d536b11 xen/include/asm-x86/irq.h --- a/xen/include/asm-x86/irq.h Tue Jul 03 13:38:19 2012 +0100 +++ b/xen/include/asm-x86/irq.h Tue Jul 03 13:39:01 2012 +0100 @@ -188,6 +188,7 @@ void cleanup_domain_irq_mapping(struct d }) #define IRQ_UNBOUND -1 #define IRQ_PT -2 +#define IRQ_MSI_EMU -3 bool_t cpu_has_pending_apic_eoi(void); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |