[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] ioemu: fix pt_chk_bar_overlap



This patch fixes pt_chk_bar_overlap.

Current pt_chk_bar_overlap does not distinguish memory resources and
io resources. They are placed in different address space. So
pt_chk_bar_overlap should distinguish them.

Thanks,
--
Yuji Shimada


Signed-off-by: Yuji Shimada <shimada-yxb@xxxxxxxxxxxxxxx>

diff --git a/hw/pass-through.c b/hw/pass-through.c
index 487b08d..ee52960 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -1753,7 +1753,8 @@ static void pt_bar_mapping(struct pt_dev *ptdev, int 
io_enable, int mem_enable)
         PT_GET_EMUL_SIZE(base->bar_flag, r_size);
 
         /* check overlapped address */
-        ret = pt_chk_bar_overlap(dev->bus, dev->devfn, r_addr, r_size);
+        ret = pt_chk_bar_overlap(dev->bus, dev->devfn,
+                        r_addr, r_size, r->type);
         if (ret > 0)
             PT_LOG("Warning: ptdev[%02x:%02x.%x][Region:%d][Address:%08xh]"
                 "[Size:%08xh] is overlapped.\n", pci_bus_num(dev->bus),
diff --git a/hw/pci.c b/hw/pci.c
index e72c669..df75ef5 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -739,7 +739,8 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint32_t id,
     return s->bus;
 }
 
-int pt_chk_bar_overlap(PCIBus *bus, int devfn, uint32_t addr, uint32_t size)
+int pt_chk_bar_overlap(PCIBus *bus, int devfn, uint32_t addr,
+                        uint32_t size, uint8_t type)
 {
     PCIDevice *devices = NULL;
     PCIIORegion *r;
@@ -759,6 +760,17 @@ int pt_chk_bar_overlap(PCIBus *bus, int devfn, uint32_t 
addr, uint32_t size)
         for (j=0; j<PCI_NUM_REGIONS; j++)
         {
             r = &devices->io_regions[j];
+
+            /* skip different resource type, but don't skip when
+             * prefetch and non-prefetch memory are compared.
+             */
+            if (type != r->type)
+            {
+                if (type == PCI_ADDRESS_SPACE_IO ||
+                    r->type == PCI_ADDRESS_SPACE_IO)
+                    continue;
+            }
+
             if ((addr < (r->addr + r->size)) && ((addr + size) > r->addr))
             {
                 printf("Overlapped to device[%02x:%02x.%x][Region:%d]"
diff --git a/hw/pci.h b/hw/pci.h
index 2800499..e7fcf97 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -77,7 +77,8 @@ void pci_register_io_region(PCIDevice *pci_dev, int 
region_num,
                             uint32_t size, int type,
                             PCIMapIORegionFunc *map_func);
 
-int pt_chk_bar_overlap(PCIBus *bus, int devfn, uint32_t addr, uint32_t size);
+int pt_chk_bar_overlap(PCIBus *bus, int devfn, uint32_t addr,
+                       uint32_t size, uint8_t type);
 
 uint32_t pci_default_read_config(PCIDevice *d,
                                  uint32_t address, int len);


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.