diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index a36692c313..87caef300a 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -329,6 +329,8 @@ static int msixtbl_write(struct vcpu *v, unsigned long address, ASSERT(msi_desc == desc->msi_desc); + printk("%smasking entry %#x\n", + (val & PCI_MSIX_VECTOR_BITMASK) ? "" : "un", nr_entry); guest_mask_msi_irq(desc, !!(val & PCI_MSIX_VECTOR_BITMASK)); unlock: @@ -430,6 +432,9 @@ static void add_msixtbl_entry(struct domain *d, entry->gtable = (unsigned long) gtable; list_add_rcu(&entry->list, &d->arch.hvm_domain.msixtbl_list); + + printk("%04x:%02x:%02x.%u added to msixtbl list\n", pdev->seg, pdev->bus, + PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); } static void free_msixtbl_entry(struct rcu_head *rcu) @@ -510,8 +515,12 @@ out: (gtable + msi_desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET) ) + { + printk("msixtbl_pt_register: detected attempt to write to vector ctrl (entry %#x)\n", + msi_desc->msi_attrib.entry_nr); v->arch.hvm_vcpu.hvm_io.msix_unmask_address = v->arch.hvm_vcpu.hvm_io.msix_snoop_address; + } } } @@ -619,6 +628,7 @@ void msix_write_completion(struct vcpu *v) return; v->arch.hvm_vcpu.hvm_io.msix_unmask_address = 0; + printk("Detected MSI-X unmask in write completion\n"); if ( msixtbl_write(v, ctrl_address, 4, 0) != X86EMUL_OKAY ) gdprintk(XENLOG_WARNING, "MSI-X write completion failure\n"); } diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index 77998f4fb3..0ca31c22e2 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -980,6 +980,8 @@ static int msix_capability_init(struct pci_dev *dev, list_add_tail(&entry->list, &dev->msi_list); *desc = entry; + printk("%04x:%02x:%02x.%u added entry %#x to msi_list\n", + seg, bus, slot, func, msi->entry_nr); } if ( !msix->used_entries ) @@ -1297,6 +1299,18 @@ int pci_msi_conf_write_intercept(struct pci_dev *pdev, unsigned int reg, if ( reg != msix_control_reg(pos) || size != 2 ) return -EACCES; + printk("MSIX ctrl write. Enabled: %d Maskall: %d. " + "Configured entries:\n", + !!(*data & PCI_MSIX_FLAGS_ENABLE), + !!(*data & PCI_MSIX_FLAGS_MASKALL)); + list_for_each_entry( entry, &pdev->msi_list, list ) + { + printk("%#x host_masked: %d guest_masked: %d\n", + entry->msi_attrib.entry_nr, + entry->msi_attrib.host_masked, + entry->msi_attrib.guest_masked); + } + pdev->msix->guest_maskall = !!(*data & PCI_MSIX_FLAGS_MASKALL); if ( pdev->msix->host_maskall ) *data |= PCI_MSIX_FLAGS_MASKALL;