--- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -207,10 +207,24 @@ static void read_msi_msg(struct msi_desc static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg) { + if(!(msg->data & MSI_DATA_VECTOR_MASK) || !(msg->data & MSI_DATA_LEVEL_ASSERT)//temp + || (msg->data & MSI_DATA_DELIVERY_MODE_MASK) > MSI_DATA_DELIVERY_LOWPRI) {//temp + printk("MSI: addr=%08x%08x data=%08x dest=%08x bogus!\n", msg->address_hi, msg->address_lo, msg->data, msg->dest32); + dump_execution_state(); + } entry->msg = *msg; if ( iommu_enabled ) + {//temp iommu_update_ire_from_msi(entry, msg); + if(!(entry->msg.data & MSI_DATA_VECTOR_MASK) || !(msg->data & MSI_DATA_VECTOR_MASK) + || !(msg->data & entry->msg.data & MSI_DATA_LEVEL_ASSERT) + || (entry->msg.data & MSI_DATA_DELIVERY_MODE_MASK) > MSI_DATA_DELIVERY_LOWPRI + || (msg->data & MSI_DATA_DELIVERY_MODE_MASK) > MSI_DATA_DELIVERY_LOWPRI) + printk("MSI: addr=%08x%08x data=%08x dest=%08x (%08x%08x, %08x, %08x) bogus!\n", + entry->msg.address_hi, entry->msg.address_lo, entry->msg.data, entry->msg.dest32, + msg->address_hi, msg->address_lo, msg->data, msg->dest32); + } switch ( entry->msi_attrib.type ) { @@ -268,6 +282,11 @@ static void set_msi_affinity(struct irq_ memset(&msg, 0, sizeof(msg)); read_msi_msg(msi_desc, &msg); + if(!(msg.data & MSI_DATA_VECTOR_MASK) || !(msg.data & MSI_DATA_LEVEL_ASSERT)//temp + || (msg.data & MSI_DATA_DELIVERY_MODE_MASK) > MSI_DATA_DELIVERY_LOWPRI) {//temp + printk("MSI: addr=%08x%08x data=%08x bogus!\n", msg.address_hi, msg.address_lo, msg.data); + dump_execution_state(); + } msg.data &= ~MSI_DATA_VECTOR_MASK; msg.data |= MSI_DATA_VECTOR(desc->arch.vector); @@ -1024,6 +1043,9 @@ int pci_restore_msi_state(struct pci_dev spin_unlock_irqrestore(&desc->lock, flags); return -EINVAL; } +printk("MSI[%04x:%02x:%02x:%u]: addr=%08x%08x data=%08x dest=%08x\n",//temp + pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),//temp + entry->msg.address_hi, entry->msg.address_lo, entry->msg.data, entry->msg.dest32);//temp if ( entry->msi_attrib.type == PCI_CAP_ID_MSI ) msi_set_enable(pdev, 0); @@ -1066,7 +1088,7 @@ unsigned int pci_msix_get_table_len(stru return len; } -static void dump_msi(unsigned char key) +/*static*/ void dump_msi(unsigned char key) { unsigned int irq;