diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index ddcfc6c229..a2ac82c95c 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -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); diff --git a/xen/include/asm-x86/msi.h b/xen/include/asm-x86/msi.h index 18cf2de61e..e228b0f3f3 100644 --- a/xen/include/asm-x86/msi.h +++ b/xen/include/asm-x86/msi.h @@ -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