[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V7 06/11] pci.c: Add pci_check_bar_overlap
From: |
Anthony PERARD |
Subject: |
[Qemu-devel] [PATCH V7 06/11] pci.c: Add pci_check_bar_overlap |
Date: |
Fri, 17 Feb 2012 17:08:40 +0000 |
From: Yuji Shimada <address@hidden>
This function helps Xen PCI Passthrough device to check for overlap.
Signed-off-by: Yuji Shimada <address@hidden>
Signed-off-by: Anthony PERARD <address@hidden>
---
hw/pci.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
hw/pci.h | 3 +++
2 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/hw/pci.c b/hw/pci.c
index 678a8c1..75d6529 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1985,6 +1985,53 @@ MemoryRegion *pci_address_space_io(PCIDevice *dev)
return dev->bus->address_space_io;
}
+int pci_check_bar_overlap(PCIDevice *dev,
+ pcibus_t addr, pcibus_t size, uint8_t type)
+{
+ PCIBus *bus = dev->bus;
+ PCIDevice *devices = NULL;
+ PCIIORegion *r;
+ int i, j;
+ int rc = 0;
+
+ /* check Overlapped to Base Address */
+ for (i = 0; i < ARRAY_SIZE(bus->devices); i++) {
+ devices = bus->devices[i];
+ if (!devices) {
+ continue;
+ }
+
+ /* skip itself */
+ if (devices->devfn == dev->devfn) {
+ continue;
+ }
+
+ 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_BASE_ADDRESS_SPACE_IO ||
+ r->type & PCI_BASE_ADDRESS_SPACE_IO) {
+ continue;
+ }
+ }
+
+ if ((addr < (r->addr + r->size)) && ((addr + size) > r->addr)) {
+ printf("Overlapped to device[%02x:%02x.%x][Region:%d]"
+ "[Address:%"PRIx64"h][Size:%"PRIx64"h]\n",
+ pci_bus_num(bus), PCI_SLOT(devices->devfn),
+ PCI_FUNC(devices->devfn), j, r->addr, r->size);
+ rc = 1;
+ }
+ }
+ }
+
+ return rc;
+}
+
static void pci_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *k = DEVICE_CLASS(klass);
diff --git a/hw/pci.h b/hw/pci.h
index 33b0b18..f05fda5 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -566,4 +566,7 @@ extern const VMStateDescription vmstate_pci_device;
.offset = vmstate_offset_pointer(_state, _field, PCIDevice), \
}
+int pci_check_bar_overlap(PCIDevice *dev,
+ pcibus_t addr, pcibus_t size, uint8_t type);
+
#endif
--
Anthony PERARD
- Re: [Qemu-devel] [PATCH V7 03/11] pci_regs: Add PCI_EXP_TYPE_PCIE_BRIDGE, (continued)
- [Qemu-devel] [PATCH V7 09/11] Introduce apic-msidef.h, Anthony PERARD, 2012/02/17
- [Qemu-devel] [PATCH V7 05/11] Introduce HostPCIDevice to access a pci device on the host., Anthony PERARD, 2012/02/17
- [Qemu-devel] [PATCH V7 01/11] pci_ids: Add INTEL_82599_VF id., Anthony PERARD, 2012/02/17
- [Qemu-devel] [PATCH V7 04/11] configure: Introduce --enable-xen-pci-passthrough., Anthony PERARD, 2012/02/17
- [Qemu-devel] [PATCH V7 07/11] Introduce Xen PCI Passthrough, qdevice (1/3), Anthony PERARD, 2012/02/17
- [Qemu-devel] [PATCH V7 08/11] Introduce Xen PCI Passthrough, PCI config space helpers (2/3), Anthony PERARD, 2012/02/17
- [Qemu-devel] [PATCH V7 06/11] pci.c: Add pci_check_bar_overlap,
Anthony PERARD <=
- [Qemu-devel] [PATCH V7 11/11] xen passthrough: clean up MSI-X table handling, Anthony PERARD, 2012/02/17
- [Qemu-devel] [PATCH V7 10/11] Introduce Xen PCI Passthrough, MSI (3/3), Anthony PERARD, 2012/02/17
- Re: [Qemu-devel] [Xen-devel] [PATCH V7 00/11] Xen PCI Passthrough, Tobias Geiger, 2012/02/20