On 12/10/2016 06:44, David Gibson wrote: > In pci-spapr.c (as in pci-pc.c from which it was derived), the > pci_hole_start/pci_hole_size and pci_iohole_start/pci_iohole_size pairs[1] > essentially define the region of PCI (not CPU) addresses in which MMIO > or PIO BARs respectively will be allocated. > > The size value is relative to the start value. But in pci-spapr.c it is > set to the entire size of the window supported by the (emulated) hardware, > but the start values are *not* at the beginning of the emulated windows. > > That means if you tried to map enough PCI BARs, we'd messily overrun the > IO windows, instead of failing in iomap as we should. > > This patch corrects this by calculating the hole sizes from the location > of the window in PCI space and the hole start. > > [1] Those are bad names, but that's a problem for another time. > > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
Reviewed-by: Laurent Vivier <lviv...@redhat.com> > --- > tests/libqos/pci-spapr.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/tests/libqos/pci-spapr.c b/tests/libqos/pci-spapr.c > index 1765a54..3192903 100644 > --- a/tests/libqos/pci-spapr.c > +++ b/tests/libqos/pci-spapr.c > @@ -285,11 +285,13 @@ QPCIBus *qpci_init_spapr(QGuestAllocator *alloc) > ret->mmio.size = SPAPR_PCI_MMIO_WIN_SIZE; > > ret->pci_hole_start = 0xC0000000; > - ret->pci_hole_size = SPAPR_PCI_MMIO_WIN_SIZE; > + ret->pci_hole_size = > + ret->mmio.pci_base + ret->mmio.size - ret->pci_hole_start; > ret->pci_hole_alloc = 0; > > ret->pci_iohole_start = 0xc000; > - ret->pci_iohole_size = SPAPR_PCI_IO_WIN_SIZE; > + ret->pci_iohole_size = > + ret->pio.pci_base + ret->pio.size - ret->pci_iohole_start; > ret->pci_iohole_alloc = 0; > > return &ret->bus; >