From 8a62bb04e27fe1e3e59d6551df5452c4e27683bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Date: Wed, 22 Oct 2025 13:44:01 +0200 Subject: [PATCH] xen/vpci: fix backport of 53859596c0d3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 53859596c0d3 depends on the behavioral change introduced in ee2eb6849d50 that inverted the initialization of the MSI-X and header vPCI handlers. 53859596c0d3 requires the header to be initialized before MSI-X. Change the order of initialization and adjust init_msix() to carve holes for the MSI-X tables if necessary, since it will now run after the BARs have been possibly mapped into the domain p2m. Fixes: 50b649c74272 ("vpci/msix: improve handling of bogus MSI-X capabilities") Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich --- xen/drivers/vpci/header.c | 2 +- xen/drivers/vpci/msix.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 1f48f2aac6..b002eb2072 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -1016,7 +1016,7 @@ static int cf_check init_header(struct pci_dev *pdev) pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); return rc; } -REGISTER_VPCI_INIT(init_header, VPCI_PRIORITY_MIDDLE); +REGISTER_VPCI_INIT(init_header, VPCI_PRIORITY_HIGH); /* * Local variables: diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 7d6e691b36..140f5ab284 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -790,9 +790,14 @@ static int cf_check init_msix(struct pci_dev *pdev) pdev->vpci->msix = msix; list_add(&msix->next, &d->arch.hvm.msix_tables); - return 0; + /* + * vPCI header initialization will have mapped the whole BAR into the + * p2m, as MSI-X capability was not yet initialized. Crave a hole for + * the MSI-X table here, so that Xen can trap accesses. + */ + return vpci_make_msix_hole(pdev); } -REGISTER_VPCI_INIT(init_msix, VPCI_PRIORITY_HIGH); +REGISTER_VPCI_INIT(init_msix, VPCI_PRIORITY_MIDDLE); /* * Local variables: