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
> 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.
>  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;