From: Ian Jackson Date: Tue, 24 Mar 2009 18:23:29 +0000 (+0000) Subject: passthrough: fix pt_chk_bar_overlap X-Git-Tag: xen-3.4.0-rc2~31 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=25207297b8125e5cdad1a2dd0d31a6ba77a75588;p=qemu-xen-3.4-testing.git passthrough: 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. Signed-off-by: Yuji Shimada --- diff --git a/hw/pass-through.c b/hw/pass-through.c index 00baa6c8..48e2e4b7 100644 --- a/hw/pass-through.c +++ b/hw/pass-through.c @@ -1771,7 +1771,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 fb94c03f..62298d10 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -770,7 +770,8 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, 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; @@ -790,6 +791,17 @@ int pt_chk_bar_overlap(PCIBus *bus, int devfn, uint32_t addr, uint32_t size) for (j=0; jio_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 2828b61e..a48ac309 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -210,7 +210,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);