Blame SOURCES/kvm-ide-Clear-DRQ-after-handling-all-expected-accesses.patch

05bba0
From c887704e6425ee43d8b65e34dc0f57a4878231cf Mon Sep 17 00:00:00 2001
a13b82
From: Kevin Wolf <kwolf@redhat.com>
a13b82
Date: Thu, 16 Jul 2015 16:16:00 +0200
a13b82
Subject: [PATCH 3/3] ide: Clear DRQ after handling all expected accesses
a13b82
a13b82
Message-id: <1437056160-3284-4-git-send-email-kwolf@redhat.com>
a13b82
Patchwork-id: n/a
a13b82
O-Subject: [virt-devel] [RHEL/RHEV-7 qemu-kvm(-rhev) EMBARGOED PATCH 3/3] ide:
a13b82
        Clear DRQ after handling all expected accesses
05bba0
Bugzilla: 1243690
a13b82
RH-Acked-by: Petr Matousek <pmatouse@redhat.com>
a13b82
RH-Acked-by: John Snow <jsnow@redhat.com>
a13b82
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
a13b82
a13b82
This is additional hardening against an end_transfer_func that fails to
a13b82
clear the DRQ status bit. The bit must be unset as soon as the PIO
a13b82
transfer has completed, so it's better to do this in a central place
a13b82
instead of duplicating the code in all commands (and forgetting it in
a13b82
some).
a13b82
a13b82
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
a13b82
---
a13b82
 hw/ide/core.c | 16 ++++++++++++----
a13b82
 1 file changed, 12 insertions(+), 4 deletions(-)
a13b82
a13b82
diff --git a/hw/ide/core.c b/hw/ide/core.c
05bba0
index 29bda6b..5d40093 100644
a13b82
--- a/hw/ide/core.c
a13b82
+++ b/hw/ide/core.c
05bba0
@@ -1857,8 +1857,10 @@ void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
a13b82
     *(uint16_t *)p = le16_to_cpu(val);
a13b82
     p += 2;
a13b82
     s->data_ptr = p;
a13b82
-    if (p >= s->data_end)
a13b82
+    if (p >= s->data_end) {
a13b82
+        s->status &= ~DRQ_STAT;
a13b82
         s->end_transfer_func(s);
a13b82
+    }
a13b82
 }
a13b82
 
a13b82
 uint32_t ide_data_readw(void *opaque, uint32_t addr)
05bba0
@@ -1882,8 +1884,10 @@ uint32_t ide_data_readw(void *opaque, uint32_t addr)
a13b82
     ret = cpu_to_le16(*(uint16_t *)p);
a13b82
     p += 2;
a13b82
     s->data_ptr = p;
a13b82
-    if (p >= s->data_end)
a13b82
+    if (p >= s->data_end) {
a13b82
+        s->status &= ~DRQ_STAT;
a13b82
         s->end_transfer_func(s);
a13b82
+    }
a13b82
     return ret;
a13b82
 }
a13b82
 
05bba0
@@ -1907,8 +1911,10 @@ void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
a13b82
     *(uint32_t *)p = le32_to_cpu(val);
a13b82
     p += 4;
a13b82
     s->data_ptr = p;
a13b82
-    if (p >= s->data_end)
a13b82
+    if (p >= s->data_end) {
a13b82
+        s->status &= ~DRQ_STAT;
a13b82
         s->end_transfer_func(s);
a13b82
+    }
a13b82
 }
a13b82
 
a13b82
 uint32_t ide_data_readl(void *opaque, uint32_t addr)
05bba0
@@ -1932,8 +1938,10 @@ uint32_t ide_data_readl(void *opaque, uint32_t addr)
a13b82
     ret = cpu_to_le32(*(uint32_t *)p);
a13b82
     p += 4;
a13b82
     s->data_ptr = p;
a13b82
-    if (p >= s->data_end)
a13b82
+    if (p >= s->data_end) {
a13b82
+        s->status &= ~DRQ_STAT;
a13b82
         s->end_transfer_func(s);
a13b82
+    }
a13b82
     return ret;
a13b82
 }
a13b82
 
a13b82
-- 
a13b82
1.8.3.1
a13b82