|
@@ -298,12 +298,16 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
|
|
map_irq.entry_nr = nvec;
|
|
map_irq.entry_nr = nvec;
|
|
|
} else if (type == PCI_CAP_ID_MSIX) {
|
|
} else if (type == PCI_CAP_ID_MSIX) {
|
|
|
int pos;
|
|
int pos;
|
|
|
|
|
+ unsigned long flags;
|
|
|
u32 table_offset, bir;
|
|
u32 table_offset, bir;
|
|
|
|
|
|
|
|
pos = dev->msix_cap;
|
|
pos = dev->msix_cap;
|
|
|
pci_read_config_dword(dev, pos + PCI_MSIX_TABLE,
|
|
pci_read_config_dword(dev, pos + PCI_MSIX_TABLE,
|
|
|
&table_offset);
|
|
&table_offset);
|
|
|
bir = (u8)(table_offset & PCI_MSIX_TABLE_BIR);
|
|
bir = (u8)(table_offset & PCI_MSIX_TABLE_BIR);
|
|
|
|
|
+ flags = pci_resource_flags(dev, bir);
|
|
|
|
|
+ if (!flags || (flags & IORESOURCE_UNSET))
|
|
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
|
|
map_irq.table_base = pci_resource_start(dev, bir);
|
|
map_irq.table_base = pci_resource_start(dev, bir);
|
|
|
map_irq.entry_nr = msidesc->msi_attrib.entry_nr;
|
|
map_irq.entry_nr = msidesc->msi_attrib.entry_nr;
|