[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V8 4/8] pci.c: Add pci_check_bar_overlap
From: |
Anthony PERARD |
Subject: |
[Qemu-devel] [PATCH V8 4/8] pci.c: Add pci_check_bar_overlap |
Date: |
Tue, 28 Feb 2012 16:14:09 +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 | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
hw/pci.h | 5 +++++
2 files changed, 55 insertions(+), 0 deletions(-)
diff --git a/hw/pci.c b/hw/pci.c
index 38e1de5..f950b4e 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1992,6 +1992,56 @@ MemoryRegion *pci_address_space_io(PCIDevice *dev)
return dev->bus->address_space_io;
}
+/* This function checks if an io_region overlap an io_region from another
+ * device. The io_region to check is provide with (addr, size and type)
+ * A callback can be provide and will be called for every region that is
+ * overlapped.
+ * The return value indicate if the region is overlappsed */
+bool pci_check_bar_overlap(PCIDevice *device,
+ pcibus_t addr, pcibus_t size, uint8_t type,
+ void (*c)(void *o, const PCIDevice *d, int index),
+ void *opaque)
+{
+ PCIBus *bus = device->bus;
+ int i, j;
+ bool rc = false;
+
+ for (i = 0; i < ARRAY_SIZE(bus->devices); i++) {
+ PCIDevice *d = bus->devices[i];
+ if (!d) {
+ continue;
+ }
+
+ if (d->devfn == device->devfn) {
+ continue;
+ }
+
+ /* xxx: This ignores bridges. */
+ for (j = 0; j < PCI_NUM_REGIONS; j++) {
+ PCIIORegion *r = &d->io_regions[j];
+
+ if (!r->size) {
+ continue;
+ }
+ if ((type & PCI_BASE_ADDRESS_SPACE_IO)
+ != (r->type & PCI_BASE_ADDRESS_SPACE_IO)) {
+ continue;
+ }
+
+ if (ranges_overlap(addr, size, r->addr, r->size)) {
+ if (c) {
+ c(opaque, d, j);
+ rc = true;
+ } else {
+ return true;
+ }
+ }
+ }
+ }
+
+ 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 4f19fdb..cbd04e1 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -628,4 +628,9 @@ extern const VMStateDescription vmstate_pci_device;
.offset = vmstate_offset_pointer(_state, _field, PCIDevice), \
}
+bool pci_check_bar_overlap(PCIDevice *dev,
+ pcibus_t addr, pcibus_t size, uint8_t type,
+ void (*c)(void *o, const PCIDevice *d, int index),
+ void *opaque);
+
#endif
--
Anthony PERARD
- [Qemu-devel] [PATCH V8 0/8] Xen PCI Passthrough, Anthony PERARD, 2012/02/28
- [Qemu-devel] [PATCH V8 4/8] pci.c: Add pci_check_bar_overlap,
Anthony PERARD <=
- [Qemu-devel] [PATCH V8 7/8] Introduce apic-msidef.h, Anthony PERARD, 2012/02/28
- [Qemu-devel] [PATCH V8 1/8] pci_ids: Add INTEL_82599_VF id., Anthony PERARD, 2012/02/28
- [Qemu-devel] [PATCH V8 2/8] configure: Introduce --enable-xen-pci-passthrough., Anthony PERARD, 2012/02/28
- [Qemu-devel] [PATCH V8 5/8] Introduce Xen PCI Passthrough, qdevice (1/3), Anthony PERARD, 2012/02/28
- [Qemu-devel] [PATCH V8 8/8] Introduce Xen PCI Passthrough, MSI (3/3), Anthony PERARD, 2012/02/28
- [Qemu-devel] [PATCH V8 6/8] Introduce Xen PCI Passthrough, PCI config space helpers (2/3), Anthony PERARD, 2012/02/28
- [Qemu-devel] [PATCH V8 3/8] Introduce HostPCIDevice to access a pci device on the host., Anthony PERARD, 2012/02/28