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

a13b82
From a6bc46fecbb3463447cd1e79afe60704afaa55e8 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
a13b82
Bugzilla: 1243689
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
a13b82
index ada26c0..cd2e964 100644
a13b82
--- a/hw/ide/core.c
a13b82
+++ b/hw/ide/core.c
a13b82
@@ -1856,8 +1856,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)
a13b82
@@ -1881,8 +1883,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
 
a13b82
@@ -1906,8 +1910,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)
a13b82
@@ -1931,8 +1937,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