]> xenbits.xensource.com Git - qemu-xen-traditional.git/commitdiff
Align MSI-X table mmap/munmap
authorIan Jackson <ian.jackson@eu.citrix.com>
Fri, 23 Oct 2009 16:53:23 +0000 (17:53 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Fri, 23 Oct 2009 16:53:23 +0000 (17:53 +0100)
Force msi-x init mmap to a page boundary or mmap fails with:
   pt_msix_init: Error: Can't map physical MSI-X table: Invalid argument

Signed-off-by: Bruce Edge <bruce.edge@gmail.com>
hw/pass-through.h
hw/pt-msi.c

index 028a03edb93570e2669f3fe890fceef81c621c60..324df5b9b44e567d2b65c7c462041ba43a2012a3 100644 (file)
@@ -193,6 +193,7 @@ struct pt_msix_info {
     int mmio_index;
     void *phys_iomem_base;
     struct msix_entry_info msix_entry[0];
+    uint32_t table_offset_adjust;      /* page align mmap */
 };
 
 struct pt_pm_info {
index 6f923d0819c92d69dded856ea5b9a230ce1b832d..cd0783cd41c03ecee2dacdd1e2560bfd344e0816 100644 (file)
@@ -542,6 +542,7 @@ int pt_msix_init(struct pt_dev *dev, int pos)
     int i, total_entries, table_off, bar_index;
     struct pci_dev *pd = dev->pci_dev;
     int fd;
+    int err;
 
     id = pci_read_byte(pd, pos + PCI_CAP_LIST_ID);
 
@@ -584,9 +585,15 @@ int pt_msix_init(struct pt_dev *dev, int pos)
         PT_LOG("Error: Can't open /dev/mem: %s\n", strerror(errno));
         goto error_out;
     }
-    dev->msix->phys_iomem_base = mmap(0, total_entries * 16,
+    PT_LOG("table_off = %llx, total_entries = %d\n",table_off,total_entries);
+    dev->msix->table_offset_adjust = table_off & 0x0fff;
+    dev->msix->phys_iomem_base = mmap(0, total_entries * 16 + dev->msix->table_offset_adjust,
                           PROT_WRITE | PROT_READ, MAP_SHARED | MAP_LOCKED,
-                          fd, dev->msix->table_base + table_off);
+                          fd, dev->msix->table_base + table_off - dev->msix->table_offset_adjust);
+    dev->msix->phys_iomem_base = (void *)((char *)dev->msix->phys_iomem_base + 
+                          dev->msix->table_offset_adjust);
+    err = errno;
+    PT_LOG("errno = %d\n",err);
     if ( dev->msix->phys_iomem_base == MAP_FAILED )
     {
         PT_LOG("Error: Can't map physical MSI-X table: %s\n", strerror(errno));
@@ -612,7 +619,8 @@ void pt_msix_delete(struct pt_dev *dev)
     {
         PT_LOG("unmapping physical MSI-X table from %lx\n",
            (unsigned long)dev->msix->phys_iomem_base);
-        munmap(dev->msix->phys_iomem_base, dev->msix->total_entries * 16);
+        munmap(dev->msix->phys_iomem_base, dev->msix->total_entries * 16 + 
+           dev->msix->table_offset_adjust);
     }
 
     free(dev->msix);