yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
a83cc2
From 9a12329325d94ab56dbab976b4423fe7db0e8d0b Mon Sep 17 00:00:00 2001
a83cc2
From: Eric Farman <farman@linux.ibm.com>
a83cc2
Date: Thu, 24 Jun 2021 14:15:13 -0400
a83cc2
Subject: [PATCH 01/43] s390x/css: Introduce an ESW struct
a83cc2
a83cc2
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
RH-Bugzilla: 1957194
a83cc2
a83cc2
The Interrupt Response Block is comprised of several other
a83cc2
structures concatenated together, but only the 12-byte
a83cc2
Subchannel-Status Word (SCSW) is defined as a proper struct.
a83cc2
Everything else is a simple array of 32-bit words.
a83cc2
a83cc2
Let's define a proper struct for the 20-byte Extended-Status
a83cc2
Word (ESW) so that we can make good decisions about the sense
a83cc2
data that would go into the ECW area for virtual vs
a83cc2
passthrough devices.
a83cc2
a83cc2
[CH: adapted ESW definition to build with mingw, as discussed]
a83cc2
Signed-off-by: Eric Farman <farman@linux.ibm.com>
a83cc2
Message-Id: <20210617232537.1337506-2-farman@linux.ibm.com>
a83cc2
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
a83cc2
(cherry picked from commit 3fdc622ad79636f3d7f8bed50a53bc28af1850e1)
a83cc2
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
a83cc2
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
---
a83cc2
 hw/s390x/css.c            | 19 +++++++++++++------
a83cc2
 include/hw/s390x/ioinst.h | 12 +++++++++++-
a83cc2
 2 files changed, 24 insertions(+), 7 deletions(-)
a83cc2
a83cc2
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
a83cc2
index 4149b8e5a7..bd3172a688 100644
a83cc2
--- a/hw/s390x/css.c
a83cc2
+++ b/hw/s390x/css.c
a83cc2
@@ -1336,6 +1336,14 @@ static void copy_schib_to_guest(SCHIB *dest, const SCHIB *src)
a83cc2
     }
a83cc2
 }
a83cc2
 
a83cc2
+static void copy_esw_to_guest(ESW *dest, const ESW *src)
a83cc2
+{
a83cc2
+    dest->word0 = cpu_to_be32(src->word0);
a83cc2
+    dest->erw = cpu_to_be32(src->erw);
a83cc2
+    dest->word2 = cpu_to_be64(src->word2);
a83cc2
+    dest->word4 = cpu_to_be32(src->word4);
a83cc2
+}
a83cc2
+
a83cc2
 IOInstEnding css_do_stsch(SubchDev *sch, SCHIB *schib)
a83cc2
 {
a83cc2
     int ret;
a83cc2
@@ -1605,9 +1613,8 @@ static void copy_irb_to_guest(IRB *dest, const IRB *src, const PMCW *pmcw,
a83cc2
 
a83cc2
     copy_scsw_to_guest(&dest->scsw, &src->scsw);
a83cc2
 
a83cc2
-    for (i = 0; i < ARRAY_SIZE(dest->esw); i++) {
a83cc2
-        dest->esw[i] = cpu_to_be32(src->esw[i]);
a83cc2
-    }
a83cc2
+    copy_esw_to_guest(&dest->esw, &src->esw);
a83cc2
+
a83cc2
     for (i = 0; i < ARRAY_SIZE(dest->ecw); i++) {
a83cc2
         dest->ecw[i] = cpu_to_be32(src->ecw[i]);
a83cc2
     }
a83cc2
@@ -1656,9 +1663,9 @@ int css_do_tsch_get_irb(SubchDev *sch, IRB *target_irb, int *irb_len)
a83cc2
                         SCSW_CSTAT_CHN_CTRL_CHK |
a83cc2
                         SCSW_CSTAT_INTF_CTRL_CHK)) {
a83cc2
             irb.scsw.flags |= SCSW_FLAGS_MASK_ESWF;
a83cc2
-            irb.esw[0] = 0x04804000;
a83cc2
+            irb.esw.word0 = 0x04804000;
a83cc2
         } else {
a83cc2
-            irb.esw[0] = 0x00800000;
a83cc2
+            irb.esw.word0 = 0x00800000;
a83cc2
         }
a83cc2
         /* If a unit check is pending, copy sense data. */
a83cc2
         if ((schib->scsw.dstat & SCSW_DSTAT_UNIT_CHECK) &&
a83cc2
@@ -1671,7 +1678,7 @@ int css_do_tsch_get_irb(SubchDev *sch, IRB *target_irb, int *irb_len)
a83cc2
             for (i = 0; i < ARRAY_SIZE(irb.ecw); i++) {
a83cc2
                 irb.ecw[i] = be32_to_cpu(irb.ecw[i]);
a83cc2
             }
a83cc2
-            irb.esw[1] = 0x01000000 | (sizeof(sch->sense_data) << 8);
a83cc2
+            irb.esw.erw = ESW_ERW_SENSE | (sizeof(sch->sense_data) << 8);
a83cc2
         }
a83cc2
     }
a83cc2
     /* Store the irb to the guest. */
a83cc2
diff --git a/include/hw/s390x/ioinst.h b/include/hw/s390x/ioinst.h
a83cc2
index c6737a30d4..3771fff9d4 100644
a83cc2
--- a/include/hw/s390x/ioinst.h
a83cc2
+++ b/include/hw/s390x/ioinst.h
a83cc2
@@ -123,10 +123,20 @@ typedef struct SCHIB {
a83cc2
     uint8_t mda[4];
a83cc2
 } QEMU_PACKED SCHIB;
a83cc2
 
a83cc2
+/* format-0 extended-status word */
a83cc2
+typedef struct ESW {
a83cc2
+    uint32_t word0;      /* subchannel logout for format 0 */
a83cc2
+    uint32_t erw;
a83cc2
+    uint64_t word2;     /* failing-storage address for format 0 */
a83cc2
+    uint32_t word4;     /* secondary-CCW address for format 0 */
a83cc2
+} QEMU_PACKED ESW;
a83cc2
+
a83cc2
+#define ESW_ERW_SENSE 0x01000000
a83cc2
+
a83cc2
 /* interruption response block */
a83cc2
 typedef struct IRB {
a83cc2
     SCSW scsw;
a83cc2
-    uint32_t esw[5];
a83cc2
+    ESW esw;
a83cc2
     uint32_t ecw[8];
a83cc2
     uint32_t emw[8];
a83cc2
 } IRB;
a83cc2
-- 
a83cc2
2.27.0
a83cc2