From: Jan Beulich Date: Thu, 23 Jul 2015 08:16:27 +0000 (+0200) Subject: x86/MSI: properly track guest masking requests X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2723 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=aa7c1fdf9dd04a1287f4770906b2c41b88a28228;p=xen.git x86/MSI: properly track guest masking requests ... by monitoring writes to the mask register. This allows reverting the main effect of the XSA-129 patches in qemu. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index 3c8354de54..fa95048a45 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -1303,6 +1303,37 @@ int pci_msi_conf_write_intercept(struct pci_dev *pdev, unsigned int reg, return 1; } + entry = find_msi_entry(pdev, -1, PCI_CAP_ID_MSI); + if ( entry && entry->msi_attrib.maskbit ) + { + uint16_t cntl; + uint32_t unused; + + pos = entry->msi_attrib.pos; + if ( reg < pos || reg >= entry->msi.mpos + 8 ) + return 0; + + if ( reg == msi_control_reg(pos) ) + return size == 2 ? 1 : -EACCES; + if ( reg < entry->msi.mpos || reg >= entry->msi.mpos + 4 || size != 4 ) + return -EACCES; + + cntl = pci_conf_read16(seg, bus, slot, func, msi_control_reg(pos)); + unused = ~(uint32_t)0 >> (32 - multi_msi_capable(cntl)); + for ( pos = 0; pos < entry->msi.nvec; ++pos, ++entry ) + { + entry->msi_attrib.guest_masked = + *data >> entry->msi_attrib.entry_nr; + if ( entry->msi_attrib.host_masked ) + *data |= 1 << pos; + unused &= ~(1 << pos); + } + + *data |= unused; + + return 1; + } + return 0; }