]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
x86/vMSI-X: add further checks to snoop logic
authorJan Beulich <jbeulich@suse.com>
Thu, 28 Apr 2016 13:10:22 +0000 (15:10 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 28 Apr 2016 13:10:22 +0000 (15:10 +0200)
msixtbl_range(), as any other MMIO ->check() handlers, may get called
with other than the base address of an access - avoid the snoop logic
considering those.

Also avoid considering vCPU-s not blocked in the hypervisor in
msixtbl_pt_register(), just to be on the safe side.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
Release-acked-by: Wei Liu <wei.liu2@citrix.com>
xen/arch/x86/hvm/vmsi.c

index 53c24e5adac059b5bceb07fa6d795e8c3e1dc5c8..d07f0c45c43cd6af2c9226ddbd1d4a6a7d944c13 100644 (file)
@@ -349,7 +349,7 @@ static int msixtbl_range(struct vcpu *v, unsigned long addr)
     {
         const ioreq_t *r = &v->arch.hvm_vcpu.hvm_io.io_req;
 
-        if ( r->state != STATE_IOREQ_READY )
+        if ( r->state != STATE_IOREQ_READY || r->addr != addr )
             return 0;
         ASSERT(r->type == IOREQ_TYPE_COPY);
         if ( r->dir == IOREQ_WRITE && r->size == 4 && !r->data_is_ptr
@@ -457,7 +457,8 @@ out:
 
         for_each_vcpu ( d, v )
         {
-            if ( v->arch.hvm_vcpu.hvm_io.msix_snoop_address ==
+            if ( (v->pause_flags & VPF_blocked_in_xen) &&
+                 v->arch.hvm_vcpu.hvm_io.msix_snoop_address ==
                  (gtable + msi_desc->msi_attrib.entry_nr *
                            PCI_MSIX_ENTRY_SIZE +
                   PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET) )