On Mon, Nov 11, 2024 at 01:09:20PM +0000, Robin Murphy wrote: > On 2024-11-09 5:48 am, Nicolin Chen wrote: > > To solve this problem the VMM should capture the MSI IOVA allocated by the > > guest kernel and relay it to the GIC driver in the host kernel, to program > > the correct MSI IOVA. And this requires a new ioctl via VFIO. > > Once VFIO has that information from userspace, though, do we really need > the whole complicated dance to push it right down into the irqchip layer > just so it can be passed back up again? AFAICS > vfio_msi_set_vector_signal() via VFIO_DEVICE_SET_IRQS already explicitly > rewrites MSI-X vectors, so it seems like it should be pretty > straightforward to override the message address in general at that > level, without the lower layers having to be aware at all, no? Didn't see that clearly!! It works with a simple following override: -------------------------------------------------------------------- @@ -497,6 +497,10 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_core_device *vdev, struct msi_msg msg; get_cached_msi_msg(irq, &msg); + if (vdev->msi_iovas) { + msg.address_lo = lower_32_bits(vdev->msi_iovas[vector]); + msg.address_hi = upper_32_bits(vdev->msi_iovas[vector]); + } pci_write_msi_msg(irq, &msg); } -------------------------------------------------------------------- With that, I think we only need one VFIO change for this part :) Thanks! Nicolin