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
|