aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHalil Pasic <pasic@linux.vnet.ibm.com>2017-10-17 16:04:48 +0200
committerCornelia Huck <cohuck@redhat.com>2017-10-20 13:32:10 +0200
commite443ef9f21acdc6459b3fbad04019a40ea8c4e80 (patch)
treec503d0d925bc2d64f3d9157d2f2a7c63bb207d7f
parent32dc6aa061e76c9acaefff1faa48ab479672ea53 (diff)
downloadqemu-e443ef9f21acdc6459b3fbad04019a40ea8c4e80.zip
qemu-e443ef9f21acdc6459b3fbad04019a40ea8c4e80.tar.gz
qemu-e443ef9f21acdc6459b3fbad04019a40ea8c4e80.tar.bz2
s390x/css: IO instr handler ending control
CSS code needs to tell the IO instruction handlers located in ioinst.c how the emulated instruction should be ended. Currently this is done by returning generic (POSIX) error codes, and mapping them to outcomes like condition codes. This makes bugs easy to create and hard to recognize. As a preparation for moving away from (mis)using generic error codes for flow control let us introduce a type which tells the instruction handler function how to end the instruction, in a more straight-forward and less ambiguous way. Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com> Message-Id: <20171017140453.51099-3-pasic@linux.vnet.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> [CH: cosmetic changes] Signed-off-by: Cornelia Huck <cohuck@redhat.com>
-rw-r--r--include/hw/s390x/css.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
index 69b3747..08ad1a1 100644
--- a/include/hw/s390x/css.h
+++ b/include/hw/s390x/css.h
@@ -99,6 +99,22 @@ typedef struct CcwDataStream {
hwaddr cda;
} CcwDataStream;
+/*
+ * IO instructions conclude according to this. Currently we have only
+ * cc codes. Valid values are 0, 1, 2, 3 and the generic semantic for
+ * IO instructions is described briefly. For more details consult the PoP.
+ */
+typedef enum IOInstEnding {
+ /* produced expected result */
+ IOINST_CC_EXPECTED = 0,
+ /* status conditions were present or produced alternate result */
+ IOINST_CC_STATUS_PRESENT = 1,
+ /* inst. ineffective because busy with previously initiated function */
+ IOINST_CC_BUSY = 2,
+ /* inst. ineffective because not operational */
+ IOINST_CC_NOT_OPERATIONAL = 3
+} IOInstEnding;
+
typedef struct SubchDev SubchDev;
struct SubchDev {
/* channel-subsystem related things: */