On Tue, Oct 21, 2025 at 08:17:37PM +0200, Philippe Mathieu-Daudé wrote:
> On 17/10/25 17:51, Roger Pau Monne wrote:
> > It's currently impossible for passthrough devices on segment different than
> > 0 to work correctly, as the PCI domain is not provided to
> > xc_physdev_map_pirq_msi(), and hence it's unconditionally assumed that all
> > devices are on segment 0.
> > 
> > Adjust the call to xc_physdev_map_pirq_msi() to pass the PCI domain in the
> > high 16bits of the bus parameter.  On versions of Xen where this is not
> > supported the passed segment will be ignored and assume to be 0, no worse
> > than the current state.
> > 
> > Signed-off-by: Roger Pau Monné <[email protected]>
> > ---
> > Cc: Stefano Stabellini <[email protected]>
> > Cc: Anthony PERARD <[email protected]>
> > Cc: Paul Durrant <[email protected]>
> > Cc: "Edgar E. Iglesias" <[email protected]>
> > Cc: [email protected]
> > ---
> >   hw/xen/xen_pt_msi.c | 1 +
> >   1 file changed, 1 insertion(+)
> > 
> > diff --git a/hw/xen/xen_pt_msi.c b/hw/xen/xen_pt_msi.c
> > index e9ba17317aba..df15ccf0d030 100644
> > --- a/hw/xen/xen_pt_msi.c
> > +++ b/hw/xen/xen_pt_msi.c
> > @@ -138,6 +138,7 @@ static int msi_msix_setup(XenPCIPassthroughState *s,
> >           rc = xc_physdev_map_pirq_msi(xen_xc, xen_domid, 
> > XEN_PT_AUTO_ASSIGN,
> >                                        ppirq, PCI_DEVFN(s->real_device.dev,
> >                                                         
> > s->real_device.func),
> > +                                     ((uint32_t)s->real_device.domain << 
> > 16) |
> >                                        s->real_device.bus,
> 
> Alternatively:
> 
>   deposit32(s->real_device.bus, 16, 16, s->real_device.domain)

Oh, I have to admit I'm not that well versed in QEMU, so didn't even
knew this existed.

Thanks for picking it up.

Reply via email to