From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH v4 RFC 6/6] x86/MSI: properly track guest masking requests Date: Wed, 24 Jun 2015 18:24:45 +0100 Message-ID: <558AE7DD.6090908@citrix.com> References: <558839ED02000078000879FE@mail.emea.novell.com> <55883D290200007800087A67@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0643979203006864556==" Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Z7oQC-0006kC-Ou for xen-devel@lists.xenproject.org; Wed, 24 Jun 2015 17:25:12 +0000 In-Reply-To: <55883D290200007800087A67@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich , xen-devel Cc: Keir Fraser List-Id: xen-devel@lists.xenproject.org --===============0643979203006864556== Content-Type: multipart/alternative; boundary="------------030808070808050100030207" --------------030808070808050100030207 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit On 22/06/15 15:51, Jan Beulich wrote: > ... 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 > > --- a/xen/arch/x86/msi.c > +++ b/xen/arch/x86/msi.c > @@ -1308,6 +1308,39 @@ printk("%04x:%02x:%02x.%u: MSI-X %03x:%u > 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; > +printk("%04x:%02x:%02x.%u: MSI %03x:%u->%04x\n", seg, bus, slot, func, reg, size, *data);//temp > + > + 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; Can we avoid using EACCES to avoid confusing it with a mismatched tools version? ~Andrew > + > + 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); > + } > +printk("%04x:%02x:%02x.%u: MSI -> %08x (%08x)\n", seg, bus, slot, func, *data, unused);//temp > + > + *data |= unused; > + > + return 1; > + } > + > return 0; > } > > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel --------------030808070808050100030207 Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: 7bit
On 22/06/15 15:51, Jan Beulich wrote:
... 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 <jbeulich@suse.com>

--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -1308,6 +1308,39 @@ printk("%04x:%02x:%02x.%u: MSI-X %03x:%u
         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;
+printk("%04x:%02x:%02x.%u: MSI %03x:%u->%04x\n", seg, bus, slot, func, reg, size, *data);//temp
+
+        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;

Can we avoid using EACCES to avoid confusing it with a mismatched tools version?

~Andrew

+
+        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);
+        }
+printk("%04x:%02x:%02x.%u: MSI -> %08x (%08x)\n", seg, bus, slot, func, *data, unused);//temp
+
+        *data |= unused;
+
+        return 1;
+    }
+
     return 0;
 }
 





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

--------------030808070808050100030207-- --===============0643979203006864556== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --===============0643979203006864556==--