This matches sysbus_pass_irq in cases where a device is a thin wrapper of another. MMIO regions will keep the subdevice as the owner.
Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- hw/core/sysbus.c | 12 ++++++++++++ hw/cpu/arm11mpcore.c | 2 +- include/hw/sysbus.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c index 9004d8c..6dbd1f8 100644 --- a/hw/core/sysbus.c +++ b/hw/core/sysbus.c @@ -117,6 +117,18 @@ void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory) dev->mmio[n].memory = memory; } +/* Pass MMIOs from a target device. */ +void sysbus_pass_mmio(SysBusDevice *dev, SysBusDevice *target) +{ + int i; + assert(dev->num_mmio == 0); + dev->num_mmio = target->num_mmio; + for (i = 0; i < dev->num_mmio; i++) { + assert(target->mmio[i].addr == -1); + dev->mmio[i] = target->mmio[i]; + } +} + MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n) { return dev->mmio[n].memory; diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c index 90dcead..cc885d1 100644 --- a/hw/cpu/arm11mpcore.c +++ b/hw/cpu/arm11mpcore.c @@ -213,7 +213,7 @@ static int realview_mpcore_init(SysBusDevice *dev) } } qdev_init_gpio_in(&dev->qdev, mpcore_rirq_set_irq, 64); - sysbus_init_mmio(dev, sysbus_mmio_get_region(s->priv, 0)); + sysbus_pass_mmio(dev, s->priv); return 0; } diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h index 7c2e316..0639343 100644 --- a/include/hw/sysbus.h +++ b/include/hw/sysbus.h @@ -48,6 +48,7 @@ struct SysBusDevice { void *sysbus_new(void); void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory); +void sysbus_pass_mmio(SysBusDevice *dev, SysBusDevice *target); MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n); void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p); void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target); -- 1.8.1.4