--- unstable.orig/xen/arch/x86/hvm/vmsi.c 2015-06-22 11:50:41.000000000 +0200 +++ unstable/xen/arch/x86/hvm/vmsi.c 2015-06-26 11:50:44.000000000 +0200 @@ -267,18 +267,30 @@ static int msixtbl_write(struct vcpu *v, int r = X86EMUL_UNHANDLEABLE; unsigned long flags; struct irq_desc *desc; +unsigned int seg, bus, slot, func;//temp if ( (len != 4 && len != 8) || (address & (len - 1)) ) +{//temp + printk("MSI-X bad write (%lx,%lu)\n", address, len);//temp return r; +} rcu_read_lock(&msixtbl_rcu_lock); entry = msixtbl_find_entry(v, address); if ( !entry ) +{//temp + printk("MSI-X not found (%lx,%lu)\n", address, len);//temp goto out; +} nr_entry = (address - entry->gtable) / PCI_MSIX_ENTRY_SIZE; offset = address & (PCI_MSIX_ENTRY_SIZE - 1); +seg = entry->pdev->seg; +bus = entry->pdev->bus; +slot = PCI_SLOT(entry->pdev->devfn); +func = PCI_FUNC(entry->pdev->devfn); +printk("MSI-X write %04x:%02x:%02x.%u#%03x:%lx:%lu\n", seg, bus, slot, func, nr_entry, offset, len);//temp if ( offset != PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET ) { index = offset / sizeof(uint32_t); @@ -302,25 +314,37 @@ static int msixtbl_write(struct vcpu *v, if ( !(val & PCI_MSIX_VECTOR_BITMASK) && test_and_clear_bit(nr_entry, &entry->table_flags) ) { +printk("MSI-X defer %04x:%02x:%02x.%u#%03x:%lx:%lu\n", seg, bus, slot, func, nr_entry, offset, len);//temp v->arch.hvm_vcpu.hvm_io.msix_unmask_address = address; goto out; } msi_desc = msixtbl_addr_to_desc(entry, address); if ( !msi_desc || msi_desc->irq < 0 ) +{//temp + printk("MSI-X %04x:%02x:%02x.%u#%03x no IRQ (%d)\n", seg, bus, slot, func, nr_entry, msi_desc ? msi_desc->irq : INT_MIN);//temp goto out; +} +ASSERT(entry->pdev == msi_desc->dev);//temp desc = irq_to_desc(msi_desc->irq); if ( !desc ) +{//temp + printk("MSI-X %04x:%02x:%02x.%u#%03x no IRQ%d desc\n", seg, bus, slot, func, nr_entry, msi_desc->irq);//temp goto out; +} spin_lock_irqsave(&desc->lock, flags); if ( !desc->msi_desc ) +{//temp + printk("MSI-X %04x:%02x:%02x.%u#%03x no IRQ%d MSI desc\n", seg, bus, slot, func, nr_entry, msi_desc->irq);//temp goto unlock; +} ASSERT(msi_desc == desc->msi_desc); +printk("MSI-X %04x:%02x:%02x.%u#%03x IRQ%d mask=%d\n", seg, bus, slot, func, nr_entry, msi_desc->irq, !!(val & PCI_MSIX_VECTOR_BITMASK));//temp guest_mask_msi_irq(desc, !!(val & PCI_MSIX_VECTOR_BITMASK)); unlock: