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

Reply via email to