All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Ladi Prosek <lprosek@redhat.com>, Peter Xu <peterx@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>,
	Eduardo Habkost <ehabkost@redhat.com>
Subject: [Qemu-devel] [PULL 03/21] intel_iommu: relax iq tail check on VTD_GCMD_QIE enable
Date: Mon, 3 Jul 2017 22:44:37 +0300	[thread overview]
Message-ID: <1499111049-13721-4-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1499111049-13721-1-git-send-email-mst@redhat.com>

From: Ladi Prosek <lprosek@redhat.com>

The VT-d spec (section 6.5.2) prescribes software to zero the
Invalidation Queue Tail Register before enabling the VTD_GCMD_QIE
Global Command Register bit. Windows Server 2012 R2 and possibly
other older Windows versions violate the protocol and set a
non-zero queue tail first, which in effect makes them crash early
on boot with -device intel-iommu,intremap=on.

This commit relaxes the check and instead of failing to enable
VTD_GCMD_QIE with vtd_err_qi_enable, it behaves as if the tail
register was set just after enabling VTD_GCMD_QIE
(see vtd_handle_iqt_write).

Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/intel_iommu.c | 33 +++++++++++++++++++--------------
 hw/i386/trace-events  |  2 +-
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index a9b59bd..2ddf3bd 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -1450,10 +1450,7 @@ static uint64_t vtd_iotlb_flush(IntelIOMMUState *s, uint64_t val)
     return iaig;
 }
 
-static inline bool vtd_queued_inv_enable_check(IntelIOMMUState *s)
-{
-    return s->iq_tail == 0;
-}
+static void vtd_fetch_inv_desc(IntelIOMMUState *s);
 
 static inline bool vtd_queued_inv_disable_check(IntelIOMMUState *s)
 {
@@ -1468,16 +1465,24 @@ static void vtd_handle_gcmd_qie(IntelIOMMUState *s, bool en)
     trace_vtd_inv_qi_enable(en);
 
     if (en) {
-        if (vtd_queued_inv_enable_check(s)) {
-            s->iq = iqa_val & VTD_IQA_IQA_MASK;
-            /* 2^(x+8) entries */
-            s->iq_size = 1UL << ((iqa_val & VTD_IQA_QS) + 8);
-            s->qi_enabled = true;
-            trace_vtd_inv_qi_setup(s->iq, s->iq_size);
-            /* Ok - report back to driver */
-            vtd_set_clear_mask_long(s, DMAR_GSTS_REG, 0, VTD_GSTS_QIES);
-        } else {
-            trace_vtd_err_qi_enable(s->iq_tail);
+        s->iq = iqa_val & VTD_IQA_IQA_MASK;
+        /* 2^(x+8) entries */
+        s->iq_size = 1UL << ((iqa_val & VTD_IQA_QS) + 8);
+        s->qi_enabled = true;
+        trace_vtd_inv_qi_setup(s->iq, s->iq_size);
+        /* Ok - report back to driver */
+        vtd_set_clear_mask_long(s, DMAR_GSTS_REG, 0, VTD_GSTS_QIES);
+
+        if (s->iq_tail != 0) {
+            /*
+             * This is a spec violation but Windows guests are known to set up
+             * Queued Invalidation this way so we allow the write and process
+             * Invalidation Descriptors right away.
+             */
+            trace_vtd_warn_invalid_qi_tail(s->iq_tail);
+            if (!(vtd_get_long_raw(s, DMAR_FSTS_REG) & VTD_FSTS_IQE)) {
+                vtd_fetch_inv_desc(s);
+            }
         }
     } else {
         if (vtd_queued_inv_disable_check(s)) {
diff --git a/hw/i386/trace-events b/hw/i386/trace-events
index 5f111d6..42d8a7e 100644
--- a/hw/i386/trace-events
+++ b/hw/i386/trace-events
@@ -74,7 +74,7 @@ vtd_err_dmar_slpte_read_error(uint64_t iova, int level) "iova 0x%"PRIx64" level
 vtd_err_dmar_slpte_perm_error(uint64_t iova, int level, uint64_t slpte, bool is_write) "iova 0x%"PRIx64" level %d slpte 0x%"PRIx64" write %d"
 vtd_err_dmar_slpte_resv_error(uint64_t iova, int level, uint64_t slpte) "iova 0x%"PRIx64" level %d slpte 0x%"PRIx64
 vtd_err_dmar_translate(uint8_t bus, uint8_t slot, uint8_t func, uint64_t iova) "dev %02x:%02x.%02x iova 0x%"PRIx64
-vtd_err_qi_enable(uint16_t tail) "tail 0x%"PRIx16
+vtd_warn_invalid_qi_tail(uint16_t tail) "tail 0x%"PRIx16
 vtd_err_qi_disable(uint16_t head, uint16_t tail, int type) "head 0x%"PRIx16" tail 0x%"PRIx16" last_desc_type %d"
 vtd_err_qi_tail(uint16_t tail, uint16_t size) "tail 0x%"PRIx16" size 0x%"PRIx16
 vtd_err_irte(int index, uint64_t lo, uint64_t hi) "index %d low 0x%"PRIx64" high 0x%"PRIx64
-- 
MST

  parent reply	other threads:[~2017-07-03 19:44 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-03 19:44 [Qemu-devel] [PULL 00/21] pc, acpi, pci, virtio: fixes, cleanups, features, tests Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 01/21] virtio-net: enable configurable tx queue size Michael S. Tsirkin
2017-07-04  1:44   ` Wei Wang
2017-07-13  8:01     ` Michal Privoznik
2017-07-03 19:44 ` [Qemu-devel] [PULL 02/21] hw/pci-bridge/dec: Classify the DEC PCI bridge as bridge device Michael S. Tsirkin
2017-07-03 19:44 ` Michael S. Tsirkin [this message]
2017-07-03 19:44 ` [Qemu-devel] [PULL 04/21] pci: Clean up error checking in pci_add_capability() Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 05/21] pci: Add comment for pci_add_capability2() Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 06/21] pci: Fix the wrong assertion Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 07/21] pci: Make errp the last parameter of pci_add_capability() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 08/21] pci: Replace pci_add_capability2() with pci_add_capability() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 09/21] pci: Convert to realize Michael S. Tsirkin
2017-08-25 15:17   ` Eduardo Habkost
2017-08-25 16:57     ` Michael S. Tsirkin
2017-08-25 17:49       ` Eduardo Habkost
2017-07-03 19:45 ` [Qemu-devel] [PULL 10/21] pci: Convert shpc_init() to Error Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 11/21] i386/kvm/pci-assign: Fix return type of verify_irqchip_kernel() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 12/21] i386/kvm/pci-assign: Use errp directly rather than local_err Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 13/21] fw_cfg: don't map the fw_cfg IO ports in fw_cfg_io_realize() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 14/21] fw_cfg: move setting of FW_CFG_VERSION_DMA bit to fw_cfg_init1() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 15/21] hw/acpi: remove dead acpi code Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 16/21] intel_iommu: fix migration breakage on mr switch Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 17/21] vhost: ensure vhost_ops are set before calling iotlb callback Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 18/21] vhost-user: unregister slave req handler at cleanup time Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 19/21] tests: Add unit tests for the VM Generation ID feature Michael S. Tsirkin
2017-07-11 13:32   ` Peter Maydell
2017-07-11 15:07     ` Ben Warren
2017-07-11 15:22       ` Peter Maydell
2017-07-11 16:49         ` Peter Maydell
2017-07-11 19:10           ` Michael S. Tsirkin
2017-07-11 20:42             ` Peter Maydell
2017-07-11 22:13               ` Laszlo Ersek
2017-07-11 23:43                 ` Ben Warren
2017-07-12  0:42                   ` Michael S. Tsirkin
2017-07-13 10:47                   ` Peter Maydell
2017-07-13 11:31                     ` Laszlo Ersek
2017-07-13 11:51                       ` Marc-André Lureau
2017-07-13 13:34                         ` Ben Warren
2017-07-13 16:38                           ` Michael S. Tsirkin
2017-07-14 13:11                             ` Peter Maydell
2017-07-14 15:14                               ` Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 20/21] virtio-net: fix tx queue size for !vhost-user Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 21/21] i386/acpi: update expected acpi files Michael S. Tsirkin
2017-07-04 12:05 ` [Qemu-devel] [PULL 00/21] pc, acpi, pci, virtio: fixes, cleanups, features, tests Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1499111049-13721-4-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=lprosek@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.