x86/vPCI: check address in vpci_msi_update()
authorJan Beulich <jbeulich@suse.com>
Tue, 5 Jan 2021 12:18:26 +0000 (13:18 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 5 Jan 2021 12:18:26 +0000 (13:18 +0100)
If the upper address bits don't match the interrupt delivery address
space window, entirely different behavior would need to be implemented.
Refuse such requests for the time being.

Replace adjacent hard tabs while introducing MSI_ADDR_BASE_MASK.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
xen/arch/x86/hvm/vmsi.c
xen/include/asm-x86/msi.h

index ddcfc6c2290eb5e2c477552473c40121e05c981a..a2ac82c95cadcedf70397417f113ba81c4961059 100644 (file)
@@ -682,6 +682,13 @@ static int vpci_msi_update(const struct pci_dev *pdev, uint32_t data,
 
     ASSERT(pcidevs_locked());
 
+    if ( (address & MSI_ADDR_BASE_MASK) != MSI_ADDR_HEADER )
+    {
+        gdprintk(XENLOG_ERR, "%pp: PIRQ %u: unsupported address %lx\n",
+                 &pdev->sbdf, pirq, address);
+        return -EOPNOTSUPP;
+    }
+
     for ( i = 0; i < vectors; i++ )
     {
         uint8_t vector = MASK_EXTR(data, MSI_DATA_VECTOR_MASK);
index 18cf2de61e95dca81635d011e32ac14cb4c41caf..e228b0f3f344d7b4dc13517e72e7d3fd8c6ed365 100644 (file)
@@ -36,8 +36,9 @@
  * Shift/mask fields for msi address
  */
 
-#define MSI_ADDR_BASE_HI               0
-#define MSI_ADDR_BASE_LO               0xfee00000
+#define MSI_ADDR_BASE_HI            0
+#define MSI_ADDR_BASE_LO            0xfee00000
+#define MSI_ADDR_BASE_MASK          (~0xfffff)
 #define MSI_ADDR_HEADER             MSI_ADDR_BASE_LO
 
 #define MSI_ADDR_DESTMODE_SHIFT     2