Pablo Greco e6a3ae
From 94edd1b203f3a88065ce05d9e027b24a3e8eed2f Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Peter Xu <peterx@redhat.com>
Pablo Greco e6a3ae
Date: Tue, 2 Apr 2019 07:25:28 +0100
Pablo Greco e6a3ae
Subject: [PATCH 4/7] intel_iommu: fix operator in vtd_switch_address_space
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Peter Xu <peterx@redhat.com>
Pablo Greco e6a3ae
Message-id: <20190402072531.23771-2-peterx@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 85298
Pablo Greco e6a3ae
O-Subject: [RHEL-8.1 qemu-kvm PATCH 1/4] intel_iommu: fix operator in vtd_switch_address_space
Pablo Greco e6a3ae
Bugzilla: 1662272
Pablo Greco e6a3ae
RH-Acked-by: Wei Huang <wei@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
When calculating use_iommu, we wanted to first detect whether DMAR is
Pablo Greco e6a3ae
enabled, then check whether PT is enabled if DMAR is enabled.  However
Pablo Greco e6a3ae
in the current code we used "&" rather than "&&" so the ordering
Pablo Greco e6a3ae
requirement is lost (instead it'll be an "AND" operation).  This could
Pablo Greco e6a3ae
introduce errors dumped in QEMU console when rebooting a guest with
Pablo Greco e6a3ae
both assigned device and vIOMMU, like:
Pablo Greco e6a3ae
Pablo Greco e6a3ae
  qemu-system-x86_64: vtd_dev_to_context_entry: invalid root entry:
Pablo Greco e6a3ae
  rsvd=0xf000ff53f000e2c3, val=0xf000ff53f000ff53 (reserved nonzero)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Acked-by: Jason Wang <jasowang@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Peter Xu <peterx@redhat.com>
Pablo Greco e6a3ae
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit 2a078b1080917dc6143783e1dd645e188d11dc8f)
Pablo Greco e6a3ae
Signed-off-by: Peter Xu <peterx@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 hw/i386/intel_iommu.c | 2 +-
Pablo Greco e6a3ae
 1 file changed, 1 insertion(+), 1 deletion(-)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
Pablo Greco e6a3ae
index 12af410..7170266 100644
Pablo Greco e6a3ae
--- a/hw/i386/intel_iommu.c
Pablo Greco e6a3ae
+++ b/hw/i386/intel_iommu.c
Pablo Greco e6a3ae
@@ -1145,7 +1145,7 @@ static bool vtd_switch_address_space(VTDAddressSpace *as)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     assert(as);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-    use_iommu = as->iommu_state->dmar_enabled & !vtd_dev_pt_enabled(as);
Pablo Greco e6a3ae
+    use_iommu = as->iommu_state->dmar_enabled && !vtd_dev_pt_enabled(as);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     trace_vtd_switch_address_space(pci_bus_num(as->bus),
Pablo Greco e6a3ae
                                    VTD_PCI_SLOT(as->devfn),
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae