diff mbox

[PATCHv2,2/7] libqos: Correct error in PCI hole sizing for spapr

Message ID 1476247497-6976-3-git-send-email-david@gibson.dropbear.id.au (mailing list archive)
State New, archived
Headers show

Commit Message

David Gibson Oct. 12, 2016, 4:44 a.m. UTC
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 <david@gibson.dropbear.id.au>
---
 tests/libqos/pci-spapr.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Laurent Vivier Oct. 12, 2016, 8:07 a.m. UTC | #1
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 <david@gibson.dropbear.id.au>

Reviewed-by: Laurent Vivier <lvivier@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;
>
diff mbox

Patch

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;