--- unstable.orig/xen/arch/x86/irq.c 2015-07-07 17:56:52.000000000 +0200 +++ unstable/xen/arch/x86/irq.c 2015-07-07 17:04:08.000000000 +0200 @@ -2502,6 +2502,25 @@ int unmap_domain_pirq_emuirq(struct doma return ret; } +void arch_evtchn_bind_pirq(struct domain *d, int pirq) +{ + int irq = domain_pirq_to_irq(d, pirq); + struct irq_desc *desc; + unsigned long flags; + + if ( irq <= 0 ) + return; + + if ( is_hvm_domain(d) ) + map_domain_emuirq_pirq(d, pirq, IRQ_PT); + + desc = irq_to_desc(irq); + spin_lock_irqsave(&desc->lock, flags); + if ( desc->msi_desc ) + guest_mask_msi_irq(desc, 0); + spin_unlock_irqrestore(&desc->lock, flags); +} + bool_t hvm_domain_use_pirq(const struct domain *d, const struct pirq *pirq) { return is_hvm_domain(d) && pirq && --- unstable.orig/xen/arch/x86/msi.c 2015-07-07 17:56:53.000000000 +0200 +++ unstable/xen/arch/x86/msi.c 2015-07-07 16:50:02.000000000 +0200 @@ -422,10 +422,7 @@ void guest_mask_msi_irq(struct irq_desc static unsigned int startup_msi_irq(struct irq_desc *desc) { - bool_t guest_masked = (desc->status & IRQ_GUEST) && - is_hvm_domain(desc->msi_desc->dev->domain); - - msi_set_mask_bit(desc, 0, guest_masked); + msi_set_mask_bit(desc, 0, !!(desc->status & IRQ_GUEST)); return 0; } --- unstable.orig/xen/common/event_channel.c 2015-07-07 17:56:51.000000000 +0200 +++ unstable/xen/common/event_channel.c 2015-07-07 16:53:47.000000000 +0200 @@ -456,10 +456,7 @@ static long evtchn_bind_pirq(evtchn_bind bind->port = port; -#ifdef CONFIG_X86 - if ( is_hvm_domain(d) && domain_pirq_to_irq(d, pirq) > 0 ) - map_domain_emuirq_pirq(d, pirq, IRQ_PT); -#endif + arch_evtchn_bind_pirq(d, pirq); out: spin_unlock(&d->event_lock); --- unstable.orig/xen/include/asm-arm/irq.h 2015-07-07 17:56:49.000000000 +0200 +++ unstable/xen/include/asm-arm/irq.h 2015-07-07 17:02:00.000000000 +0200 @@ -48,6 +48,8 @@ int release_guest_irq(struct domain *d, void arch_move_irqs(struct vcpu *v); +#define arch_evtchn_bind_pirq(d, pirq) ((void)((d) + (pirq))) + /* Set IRQ type for an SPI */ int irq_set_spi_type(unsigned int spi, unsigned int type); --- unstable.orig/xen/include/xen/irq.h 2015-07-07 17:56:49.000000000 +0200 +++ unstable/xen/include/xen/irq.h 2015-07-07 17:02:49.000000000 +0200 @@ -172,4 +172,8 @@ unsigned int set_desc_affinity(struct ir unsigned int arch_hwdom_irqs(domid_t); #endif +#ifndef arch_evtchn_bind_pirq +void arch_evtchn_bind_pirq(struct domain *, int pirq); +#endif + #endif /* __XEN_IRQ_H__ */