+harsh
On Wed, 2025-07-16 at 12:24 -0500, Miles Glenn wrote:
> +qemu-...@nongnu.org
>
> On Wed, 2025-07-16 at 11:50 -0500, Glenn Miles wrote:
> > The PowerNV PCI Host Bridge (PHB) supports a large and small
> > configuration where the small configuration supports only
> > half the number of interrupts supported by the large configuration.
> >
> > Since the PCIe LSIs are allocated at the end of the PHB IRQ list,
> > when calculating the LSI IRQ number, the code must take into
> > consideration the number of IRQ's supported by the PHB. This
> > was not happening and was resulting in a QEMU segmentation fault
> > when a PCI device was added to a PHB with the small configuration.
> >
> > Signed-off-by: Glenn Miles <mil...@linux.ibm.com>
> > ---
> > hw/pci-host/pnv_phb4.c | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
> > index 18992054e8..aeb2a45b4b 100644
> > --- a/hw/pci-host/pnv_phb4.c
> > +++ b/hw/pci-host/pnv_phb4.c
> > @@ -1167,6 +1167,7 @@ static int pnv_phb4_map_irq(PCIDevice *pci_dev, int
> > irq_num)
> > static void pnv_phb4_set_irq(void *opaque, int irq_num, int level)
> > {
> > PnvPHB4 *phb = PNV_PHB4(opaque);
> > + XiveSource *xsrc = &phb->xsrc;
> > uint32_t lsi_base;
> >
> > /* LSI only ... */
> > @@ -1175,6 +1176,7 @@ static void pnv_phb4_set_irq(void *opaque, int
> > irq_num, int level)
> > }
> > lsi_base = GETFIELD(PHB_LSI_SRC_ID, phb->regs[PHB_LSI_SOURCE_ID >> 3]);
> > lsi_base <<= 3;
> > + lsi_base &= xsrc->nr_irqs - 1;
> > qemu_set_irq(phb->qirqs[lsi_base + irq_num], level);
> > }
> >