hw/xen/xen_pt_msi.c | 1 + 1 file changed, 1 insertion(+)
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é <roger.pau@citrix.com>
---
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Anthony PERARD <anthony@xenproject.org>
Cc: Paul Durrant <paul@xen.org>
Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
Cc: xen-devel@lists.xenproject.org
---
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,
msix_entry, table_base);
if (rc) {
--
2.51.0
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é <roger.pau@citrix.com>
> ---
> Cc: Stefano Stabellini <sstabellini@kernel.org>
> Cc: Anthony PERARD <anthony@xenproject.org>
> Cc: Paul Durrant <paul@xen.org>
> Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
> Cc: xen-devel@lists.xenproject.org
> ---
> 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)
> msix_entry, table_base);
> if (rc) {
Patch queued, thanks!
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é <roger.pau@citrix.com> > > --- > > Cc: Stefano Stabellini <sstabellini@kernel.org> > > Cc: Anthony PERARD <anthony@xenproject.org> > > Cc: Paul Durrant <paul@xen.org> > > Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com> > > Cc: xen-devel@lists.xenproject.org > > --- > > 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.
On Fri, Oct 17, 2025 at 5:51 PM Roger Pau Monne <roger.pau@citrix.com> 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é <roger.pau@citrix.com> > Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
On Fri, Oct 17, 2025 at 05:51:36PM +0200, 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é <roger.pau@citrix.com> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech> Thanks, -- Anthony PERARD
On Fri, Oct 17, 2025 at 4:52 PM Roger Pau Monne <roger.pau@citrix.com> 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
typo: assumed
> than the current state.
>
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> ---
> Cc: Stefano Stabellini <sstabellini@kernel.org>
> Cc: Anthony PERARD <anthony@xenproject.org>
> Cc: Paul Durrant <paul@xen.org>
> Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
> Cc: xen-devel@lists.xenproject.org
> ---
> 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,
> msix_entry, table_base);
> if (rc) {
Reviewed-by: Frediano Ziglio <freddy77@gmail.com>
This was tested on a real machine.
Frediano
© 2016 - 2025 Red Hat, Inc.