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.
Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>
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),
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;
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]"
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);