From 808e668bbc8db6faa9ffaa802628711f36fe659b Mon Sep 17 00:00:00 2001
From: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Date: Thu, 3 Aug 2017 02:35:26 +0200
Subject: [PATCH 01/44] s390x/css: use macro for event-information pending
 error recover code

Let's use a macro for the ERC (error recover code) when generating a
Channel Subsystem Event-information pending CRW (channel report word).

While we are at it, let's also add all other ERCs.

Signed-off-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Message-Id: <20170803003527.86979-2-bjsdjshi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/css.c            |  2 +-
 include/hw/s390x/ioinst.h | 12 ++++++++++--
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 1880b1a0ff..0be4eb093d 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -2108,7 +2108,7 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid)
 void css_generate_css_crws(uint8_t cssid)
 {
     if (!channel_subsys.sei_pending) {
-        css_queue_crw(CRW_RSC_CSS, 0, 0, cssid);
+        css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, cssid);
     }
     channel_subsys.sei_pending = true;
 }
diff --git a/include/hw/s390x/ioinst.h b/include/hw/s390x/ioinst.h
index 92d15655e4..5f2db6949d 100644
--- a/include/hw/s390x/ioinst.h
+++ b/include/hw/s390x/ioinst.h
@@ -201,8 +201,16 @@ typedef struct CRW {
 #define CRW_FLAGS_MASK_A 0x0080
 #define CRW_FLAGS_MASK_ERC 0x003f
 
-#define CRW_ERC_INIT 0x02
-#define CRW_ERC_IPI  0x04
+#define CRW_ERC_EVENT    0x00 /* event information pending */
+#define CRW_ERC_AVAIL    0x01 /* available */
+#define CRW_ERC_INIT     0x02 /* initialized */
+#define CRW_ERC_TERROR   0x03 /* temporary error */
+#define CRW_ERC_IPI      0x04 /* installed parm initialized */
+#define CRW_ERC_TERM     0x05 /* terminal */
+#define CRW_ERC_PERRN    0x06 /* perm. error, facility not init */
+#define CRW_ERC_PERRI    0x07 /* perm. error, facility init */
+#define CRW_ERC_PMOD     0x08 /* installed parameters modified */
+#define CRW_ERC_IPR      0x0A /* installed parameters restored */
 
 #define CRW_RSC_SUBCH 0x3
 #define CRW_RSC_CHP   0x4

From 5c8d6f008c0555b54cf10550fa86199a2cfabbca Mon Sep 17 00:00:00 2001
From: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Date: Thu, 3 Aug 2017 02:35:27 +0200
Subject: [PATCH 02/44] s390x/css: generate solicited crw for rchp completion
 signaling

A successful completion of rchp should signal a solicited channel path
initialized CRW (channel report word), while the current implementation
always generates an un-solicited one. Let's fix this.

Reported-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Message-Id: <20170803003527.86979-3-bjsdjshi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/css.c         | 16 ++++++++++------
 include/hw/s390x/css.h |  3 ++-
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 0be4eb093d..901dc6a0f3 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -1750,10 +1750,10 @@ int css_do_rchp(uint8_t cssid, uint8_t chpid)
     }
 
     /* We don't really use a channel path, so we're done here. */
-    css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT,
+    css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1,
                   channel_subsys.max_cssid > 0 ? 1 : 0, chpid);
     if (channel_subsys.max_cssid > 0) {
-        css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 0, real_cssid << 8);
+        css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, 0, real_cssid << 8);
     }
     return 0;
 }
@@ -2033,7 +2033,8 @@ void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid,
     }
 }
 
-void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid)
+void css_queue_crw(uint8_t rsc, uint8_t erc, int solicited,
+                   int chain, uint16_t rsid)
 {
     CrwContainer *crw_cont;
 
@@ -2045,6 +2046,9 @@ void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid)
         return;
     }
     crw_cont->crw.flags = (rsc << 8) | erc;
+    if (solicited) {
+        crw_cont->crw.flags |= CRW_FLAGS_MASK_S;
+    }
     if (chain) {
         crw_cont->crw.flags |= CRW_FLAGS_MASK_C;
     }
@@ -2091,9 +2095,9 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid,
     }
     chain_crw = (channel_subsys.max_ssid > 0) ||
             (channel_subsys.max_cssid > 0);
-    css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, chain_crw ? 1 : 0, schid);
+    css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, chain_crw ? 1 : 0, schid);
     if (chain_crw) {
-        css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0,
+        css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, 0,
                       (guest_cssid << 8) | (ssid << 4));
     }
     /* RW_ERC_IPI --> clear pending interrupts */
@@ -2108,7 +2112,7 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid)
 void css_generate_css_crws(uint8_t cssid)
 {
     if (!channel_subsys.sei_pending) {
-        css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, cssid);
+        css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, 0, cssid);
     }
     channel_subsys.sei_pending = true;
 }
diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
index 5c5fe6b202..5b017e1fc3 100644
--- a/include/hw/s390x/css.h
+++ b/include/hw/s390x/css.h
@@ -150,7 +150,8 @@ void copy_scsw_to_guest(SCSW *dest, const SCSW *src);
 void css_inject_io_interrupt(SubchDev *sch);
 void css_reset(void);
 void css_reset_sch(SubchDev *sch);
-void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid);
+void css_queue_crw(uint8_t rsc, uint8_t erc, int solicited,
+                   int chain, uint16_t rsid);
 void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid,
                            int hotplugged, int add);
 void css_generate_chp_crws(uint8_t cssid, uint8_t chpid);

From 70d8d9a0c9bc599d8ae99dd65ff8535adb2acdfc Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Thu, 10 Aug 2017 14:07:31 +0200
Subject: [PATCH 03/44] s390x: introduce 2.11 compat machine

Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 17 ++++++++++++++++-
 include/hw/compat.h        |  3 +++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 1c7af39ce6..d3d67b8d77 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -432,6 +432,9 @@ bool css_migration_enabled(void)
     }                                                                         \
     type_init(ccw_machine_register_##suffix)
 
+#define CCW_COMPAT_2_10 \
+        HW_COMPAT_2_10
+
 #define CCW_COMPAT_2_9 \
         HW_COMPAT_2_9 \
         {\
@@ -506,8 +509,18 @@ bool css_migration_enabled(void)
             .value    = "0",\
         },
 
+static void ccw_machine_2_11_instance_options(MachineState *machine)
+{
+}
+
+static void ccw_machine_2_11_class_options(MachineClass *mc)
+{
+}
+DEFINE_CCW_MACHINE(2_11, "2.11", true);
+
 static void ccw_machine_2_10_instance_options(MachineState *machine)
 {
+    ccw_machine_2_11_instance_options(machine);
     if (css_migration_enabled()) {
         css_register_vmstate();
     }
@@ -515,8 +528,10 @@ static void ccw_machine_2_10_instance_options(MachineState *machine)
 
 static void ccw_machine_2_10_class_options(MachineClass *mc)
 {
+    ccw_machine_2_11_class_options(mc);
+    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_10);
 }
-DEFINE_CCW_MACHINE(2_10, "2.10", true);
+DEFINE_CCW_MACHINE(2_10, "2.10", false);
 
 static void ccw_machine_2_9_instance_options(MachineState *machine)
 {
diff --git a/include/hw/compat.h b/include/hw/compat.h
index 08f36004da..3e101f8f67 100644
--- a/include/hw/compat.h
+++ b/include/hw/compat.h
@@ -1,6 +1,9 @@
 #ifndef HW_COMPAT_H
 #define HW_COMPAT_H
 
+#define HW_COMPAT_2_10 \
+    /* empty */
+
 #define HW_COMPAT_2_9 \
     {\
         .driver   = "pci-bridge",\

From 0d4fa4996fc5ee56ea7d072e272b8e69948460a5 Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Wed, 16 Aug 2017 07:30:58 +0200
Subject: [PATCH 04/44] s390x/ipl: The s390-ipl device is not hot-pluggable

The s390-ipl device can not be created by the user, since it is meant only
to  be instantiated once internally to load the ROMs and kernel. If the user
tries to do a "device_add s390-ipl" via the monitor later, QEMU aborts with
a "ROM images must be loaded at startup" error message.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1502861458-30270-1-git-send-email-thuth@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/ipl.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index cc360031ef..0d06fc12b6 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -442,6 +442,8 @@ static void s390_ipl_class_init(ObjectClass *klass, void *data)
     dc->reset = s390_ipl_reset;
     dc->vmsd = &vmstate_ipl;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+    /* Reason: Loads the ROMs and thus can only be used one time - internally */
+    dc->user_creatable = false;
 }
 
 static const TypeInfo s390_ipl_info = {

From 83898cce62ba25a473af6a164388105994481e9c Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Fri, 11 Aug 2017 07:57:55 +0200
Subject: [PATCH 05/44] tests/boot-sector: Do not overwrite the x86 buffer on
 other architectures

Re-using the boot_sector code buffer from x86 for other architectures
is not very nice, especially if we add more architectures later. It's
also ugly that the test uses a huge pre-initialized array at all - the
size of the executable is very huge due to this array. So let's use a
separate buffer for each architecture instead, allocated from the heap,
so that we really just use the memory that we need.

Suggested-by: Michael Tsirkin <mst@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <1502431076-22849-2-git-send-email-thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 tests/boot-sector.c | 41 ++++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/tests/boot-sector.c b/tests/boot-sector.c
index e3880f4455..87295624d2 100644
--- a/tests/boot-sector.c
+++ b/tests/boot-sector.c
@@ -21,13 +21,12 @@
 #define SIGNATURE 0xdead
 #define SIGNATURE_OFFSET 0x10
 #define BOOT_SECTOR_ADDRESS 0x7c00
+#define SIGNATURE_ADDR (BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET)
 
-/* Boot sector code: write SIGNATURE into memory,
+/* x86 boot sector code: write SIGNATURE into memory,
  * then halt.
- * Q35 machine requires a minimum 0x7e000 bytes disk.
- * (bug or feature?)
  */
-static uint8_t boot_sector[0x7e000] = {
+static uint8_t x86_boot_sector[512] = {
     /* The first sector will be placed at RAM address 00007C00, and
      * the BIOS transfers control to 00007C00
      */
@@ -50,8 +49,8 @@ static uint8_t boot_sector[0x7e000] = {
     [0x07] = HIGH(SIGNATURE),
     /* 7c08:  mov %ax,0x7c10 */
     [0x08] = 0xa3,
-    [0x09] = LOW(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
-    [0x0a] = HIGH(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
+    [0x09] = LOW(SIGNATURE_ADDR),
+    [0x0a] = HIGH(SIGNATURE_ADDR),
 
     /* 7c0b cli */
     [0x0b] = 0xfa,
@@ -72,7 +71,9 @@ static uint8_t boot_sector[0x7e000] = {
 int boot_sector_init(char *fname)
 {
     int fd, ret;
-    size_t len = sizeof boot_sector;
+    size_t len;
+    char *boot_code;
+    const char *arch = qtest_get_arch();
 
     fd = mkstemp(fname);
     if (fd < 0) {
@@ -80,16 +81,26 @@ int boot_sector_init(char *fname)
         return 1;
     }
 
-    /* For Open Firmware based system, we can use a Forth script instead */
-    if (strcmp(qtest_get_arch(), "ppc64") == 0) {
-        len = sprintf((char *)boot_sector, "\\ Bootscript\n%x %x c! %x %x c!\n",
-                LOW(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET,
-                HIGH(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET + 1);
+    if (g_str_equal(arch, "i386") || g_str_equal(arch, "x86_64")) {
+        /* Q35 requires a minimum 0x7e000 bytes disk (bug or feature?) */
+        len = MAX(0x7e000, sizeof(x86_boot_sector));
+        boot_code = g_malloc0(len);
+        memcpy(boot_code, x86_boot_sector, sizeof(x86_boot_sector));
+    } else if (g_str_equal(arch, "ppc64")) {
+        /* For Open Firmware based system, use a Forth script */
+        boot_code = g_strdup_printf("\\ Bootscript\n%x %x c! %x %x c!\n",
+                                    LOW(SIGNATURE), SIGNATURE_ADDR,
+                                    HIGH(SIGNATURE), SIGNATURE_ADDR + 1);
+        len = strlen(boot_code);
+    } else {
+        g_assert_not_reached();
     }
 
-    ret = write(fd, boot_sector, len);
+    ret = write(fd, boot_code, len);
     close(fd);
 
+    g_free(boot_code);
+
     if (ret != len) {
         fprintf(stderr, "Could not write \"%s\"", fname);
         return 1;
@@ -115,8 +126,8 @@ void boot_sector_test(void)
      * instruction.
      */
     for (i = 0; i < TEST_CYCLES; ++i) {
-        signature_low = readb(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET);
-        signature_high = readb(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET + 1);
+        signature_low = readb(SIGNATURE_ADDR);
+        signature_high = readb(SIGNATURE_ADDR + 1);
         signature = (signature_high << 8) | signature_low;
         if (signature == SIGNATURE) {
             break;

From b1b2feac9432869a129b5958cd697d2870ffcc6b Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Fri, 11 Aug 2017 07:57:56 +0200
Subject: [PATCH 06/44] tests/pxe: Check virtio-net-ccw on s390x

Now that we've got a firmware that can do TFTP booting on s390x (i.e.
the pc-bios/s390-netboot.img), we can enable the PXE tester for this
architecture, too.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <1502431076-22849-3-git-send-email-thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 tests/Makefile.include |  1 +
 tests/boot-sector.c    | 20 ++++++++++++++++++++
 tests/pxe-test.c       |  7 +++++++
 3 files changed, 28 insertions(+)

diff --git a/tests/Makefile.include b/tests/Makefile.include
index 37c1bed683..ea0f15f70b 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -360,6 +360,7 @@ check-qtest-microblazeel-y = $(check-qtest-microblaze-y)
 check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
 
 check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
+check-qtest-s390x-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF)
 
 check-qtest-generic-y += tests/qom-test$(EXESUF)
 check-qtest-generic-y += tests/test-hmp$(EXESUF)
diff --git a/tests/boot-sector.c b/tests/boot-sector.c
index 87295624d2..9ee85370b0 100644
--- a/tests/boot-sector.c
+++ b/tests/boot-sector.c
@@ -67,6 +67,21 @@ static uint8_t x86_boot_sector[512] = {
     [0x1FF] = 0xAA,
 };
 
+/* For s390x, use a mini "kernel" with the appropriate signature */
+static const uint8_t s390x_psw[] = {
+    0x00, 0x08, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00
+};
+static const uint8_t s390x_code[] = {
+    0xa7, 0xf4, 0x00, 0x0a,                                /* j 0x10010 */
+    0x00, 0x00, 0x00, 0x00,
+    'S', '3', '9', '0',
+    'E', 'P', 0x00, 0x01,
+    0xa7, 0x38, HIGH(SIGNATURE_ADDR), LOW(SIGNATURE_ADDR), /* lhi r3,0x7c10 */
+    0xa7, 0x48, LOW(SIGNATURE), HIGH(SIGNATURE),           /* lhi r4,0xadde */
+    0x40, 0x40, 0x30, 0x00,                                /* sth r4,0(r3) */
+    0xa7, 0xf4, 0xff, 0xfa                                 /* j 0x10010 */
+};
+
 /* Create boot disk file.  */
 int boot_sector_init(char *fname)
 {
@@ -92,6 +107,11 @@ int boot_sector_init(char *fname)
                                     LOW(SIGNATURE), SIGNATURE_ADDR,
                                     HIGH(SIGNATURE), SIGNATURE_ADDR + 1);
         len = strlen(boot_code);
+    } else if (g_str_equal(arch, "s390x")) {
+        len = 0x10000 + sizeof(s390x_code);
+        boot_code = g_malloc0(len);
+        memcpy(boot_code, s390x_psw, sizeof(s390x_psw));
+        memcpy(&boot_code[0x10000], s390x_code, sizeof(s390x_code));
     } else {
         g_assert_not_reached();
     }
diff --git a/tests/pxe-test.c b/tests/pxe-test.c
index cf6e225330..0d70afccd6 100644
--- a/tests/pxe-test.c
+++ b/tests/pxe-test.c
@@ -51,6 +51,11 @@ static void test_pxe_spapr_vlan(void)
     test_pxe_one("-device spapr-vlan,netdev=" NETNAME, true);
 }
 
+static void test_pxe_virtio_ccw(void)
+{
+    test_pxe_one("-device virtio-net-ccw,bootindex=1,netdev=" NETNAME, false);
+}
+
 int main(int argc, char *argv[])
 {
     int ret;
@@ -68,6 +73,8 @@ int main(int argc, char *argv[])
     } else if (strcmp(arch, "ppc64") == 0) {
         qtest_add_func("pxe/virtio", test_pxe_virtio_pci);
         qtest_add_func("pxe/spapr-vlan", test_pxe_spapr_vlan);
+    } else if (g_str_equal(arch, "s390x")) {
+        qtest_add_func("pxe/virtio-ccw", test_pxe_virtio_ccw);
     }
     ret = g_test_run();
     boot_sector_cleanup(disk);

From 7f57d58d6a160fdb3b3020d985ddbb3c95fe964c Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Thu, 17 Aug 2017 08:25:08 +0200
Subject: [PATCH 07/44] tests: Run filter-redirector and -mirror test only on
 POSIX systems

This way we can get rid of the ugly #ifdefs in the code which makes
it easier to extend later.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <1502951113-4246-2-git-send-email-thuth@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 tests/Makefile.include         |  8 ++++----
 tests/test-filter-mirror.c     |  5 -----
 tests/test-filter-redirector.c | 10 ----------
 3 files changed, 4 insertions(+), 19 deletions(-)

diff --git a/tests/Makefile.include b/tests/Makefile.include
index ea0f15f70b..871791d2fc 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -283,8 +283,8 @@ ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),)
 check-qtest-x86_64-$(CONFIG_VHOST_USER_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
 endif
 check-qtest-i386-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF)
-check-qtest-i386-y += tests/test-filter-mirror$(EXESUF)
-check-qtest-i386-y += tests/test-filter-redirector$(EXESUF)
+check-qtest-i386-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
+check-qtest-i386-$(CONFIG_POSIX) += tests/test-filter-redirector$(EXESUF)
 check-qtest-i386-y += tests/postcopy-test$(EXESUF)
 check-qtest-i386-y += tests/test-x86-cpuid-compat$(EXESUF)
 check-qtest-i386-y += tests/numa-test$(EXESUF)
@@ -325,8 +325,8 @@ check-qtest-ppc64-y += tests/usb-hcd-xhci-test$(EXESUF)
 gcov-files-ppc64-y += hw/usb/hcd-xhci.c
 check-qtest-ppc64-y += $(check-qtest-virtio-y)
 check-qtest-ppc64-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF)
-check-qtest-ppc64-y += tests/test-filter-mirror$(EXESUF)
-check-qtest-ppc64-y += tests/test-filter-redirector$(EXESUF)
+check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
+check-qtest-ppc64-$(CONFIG_POSIX) += tests/test-filter-redirector$(EXESUF)
 check-qtest-ppc64-y += tests/display-vga-test$(EXESUF)
 check-qtest-ppc64-y += tests/numa-test$(EXESUF)
 check-qtest-ppc64-$(CONFIG_IVSHMEM) += tests/ivshmem-test$(EXESUF)
diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
index 9f84402493..a1d5865ef7 100644
--- a/tests/test-filter-mirror.c
+++ b/tests/test-filter-mirror.c
@@ -17,9 +17,6 @@
 
 static void test_mirror(void)
 {
-#ifndef _WIN32
-/* socketpair(PF_UNIX) which does not exist on windows */
-
     int send_sock[2], recv_sock;
     char *cmdline;
     uint32_t ret = 0, len = 0;
@@ -74,8 +71,6 @@ static void test_mirror(void)
     g_free(recv_buf);
     close(recv_sock);
     unlink(sock_path);
-
-#endif
 }
 
 int main(int argc, char **argv)
diff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c
index 0c4b8d52ef..69c663b183 100644
--- a/tests/test-filter-redirector.c
+++ b/tests/test-filter-redirector.c
@@ -59,9 +59,6 @@
 
 static void test_redirector_tx(void)
 {
-#ifndef _WIN32
-/* socketpair(PF_UNIX) which does not exist on windows */
-
     int backend_sock[2], recv_sock;
     char *cmdline;
     uint32_t ret = 0, len = 0;
@@ -129,15 +126,10 @@ static void test_redirector_tx(void)
     unlink(sock_path0);
     unlink(sock_path1);
     qtest_end();
-
-#endif
 }
 
 static void test_redirector_rx(void)
 {
-#ifndef _WIN32
-/* socketpair(PF_UNIX) which does not exist on windows */
-
     int backend_sock[2], send_sock;
     char *cmdline;
     uint32_t ret = 0, len = 0;
@@ -203,8 +195,6 @@ static void test_redirector_rx(void)
     unlink(sock_path0);
     unlink(sock_path1);
     qtest_end();
-
-#endif
 }
 
 int main(int argc, char **argv)

From ea5bef49eadd240c7924f287f2da1bb457a3f92c Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Thu, 17 Aug 2017 08:25:09 +0200
Subject: [PATCH 08/44] tests: Add network filter tests to the
 check-qtest-s390x list

With some small modifications, we can also use the the netfilter,
the filter-mirror and the filter-redirector tests on s390x.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <1502951113-4246-3-git-send-email-thuth@redhat.com>
Reviewed-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 tests/Makefile.include         |  3 +++
 tests/test-filter-mirror.c     |  9 +++++++--
 tests/test-filter-redirector.c | 22 ++++++++++++++++------
 tests/test-netfilter.c         | 11 ++++++++++-
 4 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/tests/Makefile.include b/tests/Makefile.include
index 871791d2fc..f08b7418f0 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -361,6 +361,9 @@ check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
 
 check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
 check-qtest-s390x-$(CONFIG_SLIRP) += tests/pxe-test$(EXESUF)
+check-qtest-s390x-$(CONFIG_SLIRP) += tests/test-netfilter$(EXESUF)
+check-qtest-s390x-$(CONFIG_POSIX) += tests/test-filter-mirror$(EXESUF)
+check-qtest-s390x-$(CONFIG_POSIX) += tests/test-filter-redirector$(EXESUF)
 
 check-qtest-generic-y += tests/qom-test$(EXESUF)
 check-qtest-generic-y += tests/test-hmp$(EXESUF)
diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
index a1d5865ef7..d569d27657 100644
--- a/tests/test-filter-mirror.c
+++ b/tests/test-filter-mirror.c
@@ -25,6 +25,11 @@ static void test_mirror(void)
     char *recv_buf;
     uint32_t size = sizeof(send_buf);
     size = htonl(size);
+    const char *devstr = "e1000";
+
+    if (g_str_equal(qtest_get_arch(), "s390x")) {
+        devstr = "virtio-net-ccw";
+    }
 
     ret = socketpair(PF_UNIX, SOCK_STREAM, 0, send_sock);
     g_assert_cmpint(ret, !=, -1);
@@ -33,10 +38,10 @@ static void test_mirror(void)
     g_assert_cmpint(ret, !=, -1);
 
     cmdline = g_strdup_printf("-netdev socket,id=qtest-bn0,fd=%d "
-                 "-device e1000,netdev=qtest-bn0,id=qtest-e0 "
+                 "-device %s,netdev=qtest-bn0,id=qtest-e0 "
                  "-chardev socket,id=mirror0,path=%s,server,nowait "
                  "-object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0 "
-                 , send_sock[1], sock_path);
+                 , send_sock[1], devstr, sock_path);
     qtest_start(cmdline);
     g_free(cmdline);
 
diff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c
index 69c663b183..3afd41110d 100644
--- a/tests/test-filter-redirector.c
+++ b/tests/test-filter-redirector.c
@@ -57,6 +57,16 @@
 #include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 
+static const char *get_devstr(void)
+{
+    if (g_str_equal(qtest_get_arch(), "s390x")) {
+        return "virtio-net-ccw";
+    }
+
+    return "rtl8139";
+}
+
+
 static void test_redirector_tx(void)
 {
     int backend_sock[2], recv_sock;
@@ -78,7 +88,7 @@ static void test_redirector_tx(void)
     g_assert_cmpint(ret, !=, -1);
 
     cmdline = g_strdup_printf("-netdev socket,id=qtest-bn0,fd=%d "
-                "-device rtl8139,netdev=qtest-bn0,id=qtest-e0 "
+                "-device %s,netdev=qtest-bn0,id=qtest-e0 "
                 "-chardev socket,id=redirector0,path=%s,server,nowait "
                 "-chardev socket,id=redirector1,path=%s,server,nowait "
                 "-chardev socket,id=redirector2,path=%s,nowait "
@@ -87,8 +97,8 @@ static void test_redirector_tx(void)
                 "-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,"
                 "queue=tx,indev=redirector2 "
                 "-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,"
-                "queue=tx,outdev=redirector1 "
-                , backend_sock[1], sock_path0, sock_path1, sock_path0);
+                "queue=tx,outdev=redirector1 ", backend_sock[1], get_devstr(),
+                sock_path0, sock_path1, sock_path0);
     qtest_start(cmdline);
     g_free(cmdline);
 
@@ -149,7 +159,7 @@ static void test_redirector_rx(void)
     g_assert_cmpint(ret, !=, -1);
 
     cmdline = g_strdup_printf("-netdev socket,id=qtest-bn0,fd=%d "
-                "-device rtl8139,netdev=qtest-bn0,id=qtest-e0 "
+                "-device %s,netdev=qtest-bn0,id=qtest-e0 "
                 "-chardev socket,id=redirector0,path=%s,server,nowait "
                 "-chardev socket,id=redirector1,path=%s,server,nowait "
                 "-chardev socket,id=redirector2,path=%s,nowait "
@@ -158,8 +168,8 @@ static void test_redirector_rx(void)
                 "-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,"
                 "queue=rx,outdev=redirector2 "
                 "-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,"
-                "queue=rx,indev=redirector1 "
-                , backend_sock[1], sock_path0, sock_path1, sock_path0);
+                "queue=rx,indev=redirector1 ", backend_sock[1], get_devstr(),
+                sock_path0, sock_path1, sock_path0);
     qtest_start(cmdline);
     g_free(cmdline);
 
diff --git a/tests/test-netfilter.c b/tests/test-netfilter.c
index 8b5a9b21b5..2506473365 100644
--- a/tests/test-netfilter.c
+++ b/tests/test-netfilter.c
@@ -182,6 +182,12 @@ static void remove_netdev_with_multi_netfilter(void)
 int main(int argc, char **argv)
 {
     int ret;
+    char *args;
+    const char *devstr = "e1000";
+
+    if (g_str_equal(qtest_get_arch(), "s390x")) {
+        devstr = "virtio-net-ccw";
+    }
 
     g_test_init(&argc, &argv, NULL);
     qtest_add_func("/netfilter/addremove_one", add_one_netfilter);
@@ -191,10 +197,13 @@ int main(int argc, char **argv)
     qtest_add_func("/netfilter/remove_netdev_multi",
                    remove_netdev_with_multi_netfilter);
 
-    qtest_start("-netdev user,id=qtest-bn0 -device e1000,netdev=qtest-bn0");
+    args = g_strdup_printf("-netdev user,id=qtest-bn0 "
+                           "-device %s,netdev=qtest-bn0", devstr);
+    qtest_start(args);
     ret = g_test_run();
 
     qtest_end();
+    g_free(args);
 
     return ret;
 }

From a8aec856b8e708d8346c60a17f72fc774fd41af5 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Fri, 18 Aug 2017 12:55:13 +0200
Subject: [PATCH 09/44] s390x/tcg: specification exception for unknown diag

While the PoP is silent on the issue, z/VM documentation states
that unknown diagnose codes trigger a specification exception.
We already do that when running with kvm, so change tcg to do so
as well.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/misc_helper.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index d23ffcd890..5a1eba02ab 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -109,7 +109,7 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uint32_t r3, uint32_t num)
     }
 
     if (r) {
-        program_interrupt(env, PGM_OPERATION, ILEN_AUTO);
+        program_interrupt(env, PGM_SPECIFICATION, ILEN_AUTO);
     }
 }
 

From 84ebd3e8c7d4fe955b359b9aac84395907b0412e Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Wed, 16 Aug 2017 16:08:48 +0200
Subject: [PATCH 10/44] watchdog/wdt_diag288: Mark diag288 watchdog as
 non-hotpluggable

QEMU currently aborts when the user tries to hot-unplug a diag288
device:

$ qemu-system-s390x -nographic -nodefaults -S -monitor stdio
QEMU 2.9.92 monitor - type 'help' for more information
(qemu) device_add diag288,id=x
(qemu) device_del x
**
ERROR:qemu/qdev-monitor.c:872:qdev_unplug: assertion failed: (hotplug_ctrl)
Aborted (core dumped)

The device is not designed as hot-pluggable (it should only be used
via the "-watchdog" parameter), so let's simply remove the possibility
to hotplug it to prevent that users can run into this ugly situation.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1502892528-22618-1-git-send-email-thuth@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/watchdog/wdt_diag288.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/watchdog/wdt_diag288.c b/hw/watchdog/wdt_diag288.c
index a7b64e2c40..47f289216a 100644
--- a/hw/watchdog/wdt_diag288.c
+++ b/hw/watchdog/wdt_diag288.c
@@ -121,6 +121,7 @@ static void wdt_diag288_class_init(ObjectClass *klass, void *data)
     dc->realize = wdt_diag288_realize;
     dc->unrealize = wdt_diag288_unrealize;
     dc->reset = wdt_diag288_reset;
+    dc->hotpluggable = false;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     dc->vmsd = &vmstate_diag288;
     diag288->handle_timer = wdt_diag288_handle_timer;

From eb569af835b400a25e45520e7ea872134dedcd02 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Wed, 16 Aug 2017 17:30:36 +0200
Subject: [PATCH 11/44] s390x: wire up diag288 in tcg

Make the diag288 watchdog useable via tcg as well.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/misc_helper.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 5a1eba02ab..34d730ba73 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -103,6 +103,10 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uint32_t r3, uint32_t num)
         handle_diag_308(env, r1, r3);
         r = 0;
         break;
+    case 0x288:
+        /* time bomb (watchdog) */
+        r = handle_diag_288(env, r1, r3);
+        break;
     default:
         r = -1;
         break;

From e9a3591fa09f273592451f8b9f83692bcbedb60c Mon Sep 17 00:00:00 2001
From: Christian Borntraeger <borntraeger@de.ibm.com>
Date: Wed, 23 Aug 2017 12:16:23 +0200
Subject: [PATCH 12/44] configure: enable --s390-pgste linker option

KVM guests on s390 need a different page table layout than normal
processes (2kb page table + 2kb page status extensions vs 2kb page table
only). As of today this has to be enabled via the vm.allocate_pgste
sysctl.

Newer kernels (>= 4.12) on s390 check for an S390_PGSTE program header
and enable the pgste page table extensions in that case. This makes the
vm.allocate_pgste sysctl unnecessary. We enable this program header for
the s390 system emulation (qemu-system-s390x) if we build on s390
- for s390 system emulation
- the linker supports --s390-pgste (binutils >= 2.29)
- KVM is enabled

This will allow distributions to disable the global vm.allocate_pgste
sysctl, which will improve the page table allocation for non KVM
processes as only 2kb chunks are necessary.

Cc: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Cc: Alexander Graf <agraf@suse.de>
Cc: Dan Horak <dhorak@redhat.com>
Cc: David Hildenbrand <david@redhat.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1503483383-199649-1-git-send-email-borntraeger@de.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 configure | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/configure b/configure
index dd73cce62f..fb7e34a901 100755
--- a/configure
+++ b/configure
@@ -240,6 +240,11 @@ supported_target() {
     return 1
 }
 
+
+ld_has() {
+    $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
+}
+
 # default parameters
 source_path=$(dirname "$0")
 cpu=""
@@ -5043,7 +5048,7 @@ fi
 # Use ASLR, no-SEH and DEP if available
 if test "$mingw32" = "yes" ; then
     for flag in --dynamicbase --no-seh --nxcompat; do
-        if $ld --help 2>/dev/null | grep ".$flag" >/dev/null 2>/dev/null ; then
+        if ld_has $flag ; then
             LDFLAGS="-Wl,$flag $LDFLAGS"
         fi
     done
@@ -6522,6 +6527,20 @@ if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
   ldflags="$ldflags $textseg_ldflags"
 fi
 
+# Newer kernels on s390 check for an S390_PGSTE program header and
+# enable the pgste page table extensions in that case. This makes
+# the vm.allocate_pgste sysctl unnecessary. We enable this program
+# header if
+#  - we build on s390x
+#  - we build the system emulation for s390x (qemu-system-s390x)
+#  - KVM is enabled
+#  - the linker supports --s390-pgste
+if test "$TARGET_ARCH" = "s390x" -a "$target_softmmu" = "yes"  -a "$ARCH" = "s390x" -a "$kvm" = "yes"; then
+    if ld_has --s390-pgste ; then
+        ldflags="-Wl,--s390-pgste $ldflags"
+    fi
+fi
+
 echo "LDFLAGS+=$ldflags" >> $config_target_mak
 echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
 

From 5f8c92e1d50d3629116497dd0a446e8cb28af7f8 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Tue, 8 Aug 2017 11:03:38 +0200
Subject: [PATCH 13/44] 9pfs: fix dependencies

Nothing in fsdev/ or hw/9pfs/ depends on pci; it should rather depend
on CONFIG_VIRTFS and CONFIG_VIRTIO/CONFIG_XEN only.

Acked-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 fsdev/Makefile.objs   | 9 +++------
 hw/9pfs/Makefile.objs | 2 +-
 hw/Makefile.objs      | 2 +-
 3 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/fsdev/Makefile.objs b/fsdev/Makefile.objs
index 659df6e187..fb38017c0b 100644
--- a/fsdev/Makefile.objs
+++ b/fsdev/Makefile.objs
@@ -1,10 +1,7 @@
-ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
 # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
-# only pull in the actual virtio-9p device if we also enabled virtio.
-common-obj-y = qemu-fsdev.o 9p-marshal.o 9p-iov-marshal.o
-else
-common-obj-y = qemu-fsdev-dummy.o
-endif
+# only pull in the actual 9p backend if we also enabled virtio or xen.
+common-obj-$(call land,$(CONFIG_VIRTFS),$(call lor,$(CONFIG_VIRTIO),$(CONFIG_XEN))) = qemu-fsdev.o 9p-marshal.o 9p-iov-marshal.o
+common-obj-$(call lnot,$(call land,$(CONFIG_VIRTFS),$(call lor,$(CONFIG_VIRTIO),$(CONFIG_XEN)))) = qemu-fsdev-dummy.o
 common-obj-y += qemu-fsdev-opts.o qemu-fsdev-throttle.o
 
 # Toplevel always builds this; targets without virtio will put it in
diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs
index cab5e942ed..fd90b62900 100644
--- a/hw/9pfs/Makefile.objs
+++ b/hw/9pfs/Makefile.objs
@@ -7,4 +7,4 @@ common-obj-$(CONFIG_OPEN_BY_HANDLE) +=  9p-handle.o
 common-obj-y += 9p-proxy.o
 common-obj-$(CONFIG_XEN) += xen-9p-backend.o
 
-obj-y += virtio-9p-device.o
+obj-$(CONFIG_VIRTIO) += virtio-9p-device.o
diff --git a/hw/Makefile.objs b/hw/Makefile.objs
index a2c61f6b09..cf4cb2010b 100644
--- a/hw/Makefile.objs
+++ b/hw/Makefile.objs
@@ -1,4 +1,4 @@
-devices-dirs-$(call land, $(CONFIG_VIRTIO),$(call land,$(CONFIG_VIRTFS),$(CONFIG_PCI))) += 9pfs/
+devices-dirs-$(call land,$(CONFIG_VIRTFS),$(call lor,$(CONFIG_VIRTIO),$(CONFIG_XEN))) += 9pfs/
 devices-dirs-$(CONFIG_SOFTMMU) += acpi/
 devices-dirs-$(CONFIG_SOFTMMU) += adc/
 devices-dirs-$(CONFIG_SOFTMMU) += audio/

From 88c725c78e87eecb061f882177c7a6a2ac1059ad Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Fri, 7 Jul 2017 11:45:26 +0200
Subject: [PATCH 14/44] kvm: remove hard dependency on pci

The msi routing code in kvm calls some pci functions: provide
some stubs to enable builds without pci.

Also, to make this more obvious, guard them via a pci_available boolean
(which also can be reused in other places).

Fixes: e1d4fb2de ("kvm-irqchip: x86: add msi route notify fn")
Fixes: 767a554a0 ("kvm-all: Pass requester ID to MSI routing functions")
Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 accel/kvm/kvm-all.c  |  6 +++---
 hw/pci/pci-stub.c    | 14 ++++++++++++++
 hw/pci/pci.c         |  2 ++
 include/hw/pci/pci.h |  2 ++
 4 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 46ce479dc3..f85553a851 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -1248,7 +1248,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev)
     int virq;
     MSIMessage msg = {0, 0};
 
-    if (dev) {
+    if (pci_available && dev) {
         msg = pci_get_msi_message(dev, vector);
     }
 
@@ -1271,7 +1271,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev)
     kroute.u.msi.address_lo = (uint32_t)msg.address;
     kroute.u.msi.address_hi = msg.address >> 32;
     kroute.u.msi.data = le32_to_cpu(msg.data);
-    if (kvm_msi_devid_required()) {
+    if (pci_available && kvm_msi_devid_required()) {
         kroute.flags = KVM_MSI_VALID_DEVID;
         kroute.u.msi.devid = pci_requester_id(dev);
     }
@@ -1309,7 +1309,7 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
     kroute.u.msi.address_lo = (uint32_t)msg.address;
     kroute.u.msi.address_hi = msg.address >> 32;
     kroute.u.msi.data = le32_to_cpu(msg.data);
-    if (kvm_msi_devid_required()) {
+    if (pci_available && kvm_msi_devid_required()) {
         kroute.flags = KVM_MSI_VALID_DEVID;
         kroute.u.msi.devid = pci_requester_id(dev);
     }
diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c
index ecad664946..d5ce00748e 100644
--- a/hw/pci/pci-stub.c
+++ b/hw/pci/pci-stub.c
@@ -27,6 +27,7 @@
 #include "hw/pci/msi.h"
 
 bool msi_nonbroken;
+bool pci_available;
 
 PciInfoList *qmp_query_pci(Error **errp)
 {
@@ -38,3 +39,16 @@ void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict)
 {
     monitor_printf(mon, "PCI devices not supported\n");
 }
+
+/* kvm-all wants this */
+MSIMessage pci_get_msi_message(PCIDevice *dev, int vector)
+{
+    g_assert(false);
+    return (MSIMessage){};
+}
+
+uint16_t pci_requester_id(PCIDevice *dev)
+{
+    g_assert(false);
+    return 0;
+}
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 258fbe51e2..26f346db2c 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -49,6 +49,8 @@
 # define PCI_DPRINTF(format, ...)       do { } while (0)
 #endif
 
+bool pci_available = true;
+
 static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
 static char *pcibus_get_dev_path(DeviceState *dev);
 static char *pcibus_get_fw_dev_path(DeviceState *dev);
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index e598b095eb..8bb6449dd7 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -10,6 +10,8 @@
 
 #include "hw/pci/pcie.h"
 
+extern bool pci_available;
+
 /* PCI bus */
 
 #define PCI_DEVFN(slot, func)   ((((slot) & 0x1f) << 3) | ((func) & 0x07))

From 5838d65770aea0bc7d4f26bc4e5efbd0e5aeaa7a Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Mon, 17 Jul 2017 10:34:42 +0200
Subject: [PATCH 15/44] s390x/pci: add stubs

Some non-pci code calls into zpci code. Provide some stubs for builds
without pci.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/Makefile.objs   |  3 +-
 hw/s390x/s390-pci-stub.c | 76 ++++++++++++++++++++++++++++++++++++++++
 include/hw/s390x/sclp.h  |  1 +
 3 files changed, 79 insertions(+), 1 deletion(-)
 create mode 100644 hw/s390x/s390-pci-stub.c

diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs
index b2aade2466..7ee19d3abc 100644
--- a/hw/s390x/Makefile.objs
+++ b/hw/s390x/Makefile.objs
@@ -11,7 +11,8 @@ obj-y += 3270-ccw.o
 obj-y += virtio-ccw.o
 obj-y += css-bridge.o
 obj-y += ccw-device.o
-obj-y += s390-pci-bus.o s390-pci-inst.o
+obj-$(CONFIG_PCI) += s390-pci-bus.o s390-pci-inst.o
+obj-$(call lnot,$(CONFIG_PCI)) += s390-pci-stub.o
 obj-y += s390-skeys.o
 obj-y += s390-stattrib.o
 obj-$(CONFIG_KVM) += s390-skeys-kvm.o
diff --git a/hw/s390x/s390-pci-stub.c b/hw/s390x/s390-pci-stub.c
new file mode 100644
index 0000000000..48f8b4e8a3
--- /dev/null
+++ b/hw/s390x/s390-pci-stub.c
@@ -0,0 +1,76 @@
+/* stubs for non-pci builds */
+
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
+#include "s390-pci-inst.h"
+#include "s390-pci-bus.h"
+
+/* target/s390x/ioinst.c */
+int chsc_sei_nt2_get_event(void *res)
+{
+    return 1;
+}
+
+int chsc_sei_nt2_have_event(void)
+{
+    return 0;
+}
+
+/* hw/s390x/sclp.c */
+void s390_pci_sclp_configure(SCCB *sccb)
+{
+    sccb->h.response_code = cpu_to_be16(SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED);
+}
+
+void s390_pci_sclp_deconfigure(SCCB *sccb)
+{
+    sccb->h.response_code = cpu_to_be16(SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED);
+}
+
+/* target/s390x/kvm.c */
+int clp_service_call(S390CPU *cpu, uint8_t r2)
+{
+    return -1;
+}
+
+int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
+{
+    return -1;
+}
+
+int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
+{
+    return -1;
+}
+
+int stpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar)
+{
+    return -1;
+}
+
+int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
+{
+    return -1;
+}
+
+int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
+                        uint8_t ar)
+{
+    return -1;
+}
+
+int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar)
+{
+    return -1;
+}
+
+S390pciState *s390_get_phb(void)
+{
+    return NULL;
+}
+
+S390PCIBusDevice *s390_pci_find_dev_by_idx(S390pciState *s, uint32_t idx)
+{
+    return NULL;
+}
diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
index e71d526605..fe54442ecd 100644
--- a/include/hw/s390x/sclp.h
+++ b/include/hw/s390x/sclp.h
@@ -59,6 +59,7 @@
 #define SCLP_RC_INSUFFICIENT_SCCB_LENGTH        0x0300
 #define SCLP_RC_STANDBY_READ_COMPLETION         0x0410
 #define SCLP_RC_ADAPTER_IN_RESERVED_STATE       0x05f0
+#define SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED     0x06f0
 #define SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED       0x09f0
 #define SCLP_RC_INVALID_FUNCTION                0x40f0
 #define SCLP_RC_NO_EVENT_BUFFERS_STORED         0x60f0

From 1c5deaec77870961f6575e946d5af7a7d0831e57 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Thu, 6 Jul 2017 16:40:21 +0200
Subject: [PATCH 16/44] s390x: chsc nt2 events are pci-only

The nt2 event class is pci-only - don't look for events if pci is
not in the active cpu model.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-pci-bus.c  |  4 ++--
 hw/s390x/s390-pci-bus.h  |  4 ++--
 hw/s390x/s390-pci-stub.c |  4 ++--
 target/s390x/ioinst.c    | 16 ++++++++++++++++
 4 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 61cfd2138f..c57f6ebae0 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -47,7 +47,7 @@ S390pciState *s390_get_phb(void)
     return phb;
 }
 
-int chsc_sei_nt2_get_event(void *res)
+int pci_chsc_sei_nt2_get_event(void *res)
 {
     ChscSeiNt2Res *nt2_res = (ChscSeiNt2Res *)res;
     PciCcdfAvail *accdf;
@@ -87,7 +87,7 @@ int chsc_sei_nt2_get_event(void *res)
     return rc;
 }
 
-int chsc_sei_nt2_have_event(void)
+int pci_chsc_sei_nt2_have_event(void)
 {
     S390pciState *s = s390_get_phb();
 
diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h
index 67af2c12ff..5df6292509 100644
--- a/hw/s390x/s390-pci-bus.h
+++ b/hw/s390x/s390-pci-bus.h
@@ -319,8 +319,8 @@ typedef struct S390pciState {
 } S390pciState;
 
 S390pciState *s390_get_phb(void);
-int chsc_sei_nt2_get_event(void *res);
-int chsc_sei_nt2_have_event(void);
+int pci_chsc_sei_nt2_get_event(void *res);
+int pci_chsc_sei_nt2_have_event(void);
 void s390_pci_sclp_configure(SCCB *sccb);
 void s390_pci_sclp_deconfigure(SCCB *sccb);
 void s390_pci_iommu_enable(S390PCIIOMMU *iommu);
diff --git a/hw/s390x/s390-pci-stub.c b/hw/s390x/s390-pci-stub.c
index 48f8b4e8a3..7a642d376c 100644
--- a/hw/s390x/s390-pci-stub.c
+++ b/hw/s390x/s390-pci-stub.c
@@ -7,12 +7,12 @@
 #include "s390-pci-bus.h"
 
 /* target/s390x/ioinst.c */
-int chsc_sei_nt2_get_event(void *res)
+int pci_chsc_sei_nt2_get_event(void *res)
 {
     return 1;
 }
 
-int chsc_sei_nt2_have_event(void)
+int pci_chsc_sei_nt2_have_event(void)
 {
     return 0;
 }
diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c
index 51fbea620d..3fa3301f50 100644
--- a/target/s390x/ioinst.c
+++ b/target/s390x/ioinst.c
@@ -599,6 +599,22 @@ static int chsc_sei_nt0_have_event(void)
     return 0;
 }
 
+static int chsc_sei_nt2_get_event(void *res)
+{
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        return pci_chsc_sei_nt2_get_event(res);
+    }
+    return 1;
+}
+
+static int chsc_sei_nt2_have_event(void)
+{
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        return pci_chsc_sei_nt2_have_event();
+    }
+    return 0;
+}
+
 #define CHSC_SEI_NT0    (1ULL << 63)
 #define CHSC_SEI_NT2    (1ULL << 61)
 static void ioinst_handle_chsc_sei(ChscReq *req, ChscResp *res)

From 21eb052cf2934fcf94e671f0a84d596874538459 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Mon, 17 Jul 2017 11:07:57 +0200
Subject: [PATCH 17/44] s390x/pci: do not advertise pci on non-pci builds

Only set the zpci feature bit on builds that actually support pci.

Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/kvm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index c4c5791d27..bc62bba5b7 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -2662,7 +2662,9 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
     }
 
     /* We emulate a zPCI bus and AEN, therefore we don't need HW support */
-    set_bit(S390_FEAT_ZPCI, model->features);
+    if (pci_available) {
+        set_bit(S390_FEAT_ZPCI, model->features);
+    }
     set_bit(S390_FEAT_ADAPTER_EVENT_NOTIFICATION, model->features);
 
     if (s390_known_cpu_type(cpu_type)) {

From d32bd032d8fde41281aae34c16a4aa97e9acfeac Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Thu, 6 Jul 2017 17:21:52 +0200
Subject: [PATCH 18/44] s390x/ccw: create s390 phb conditionally

Don't create the s390 pci host bridge if we do not provide the zpci
facility.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index d3d67b8d77..8331c0a275 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -118,12 +118,11 @@ static void ccw_init(MachineState *machine)
 {
     int ret;
     VirtualCssBus *css_bus;
-    DeviceState *dev;
 
     s390_sclp_init();
     s390_memory_init(machine->ram_size);
 
-    /* init CPUs */
+    /* init CPUs (incl. CPU model) early so s390_has_feature() works */
     s390_init_cpus(machine);
 
     s390_flic_init();
@@ -134,10 +133,13 @@ static void ccw_init(MachineState *machine)
                       machine->initrd_filename, "s390-ccw.img",
                       "s390-netboot.img", true);
 
-    dev = qdev_create(NULL, TYPE_S390_PCI_HOST_BRIDGE);
-    object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
-                              OBJECT(dev), NULL);
-    qdev_init_nofail(dev);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        DeviceState *dev = qdev_create(NULL, TYPE_S390_PCI_HOST_BRIDGE);
+        object_property_add_child(qdev_get_machine(),
+                                  TYPE_S390_PCI_HOST_BRIDGE,
+                                  OBJECT(dev), NULL);
+        qdev_init_nofail(dev);
+    }
 
     /* register hypercalls */
     virtio_ccw_register_hcalls();

From 80b7a265362c870f95fb5ca1f7e7a02c0fa0db3e Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Thu, 6 Jul 2017 17:13:14 +0200
Subject: [PATCH 19/44] s390x/sclp: properly guard pci-specific functions

If we do not provide zpci, pci reconfiguration via sclp is not available
either. I/O adapter configuration, however, should always be present.

Rename the values that refer to I/O adapter configuration (instead of only
pci) to make things clearer.

Move length checking of the sccb for I/O adapter configuration into the
common sclp code (out of the pci code). This also fixes an issue that
the pci code would refer to a field in the sccb before checking whether
it was actually long enough.

Check for the adapter type in the sccb and return unrecognized adapter
type if the guest tries to issue I/O adapter configure/deconfigure for
a type other than pci or for pci if the zpci facility is not provided.

Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-pci-bus.c | 14 ++------------
 hw/s390x/s390-pci-bus.h |  8 --------
 hw/s390x/sclp.c         | 39 ++++++++++++++++++++++++++++++++++-----
 include/hw/s390x/sclp.h | 16 ++++++++++++----
 4 files changed, 48 insertions(+), 29 deletions(-)

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index c57f6ebae0..0a31a4ae88 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -122,16 +122,11 @@ S390PCIBusDevice *s390_pci_find_dev_by_fid(S390pciState *s, uint32_t fid)
 
 void s390_pci_sclp_configure(SCCB *sccb)
 {
-    PciCfgSccb *psccb = (PciCfgSccb *)sccb;
+    IoaCfgSccb *psccb = (IoaCfgSccb *)sccb;
     S390PCIBusDevice *pbdev = s390_pci_find_dev_by_fid(s390_get_phb(),
                                                        be32_to_cpu(psccb->aid));
     uint16_t rc;
 
-    if (be16_to_cpu(sccb->h.length) < 16) {
-        rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH;
-        goto out;
-    }
-
     if (!pbdev) {
         DPRINTF("sclp config no dev found\n");
         rc = SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED;
@@ -155,16 +150,11 @@ out:
 
 void s390_pci_sclp_deconfigure(SCCB *sccb)
 {
-    PciCfgSccb *psccb = (PciCfgSccb *)sccb;
+    IoaCfgSccb *psccb = (IoaCfgSccb *)sccb;
     S390PCIBusDevice *pbdev = s390_pci_find_dev_by_fid(s390_get_phb(),
                                                        be32_to_cpu(psccb->aid));
     uint16_t rc;
 
-    if (be16_to_cpu(sccb->h.length) < 16) {
-        rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH;
-        goto out;
-    }
-
     if (!pbdev) {
         DPRINTF("sclp deconfig no dev found\n");
         rc = SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED;
diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h
index 5df6292509..bd636abc28 100644
--- a/hw/s390x/s390-pci-bus.h
+++ b/hw/s390x/s390-pci-bus.h
@@ -244,14 +244,6 @@ typedef struct ChscSeiNt2Res {
     uint8_t ccdf[4016];
 } QEMU_PACKED ChscSeiNt2Res;
 
-typedef struct PciCfgSccb {
-    SCCBHeader header;
-    uint8_t atype;
-    uint8_t reserved1;
-    uint16_t reserved2;
-    uint32_t aid;
-} QEMU_PACKED PciCfgSccb;
-
 typedef struct S390MsixInfo {
     bool available;
     uint8_t table_bar;
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index 9253dbbc64..7ae6a0e37a 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -80,7 +80,7 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
     prepare_cpu_entries(sclp, read_info->entries, cpu_count);
 
     read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
-                                        SCLP_HAS_PCI_RECONFIG);
+                                        SCLP_HAS_IOA_RECONFIG);
 
     /* Memory Hotplug is only supported for the ccw machine type */
     if (mhd) {
@@ -354,6 +354,35 @@ static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB *sccb)
     sccb->h.response_code = cpu_to_be16(SCLP_RC_NORMAL_READ_COMPLETION);
 }
 
+static void sclp_configure_io_adapter(SCLPDevice *sclp, SCCB *sccb,
+                                      bool configure)
+{
+    int rc;
+
+    if (be16_to_cpu(sccb->h.length) < 16) {
+        rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH;
+        goto out_err;
+    }
+
+    switch (((IoaCfgSccb *)sccb)->atype) {
+    case SCLP_RECONFIG_PCI_ATYPE:
+        if (s390_has_feat(S390_FEAT_ZPCI)) {
+            if (configure) {
+                s390_pci_sclp_configure(sccb);
+            } else {
+                s390_pci_sclp_deconfigure(sccb);
+            }
+            return;
+        }
+        /* fallthrough */
+    default:
+        rc = SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED;
+    }
+
+ out_err:
+    sccb->h.response_code = cpu_to_be16(rc);
+}
+
 static void sclp_execute(SCLPDevice *sclp, SCCB *sccb, uint32_t code)
 {
     SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp);
@@ -384,11 +413,11 @@ static void sclp_execute(SCLPDevice *sclp, SCCB *sccb, uint32_t code)
     case SCLP_UNASSIGN_STORAGE:
         sclp_c->unassign_storage(sclp, sccb);
         break;
-    case SCLP_CMDW_CONFIGURE_PCI:
-        s390_pci_sclp_configure(sccb);
+    case SCLP_CMDW_CONFIGURE_IOA:
+        sclp_configure_io_adapter(sclp, sccb, true);
         break;
-    case SCLP_CMDW_DECONFIGURE_PCI:
-        s390_pci_sclp_deconfigure(sccb);
+    case SCLP_CMDW_DECONFIGURE_IOA:
+        sclp_configure_io_adapter(sclp, sccb, false);
         break;
     default:
         efc->command_handler(ef, sccb, code);
diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
index fe54442ecd..a72d096081 100644
--- a/include/hw/s390x/sclp.h
+++ b/include/hw/s390x/sclp.h
@@ -44,10 +44,10 @@
 #define SCLP_CMDW_DECONFIGURE_CPU               0x00100001
 
 /* SCLP PCI codes */
-#define SCLP_HAS_PCI_RECONFIG                   0x0000000040000000ULL
-#define SCLP_CMDW_CONFIGURE_PCI                 0x001a0001
-#define SCLP_CMDW_DECONFIGURE_PCI               0x001b0001
-#define SCLP_RECONFIG_PCI_ATPYE                 2
+#define SCLP_HAS_IOA_RECONFIG                   0x0000000040000000ULL
+#define SCLP_CMDW_CONFIGURE_IOA                 0x001a0001
+#define SCLP_CMDW_DECONFIGURE_IOA               0x001b0001
+#define SCLP_RECONFIG_PCI_ATYPE                 2
 
 /* SCLP response codes */
 #define SCLP_RC_NORMAL_READ_COMPLETION          0x0010
@@ -168,6 +168,14 @@ typedef struct AssignStorage {
     uint16_t rn;
 } QEMU_PACKED AssignStorage;
 
+typedef struct IoaCfgSccb {
+    SCCBHeader header;
+    uint8_t atype;
+    uint8_t reserved1;
+    uint16_t reserved2;
+    uint32_t aid;
+} QEMU_PACKED IoaCfgSccb;
+
 typedef struct SCCB {
     SCCBHeader h;
     char data[SCCB_DATA_LEN];

From 42f865da967aa6965a50336154bd4f038df96993 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Thu, 6 Jul 2017 17:48:55 +0200
Subject: [PATCH 20/44] s390x/pci: fence off instructions for non-pci

If a guest running on a machine without zpci issues a pci instruction,
throw them an exception.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/kvm.c | 54 +++++++++++++++++++++++++++++++++++-----------
 1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index bc62bba5b7..9de165d8b1 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -1191,7 +1191,11 @@ static int kvm_clp_service_call(S390CPU *cpu, struct kvm_run *run)
 {
     uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
 
-    return clp_service_call(cpu, r2);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        return clp_service_call(cpu, r2);
+    } else {
+        return -1;
+    }
 }
 
 static int kvm_pcilg_service_call(S390CPU *cpu, struct kvm_run *run)
@@ -1199,7 +1203,11 @@ static int kvm_pcilg_service_call(S390CPU *cpu, struct kvm_run *run)
     uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
     uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
 
-    return pcilg_service_call(cpu, r1, r2);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        return pcilg_service_call(cpu, r1, r2);
+    } else {
+        return -1;
+    }
 }
 
 static int kvm_pcistg_service_call(S390CPU *cpu, struct kvm_run *run)
@@ -1207,7 +1215,11 @@ static int kvm_pcistg_service_call(S390CPU *cpu, struct kvm_run *run)
     uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
     uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
 
-    return pcistg_service_call(cpu, r1, r2);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        return pcistg_service_call(cpu, r1, r2);
+    } else {
+        return -1;
+    }
 }
 
 static int kvm_stpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
@@ -1216,10 +1228,14 @@ static int kvm_stpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
     uint64_t fiba;
     uint8_t ar;
 
-    cpu_synchronize_state(CPU(cpu));
-    fiba = get_base_disp_rxy(cpu, run, &ar);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        cpu_synchronize_state(CPU(cpu));
+        fiba = get_base_disp_rxy(cpu, run, &ar);
 
-    return stpcifc_service_call(cpu, r1, fiba, ar);
+        return stpcifc_service_call(cpu, r1, fiba, ar);
+    } else {
+        return -1;
+    }
 }
 
 static int kvm_sic_service_call(S390CPU *cpu, struct kvm_run *run)
@@ -1247,7 +1263,11 @@ static int kvm_rpcit_service_call(S390CPU *cpu, struct kvm_run *run)
     uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
     uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
 
-    return rpcit_service_call(cpu, r1, r2);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        return rpcit_service_call(cpu, r1, r2);
+    } else {
+        return -1;
+    }
 }
 
 static int kvm_pcistb_service_call(S390CPU *cpu, struct kvm_run *run)
@@ -1257,10 +1277,14 @@ static int kvm_pcistb_service_call(S390CPU *cpu, struct kvm_run *run)
     uint64_t gaddr;
     uint8_t ar;
 
-    cpu_synchronize_state(CPU(cpu));
-    gaddr = get_base_disp_rsy(cpu, run, &ar);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        cpu_synchronize_state(CPU(cpu));
+        gaddr = get_base_disp_rsy(cpu, run, &ar);
 
-    return pcistb_service_call(cpu, r1, r3, gaddr, ar);
+        return pcistb_service_call(cpu, r1, r3, gaddr, ar);
+    } else {
+        return -1;
+    }
 }
 
 static int kvm_mpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
@@ -1269,10 +1293,14 @@ static int kvm_mpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
     uint64_t fiba;
     uint8_t ar;
 
-    cpu_synchronize_state(CPU(cpu));
-    fiba = get_base_disp_rxy(cpu, run, &ar);
+    if (s390_has_feat(S390_FEAT_ZPCI)) {
+        cpu_synchronize_state(CPU(cpu));
+        fiba = get_base_disp_rxy(cpu, run, &ar);
 
-    return mpcifc_service_call(cpu, r1, fiba, ar);
+        return mpcifc_service_call(cpu, r1, fiba, ar);
+    } else {
+        return -1;
+    }
 }
 
 static int handle_b9(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)

From 1ecb285dc9333ebbf1b32b55d03650414fbdbe41 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Fri, 7 Jul 2017 10:54:18 +0200
Subject: [PATCH 21/44] s390x: refine pci dependencies

VIRTIO_PCI should properly depend on CONFIG_PCI.
With this change, we can switch off pci for s390x by removing
'CONFIG_PCI=y' from the default config.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 default-configs/s390x-softmmu.mak | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
index 51191b77df..6ab2bc65ac 100644
--- a/default-configs/s390x-softmmu.mak
+++ b/default-configs/s390x-softmmu.mak
@@ -1,5 +1,5 @@
 CONFIG_PCI=y
-CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_PCI=$(CONFIG_PCI)
 CONFIG_VHOST_USER_SCSI=$(and $(CONFIG_VHOST_USER),$(CONFIG_LINUX))
 CONFIG_VIRTIO=y
 CONFIG_SCLPCONSOLE=y

From 574ee06de9c4fe63c90be90dc9c747fc9382bb2b Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Thu, 24 Aug 2017 12:08:48 +0200
Subject: [PATCH 22/44] s390x/s390-skeys: Mark the storage key devices with
 user_creatable = false

QEMU currently aborts if the user tries to create a skey device:

$ s390x-softmmu/qemu-system-s390x -nographic -device s390-skeys-qemu
qemu-system-s390x: hw/s390x/s390-skeys.c:30: s390_get_skeys_device:
 Assertion `ss' failed.
Aborted (core dumped)

The storage key devices are only meant to be instantiated one time,
internally. They can not be used by the user, so mark them with
user_creatable = false.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1503569328-22197-1-git-send-email-thuth@redhat.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-skeys-kvm.c | 4 ++++
 hw/s390x/s390-skeys.c     | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/hw/s390x/s390-skeys-kvm.c b/hw/s390x/s390-skeys-kvm.c
index 131da56bbe..dc54ed8b11 100644
--- a/hw/s390x/s390-skeys-kvm.c
+++ b/hw/s390x/s390-skeys-kvm.c
@@ -54,10 +54,14 @@ static int kvm_s390_skeys_set(S390SKeysState *ss, uint64_t start_gfn,
 static void kvm_s390_skeys_class_init(ObjectClass *oc, void *data)
 {
     S390SKeysClass *skeyclass = S390_SKEYS_CLASS(oc);
+    DeviceClass *dc = DEVICE_CLASS(oc);
 
     skeyclass->skeys_enabled = kvm_s390_skeys_enabled;
     skeyclass->get_skeys = kvm_s390_skeys_get;
     skeyclass->set_skeys = kvm_s390_skeys_set;
+
+    /* Reason: Internal device (only one skeys device for the whole memory) */
+    dc->user_creatable = false;
 }
 
 static const TypeInfo kvm_s390_skeys_info = {
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index c0de3b0c35..53ad5d38d4 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -229,10 +229,14 @@ static int qemu_s390_skeys_get(S390SKeysState *ss, uint64_t start_gfn,
 static void qemu_s390_skeys_class_init(ObjectClass *oc, void *data)
 {
     S390SKeysClass *skeyclass = S390_SKEYS_CLASS(oc);
+    DeviceClass *dc = DEVICE_CLASS(oc);
 
     skeyclass->skeys_enabled = qemu_s390_skeys_enabled;
     skeyclass->get_skeys = qemu_s390_skeys_get;
     skeyclass->set_skeys = qemu_s390_skeys_set;
+
+    /* Reason: Internal device (only one skeys device for the whole memory) */
+    dc->user_creatable = false;
 }
 
 static const TypeInfo qemu_s390_skeys_info = {

From fba5f6feba119c2c2ac3ecc8f7cb630085611c93 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:36 +0200
Subject: [PATCH 23/44] s390x/kvm: drop KVMState parameter from
 s390_get_memslot_count()

Not needed at that point.

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-2-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/sclp.c    | 2 +-
 target/s390x/cpu.h | 8 ++++----
 target/s390x/kvm.c | 4 ++--
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index 7ae6a0e37a..ffdf4712a1 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -57,7 +57,7 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
     CPUState *cpu;
     int cpu_count = 0;
     int rnsize, rnmax;
-    int slots = MIN(machine->ram_slots, s390_get_memslot_count(kvm_state));
+    int slots = MIN(machine->ram_slots, s390_get_memslot_count());
     IplParameterBlock *ipib = s390_ipl_get_iplb();
 
     CPU_FOREACH(cpu) {
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 29fdd5d49a..44b1a7ab71 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -1164,7 +1164,7 @@ void kvm_s390_enable_css_support(S390CPU *cpu);
 int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
                                     int vq, bool assign);
 int kvm_s390_cpu_restart(S390CPU *cpu);
-int kvm_s390_get_memslot_count(KVMState *s);
+int kvm_s390_get_memslot_count(void);
 int kvm_s390_cmma_active(void);
 void kvm_s390_cmma_reset(void);
 int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
@@ -1204,7 +1204,7 @@ static inline int kvm_s390_cpu_restart(S390CPU *cpu)
 static inline void kvm_s390_cmma_reset(void)
 {
 }
-static inline int kvm_s390_get_memslot_count(KVMState *s)
+static inline int kvm_s390_get_memslot_count(void)
 {
   return MAX_AVAIL_SLOTS;
 }
@@ -1263,10 +1263,10 @@ static inline int s390_cpu_restart(S390CPU *cpu)
     return -ENOSYS;
 }
 
-static inline int s390_get_memslot_count(KVMState *s)
+static inline int s390_get_memslot_count(void)
 {
     if (kvm_enabled()) {
-        return kvm_s390_get_memslot_count(s);
+        return kvm_s390_get_memslot_count();
     } else {
         return MAX_AVAIL_SLOTS;
     }
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 9de165d8b1..d961fcf18b 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -2317,9 +2317,9 @@ int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
     return kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick);
 }
 
-int kvm_s390_get_memslot_count(KVMState *s)
+int kvm_s390_get_memslot_count(void)
 {
-    return kvm_check_extension(s, KVM_CAP_NR_MEMSLOTS);
+    return kvm_check_extension(kvm_state, KVM_CAP_NR_MEMSLOTS);
 }
 
 int kvm_s390_get_ri(void)

From 708f99c366f7ea043123a894c416a24384f50b5c Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:37 +0200
Subject: [PATCH 24/44] s390x/kvm: drop KVMState parameter from
 kvm_s390_set_mem_limit()

Not needed at that point. Also drop it from kvm_s390_query_mem_limit()
we call in kvm_s390_set_mem_limit().

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-3-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.h |  7 +++----
 target/s390x/kvm.c | 12 ++++++------
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 44b1a7ab71..798e299db1 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -1169,7 +1169,7 @@ int kvm_s390_cmma_active(void);
 void kvm_s390_cmma_reset(void);
 int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
 void kvm_s390_reset_vcpu(S390CPU *cpu);
-int kvm_s390_set_mem_limit(KVMState *s, uint64_t new_limit, uint64_t *hw_limit);
+int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit);
 void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
 int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
 int kvm_s390_get_ri(void);
@@ -1215,8 +1215,7 @@ static inline int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state)
 static inline void kvm_s390_reset_vcpu(S390CPU *cpu)
 {
 }
-static inline int kvm_s390_set_mem_limit(KVMState *s, uint64_t new_limit,
-                                         uint64_t *hw_limit)
+static inline int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit)
 {
     return 0;
 }
@@ -1243,7 +1242,7 @@ static inline void kvm_s390_crypto_reset(void)
 static inline int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit)
 {
     if (kvm_enabled()) {
-        return kvm_s390_set_mem_limit(kvm_state, new_limit, hw_limit);
+        return kvm_s390_set_mem_limit(new_limit, hw_limit);
     }
     return 0;
 }
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index d961fcf18b..23109a7c76 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -145,7 +145,7 @@ static int active_cmma;
 
 static void *legacy_s390_alloc(size_t size, uint64_t *align);
 
-static int kvm_s390_query_mem_limit(KVMState *s, uint64_t *memory_limit)
+static int kvm_s390_query_mem_limit(uint64_t *memory_limit)
 {
     struct kvm_device_attr attr = {
         .group = KVM_S390_VM_MEM_CTRL,
@@ -153,10 +153,10 @@ static int kvm_s390_query_mem_limit(KVMState *s, uint64_t *memory_limit)
         .addr = (uint64_t) memory_limit,
     };
 
-    return kvm_vm_ioctl(s, KVM_GET_DEVICE_ATTR, &attr);
+    return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
 }
 
-int kvm_s390_set_mem_limit(KVMState *s, uint64_t new_limit, uint64_t *hw_limit)
+int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit)
 {
     int rc;
 
@@ -166,18 +166,18 @@ int kvm_s390_set_mem_limit(KVMState *s, uint64_t new_limit, uint64_t *hw_limit)
         .addr = (uint64_t) &new_limit,
     };
 
-    if (!kvm_vm_check_mem_attr(s, KVM_S390_VM_MEM_LIMIT_SIZE)) {
+    if (!kvm_vm_check_mem_attr(kvm_state, KVM_S390_VM_MEM_LIMIT_SIZE)) {
         return 0;
     }
 
-    rc = kvm_s390_query_mem_limit(s, hw_limit);
+    rc = kvm_s390_query_mem_limit(hw_limit);
     if (rc) {
         return rc;
     } else if (*hw_limit < new_limit) {
         return -E2BIG;
     }
 
-    return kvm_vm_ioctl(s, KVM_SET_DEVICE_ATTR, &attr);
+    return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
 }
 
 int kvm_s390_cmma_active(void)

From ad4ad5f5125be3de5613221e073d5ebb4dd7fb89 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:38 +0200
Subject: [PATCH 25/44] target/s390x: simplify ri_allowed()

Only used in KVM and there is no reason why it shouldn't be allowed for
tcg - it is simply not available.

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-4-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 8331c0a275..cdf7fa042b 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -278,9 +278,6 @@ static S390CcwMachineClass *get_machine_class(void)
 
 bool ri_allowed(void)
 {
-    if (!kvm_enabled()) {
-        return false;
-    }
     /* for "none" machine this results in true */
     return get_machine_class()->ri_allowed;
 }

From c50f65118b429e6847d5c11b1a20a560d61c34b7 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:39 +0200
Subject: [PATCH 26/44] target/s390x: simplify gs_allowed()

No need for kvm_enabled() as this function is only called from KVM and
there is no reason why it shouldn't be allowed for tcg. It is simply not
available under tcg.

Also, there is no need to check for the machine type anymore. Just like
ri_enabled(), we can directly use the stored flag, which results in
"true" for the "none" machine.

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-5-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index cdf7fa042b..3a718953a2 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -290,18 +290,8 @@ bool cpu_model_allowed(void)
 
 bool gs_allowed(void)
 {
-    if (kvm_enabled()) {
-        MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
-        if (object_class_dynamic_cast(OBJECT_CLASS(mc),
-                                      TYPE_S390_CCW_MACHINE)) {
-            S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
-
-            return s390mc->gs_allowed;
-        }
-        /* Make sure the "none" machine can have gs */
-        return true;
-    }
-    return false;
+    /* for "none" machine this results in true */
+    return get_machine_class()->gs_allowed;
 }
 
 static char *machine_get_loadparm(Object *obj, Error **errp)

From fe7cb8eab27811af76c54d29658fa83d9a9095b9 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:40 +0200
Subject: [PATCH 27/44] target/s390x: no need to pass kvm_state to savevm_gtod
 handlers

Let's avoid any KVM stuff in s390-virtio-ccw.c. This parameter is simply
ignored.

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-6-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 3a718953a2..42f0edac36 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -163,7 +163,7 @@ static void ccw_init(MachineState *machine)
     s390_create_virtio_net(BUS(css_bus), "virtio-net-ccw");
 
     /* Register savevm handler for guest TOD clock */
-    register_savevm_live(NULL, "todclock", 0, 1, &savevm_gtod, kvm_state);
+    register_savevm_live(NULL, "todclock", 0, 1, &savevm_gtod, NULL);
 }
 
 static void s390_cpu_plug(HotplugHandler *hotplug_dev,

From 7d00bf94dfa41d0d5759cc3ebe02b66a780c5789 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:41 +0200
Subject: [PATCH 28/44] s390x/cpumodel: factor out determination of default
 model name

Now we can drop inclusion of "sysemu/kvm.h" from "s390-virtio.c".

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-7-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio.c    | 7 +------
 target/s390x/cpu.h        | 1 +
 target/s390x/cpu_models.c | 8 ++++++++
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index afa4148e6b..da3f49e80e 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -33,7 +33,6 @@
 #include "hw/boards.h"
 #include "hw/loader.h"
 #include "hw/virtio/virtio.h"
-#include "sysemu/kvm.h"
 #include "exec/address-spaces.h"
 #include "sysemu/qtest.h"
 
@@ -93,11 +92,7 @@ void s390_init_cpus(MachineState *machine)
     gchar *name;
 
     if (machine->cpu_model == NULL) {
-        if (kvm_enabled()) {
-            machine->cpu_model = "host";
-        } else {
-            machine->cpu_model = "qemu";
-        }
+        machine->cpu_model = s390_default_cpu_model_name();
     }
 
     cpu_states = g_new0(S390CPU *, max_cpus);
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 798e299db1..3ce7ffc126 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -647,6 +647,7 @@ void s390_cpu_model_register_props(Object *obj);
 void s390_cpu_model_class_register_props(ObjectClass *oc);
 void s390_realize_cpu_model(CPUState *cs, Error **errp);
 ObjectClass *s390_cpu_class_by_name(const char *name);
+const char *s390_default_cpu_model_name(void);
 
 #define EXCP_EXT 1 /* external interrupt */
 #define EXCP_SVC 2 /* supervisor call (syscall) */
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index fa1338fc72..915f067991 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -1200,6 +1200,14 @@ ObjectClass *s390_cpu_class_by_name(const char *name)
     return oc;
 }
 
+const char *s390_default_cpu_model_name(void)
+{
+     if (kvm_enabled()) {
+        return "host";
+     }
+     return "qemu";
+}
+
 static const TypeInfo qemu_s390_cpu_type_info = {
     .name = S390_CPU_TYPE_NAME("qemu"),
     .parent = TYPE_S390_CPU,

From e654ca84b6c39678f5d1478de6662920976e21dd Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:42 +0200
Subject: [PATCH 29/44] s390x: drop inclusion of sysemu/kvm.h from some files

s390-stattrib.c needs definition of TARGET_PAGE_SIZE, solve it via cpu.h.

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-8-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-stattrib.c | 2 +-
 hw/s390x/sclp.c          | 1 -
 hw/s390x/sclpcpu.c       | 1 -
 target/s390x/arch_dump.c | 1 -
 4 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
index d14923f099..14a02711a2 100644
--- a/hw/s390x/s390-stattrib.c
+++ b/hw/s390x/s390-stattrib.c
@@ -11,12 +11,12 @@
 
 #include "qemu/osdep.h"
 #include "hw/boards.h"
+#include "cpu.h"
 #include "qmp-commands.h"
 #include "migration/qemu-file.h"
 #include "migration/register.h"
 #include "hw/s390x/storage-attributes.h"
 #include "qemu/error-report.h"
-#include "sysemu/kvm.h"
 #include "exec/ram_addr.h"
 #include "qapi/error.h"
 
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index ffdf4712a1..fd097262c7 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -15,7 +15,6 @@
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "cpu.h"
-#include "sysemu/kvm.h"
 #include "exec/memory.h"
 #include "sysemu/sysemu.h"
 #include "exec/address-spaces.h"
diff --git a/hw/s390x/sclpcpu.c b/hw/s390x/sclpcpu.c
index b1f3ef8c7d..023d059a46 100644
--- a/hw/s390x/sclpcpu.c
+++ b/hw/s390x/sclpcpu.c
@@ -18,7 +18,6 @@
 #include "hw/s390x/event-facility.h"
 #include "cpu.h"
 #include "sysemu/cpus.h"
-#include "sysemu/kvm.h"
 
 typedef struct ConfigMgtData {
     EventBufferHeader ebh;
diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
index 96c9fb97cb..399030d118 100644
--- a/target/s390x/arch_dump.c
+++ b/target/s390x/arch_dump.c
@@ -16,7 +16,6 @@
 #include "elf.h"
 #include "exec/cpu-all.h"
 #include "sysemu/dump.h"
-#include "sysemu/kvm.h"
 
 
 struct S390xUserRegsStruct {

From 1083a3f45c8077828697b5e43510d90de943c640 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:43 +0200
Subject: [PATCH 30/44] target/s390x: move gtod_*() declarations to
 s390-virtio.h

The functions are not used in target/s390x/ so a header in hw/s390x/
is a better place.

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-9-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio.h | 2 ++
 target/s390x/cpu.h     | 3 ---
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/s390x/s390-virtio.h b/hw/s390x/s390-virtio.h
index f2377a3e0e..ca97fd6814 100644
--- a/hw/s390x/s390-virtio.h
+++ b/hw/s390x/s390-virtio.h
@@ -30,4 +30,6 @@ void s390_create_virtio_net(BusState *bus, const char *name);
 void s390_nmi(NMIState *n, int cpu_index, Error **errp);
 void s390_machine_reset(void);
 void s390_memory_init(ram_addr_t mem_size);
+void gtod_save(QEMUFile *f, void *opaque);
+int gtod_load(QEMUFile *f, void *opaque, int version_id);
 #endif
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 3ce7ffc126..c40d70dd70 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -594,9 +594,6 @@ static inline uint8_t s390_cpu_get_state(S390CPU *cpu)
     return cpu->env.cpu_state;
 }
 
-void gtod_save(QEMUFile *f, void *opaque);
-int gtod_load(QEMUFile *f, void *opaque, int version_id);
-
 void cpu_inject_ext(S390CPU *cpu, uint32_t code, uint32_t param,
                     uint64_t param64);
 

From c534055031bec5717b7a447fc821ca9fa2b46dcf Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:44 +0200
Subject: [PATCH 31/44] target/s390x: move cc_name() to helper.c
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

While at it, move the translations into the function and properly pass
enum cc_op as parameter. We can't move it to cc_helper.c as this would
break --disable-tcg.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-10-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.h    | 48 +------------------------------------------
 target/s390x/helper.c | 48 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 47 deletions(-)

diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index c40d70dd70..10208ecbbb 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -742,53 +742,7 @@ enum cc_op {
     CC_OP_MAX
 };
 
-static const char *cc_names[] = {
-    [CC_OP_CONST0]    = "CC_OP_CONST0",
-    [CC_OP_CONST1]    = "CC_OP_CONST1",
-    [CC_OP_CONST2]    = "CC_OP_CONST2",
-    [CC_OP_CONST3]    = "CC_OP_CONST3",
-    [CC_OP_DYNAMIC]   = "CC_OP_DYNAMIC",
-    [CC_OP_STATIC]    = "CC_OP_STATIC",
-    [CC_OP_NZ]        = "CC_OP_NZ",
-    [CC_OP_LTGT_32]   = "CC_OP_LTGT_32",
-    [CC_OP_LTGT_64]   = "CC_OP_LTGT_64",
-    [CC_OP_LTUGTU_32] = "CC_OP_LTUGTU_32",
-    [CC_OP_LTUGTU_64] = "CC_OP_LTUGTU_64",
-    [CC_OP_LTGT0_32]  = "CC_OP_LTGT0_32",
-    [CC_OP_LTGT0_64]  = "CC_OP_LTGT0_64",
-    [CC_OP_ADD_64]    = "CC_OP_ADD_64",
-    [CC_OP_ADDU_64]   = "CC_OP_ADDU_64",
-    [CC_OP_ADDC_64]   = "CC_OP_ADDC_64",
-    [CC_OP_SUB_64]    = "CC_OP_SUB_64",
-    [CC_OP_SUBU_64]   = "CC_OP_SUBU_64",
-    [CC_OP_SUBB_64]   = "CC_OP_SUBB_64",
-    [CC_OP_ABS_64]    = "CC_OP_ABS_64",
-    [CC_OP_NABS_64]   = "CC_OP_NABS_64",
-    [CC_OP_ADD_32]    = "CC_OP_ADD_32",
-    [CC_OP_ADDU_32]   = "CC_OP_ADDU_32",
-    [CC_OP_ADDC_32]   = "CC_OP_ADDC_32",
-    [CC_OP_SUB_32]    = "CC_OP_SUB_32",
-    [CC_OP_SUBU_32]   = "CC_OP_SUBU_32",
-    [CC_OP_SUBB_32]   = "CC_OP_SUBB_32",
-    [CC_OP_ABS_32]    = "CC_OP_ABS_32",
-    [CC_OP_NABS_32]   = "CC_OP_NABS_32",
-    [CC_OP_COMP_32]   = "CC_OP_COMP_32",
-    [CC_OP_COMP_64]   = "CC_OP_COMP_64",
-    [CC_OP_TM_32]     = "CC_OP_TM_32",
-    [CC_OP_TM_64]     = "CC_OP_TM_64",
-    [CC_OP_NZ_F32]    = "CC_OP_NZ_F32",
-    [CC_OP_NZ_F64]    = "CC_OP_NZ_F64",
-    [CC_OP_NZ_F128]   = "CC_OP_NZ_F128",
-    [CC_OP_ICM]       = "CC_OP_ICM",
-    [CC_OP_SLA_32]    = "CC_OP_SLA_32",
-    [CC_OP_SLA_64]    = "CC_OP_SLA_64",
-    [CC_OP_FLOGR]     = "CC_OP_FLOGR",
-};
-
-static inline const char *cc_name(int cc_op)
-{
-    return cc_names[cc_op];
-}
+const char *cc_name(enum cc_op cc_op);
 
 static inline void setcc(S390CPU *cpu, uint64_t cc)
 {
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index 0c989b1610..e31d3e51df 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -352,3 +352,51 @@ void s390_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
 
     cpu_fprintf(f, "\n");
 }
+
+const char *cc_name(enum cc_op cc_op)
+{
+    static const char * const cc_names[] = {
+        [CC_OP_CONST0]    = "CC_OP_CONST0",
+        [CC_OP_CONST1]    = "CC_OP_CONST1",
+        [CC_OP_CONST2]    = "CC_OP_CONST2",
+        [CC_OP_CONST3]    = "CC_OP_CONST3",
+        [CC_OP_DYNAMIC]   = "CC_OP_DYNAMIC",
+        [CC_OP_STATIC]    = "CC_OP_STATIC",
+        [CC_OP_NZ]        = "CC_OP_NZ",
+        [CC_OP_LTGT_32]   = "CC_OP_LTGT_32",
+        [CC_OP_LTGT_64]   = "CC_OP_LTGT_64",
+        [CC_OP_LTUGTU_32] = "CC_OP_LTUGTU_32",
+        [CC_OP_LTUGTU_64] = "CC_OP_LTUGTU_64",
+        [CC_OP_LTGT0_32]  = "CC_OP_LTGT0_32",
+        [CC_OP_LTGT0_64]  = "CC_OP_LTGT0_64",
+        [CC_OP_ADD_64]    = "CC_OP_ADD_64",
+        [CC_OP_ADDU_64]   = "CC_OP_ADDU_64",
+        [CC_OP_ADDC_64]   = "CC_OP_ADDC_64",
+        [CC_OP_SUB_64]    = "CC_OP_SUB_64",
+        [CC_OP_SUBU_64]   = "CC_OP_SUBU_64",
+        [CC_OP_SUBB_64]   = "CC_OP_SUBB_64",
+        [CC_OP_ABS_64]    = "CC_OP_ABS_64",
+        [CC_OP_NABS_64]   = "CC_OP_NABS_64",
+        [CC_OP_ADD_32]    = "CC_OP_ADD_32",
+        [CC_OP_ADDU_32]   = "CC_OP_ADDU_32",
+        [CC_OP_ADDC_32]   = "CC_OP_ADDC_32",
+        [CC_OP_SUB_32]    = "CC_OP_SUB_32",
+        [CC_OP_SUBU_32]   = "CC_OP_SUBU_32",
+        [CC_OP_SUBB_32]   = "CC_OP_SUBB_32",
+        [CC_OP_ABS_32]    = "CC_OP_ABS_32",
+        [CC_OP_NABS_32]   = "CC_OP_NABS_32",
+        [CC_OP_COMP_32]   = "CC_OP_COMP_32",
+        [CC_OP_COMP_64]   = "CC_OP_COMP_64",
+        [CC_OP_TM_32]     = "CC_OP_TM_32",
+        [CC_OP_TM_64]     = "CC_OP_TM_64",
+        [CC_OP_NZ_F32]    = "CC_OP_NZ_F32",
+        [CC_OP_NZ_F64]    = "CC_OP_NZ_F64",
+        [CC_OP_NZ_F128]   = "CC_OP_NZ_F128",
+        [CC_OP_ICM]       = "CC_OP_ICM",
+        [CC_OP_SLA_32]    = "CC_OP_SLA_32",
+        [CC_OP_SLA_64]    = "CC_OP_SLA_64",
+        [CC_OP_FLOGR]     = "CC_OP_FLOGR",
+    };
+
+    return cc_names[cc_op];
+}

From 12e1e8f1aa3e79f408adadaaaff2148e56ba5068 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:45 +0200
Subject: [PATCH 32/44] target/s390x: move cpu_mmu_idx_to_asc() to
 excp_helper.c
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Only used in that file.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-11-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.h         | 14 --------------
 target/s390x/excp_helper.c | 14 ++++++++++++++
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 10208ecbbb..c71a4bf0c4 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -393,20 +393,6 @@ static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
     }
 }
 
-static inline uint64_t cpu_mmu_idx_to_asc(int mmu_idx)
-{
-    switch (mmu_idx) {
-    case MMU_PRIMARY_IDX:
-        return PSW_ASC_PRIMARY;
-    case MMU_SECONDARY_IDX:
-        return PSW_ASC_SECONDARY;
-    case MMU_HOME_IDX:
-        return PSW_ASC_HOME;
-    default:
-        abort();
-    }
-}
-
 static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,
                                         target_ulong *cs_base, uint32_t *flags)
 {
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index d1833772d5..db86259188 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -68,6 +68,20 @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr address,
 
 #else /* !CONFIG_USER_ONLY */
 
+static inline uint64_t cpu_mmu_idx_to_asc(int mmu_idx)
+{
+    switch (mmu_idx) {
+    case MMU_PRIMARY_IDX:
+        return PSW_ASC_PRIMARY;
+    case MMU_SECONDARY_IDX:
+        return PSW_ASC_SECONDARY;
+    case MMU_HOME_IDX:
+        return PSW_ASC_HOME;
+    default:
+        abort();
+    }
+}
+
 int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr orig_vaddr,
                               int rw, int mmu_idx)
 {

From c07a1009669ebf7ed91b131a857eed6ea9a08115 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:46 +0200
Subject: [PATCH 33/44] target/s390x: move psw_key_valid() to mem_helper.c
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Only used in that file.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-12-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.h        | 11 -----------
 target/s390x/mem_helper.c | 11 +++++++++++
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index c71a4bf0c4..8300cb219d 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -366,17 +366,6 @@ void s390x_cpu_debug_excp_handler(CPUState *cs);
 #define MMU_SECONDARY_IDX       1
 #define MMU_HOME_IDX            2
 
-static inline bool psw_key_valid(CPUS390XState *env, uint8_t psw_key)
-{
-    uint16_t pkm = env->cregs[3] >> 16;
-
-    if (env->psw.mask & PSW_MASK_PSTATE) {
-        /* PSW key has range 0..15, it is valid if the bit is 1 in the PKM */
-        return pkm & (0x80 >> psw_key);
-    }
-    return true;
-}
-
 static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
 {
     switch (env->psw.mask & PSW_MASK_ASC) {
diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c
index c71dce4b1e..b91c7402c4 100644
--- a/target/s390x/mem_helper.c
+++ b/target/s390x/mem_helper.c
@@ -56,6 +56,17 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
 #define HELPER_LOG(x...)
 #endif
 
+static inline bool psw_key_valid(CPUS390XState *env, uint8_t psw_key)
+{
+    uint16_t pkm = env->cregs[3] >> 16;
+
+    if (env->psw.mask & PSW_MASK_PSTATE) {
+        /* PSW key has range 0..15, it is valid if the bit is 1 in the PKM */
+        return pkm & (0x80 >> psw_key);
+    }
+    return true;
+}
+
 /* Reduce the length so that addr + len doesn't cross a page boundary.  */
 static inline uint32_t adj_len_to_page(uint32_t len, uint64_t addr)
 {

From 52c91545412e71a9fe08655947fff1b619003db6 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:47 +0200
Subject: [PATCH 34/44] target/s390x: move s390_do_cpu_reset() to diag.c
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Only used in that file. Also drop the comment, not really needed.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-13-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.h  | 7 -------
 target/s390x/diag.c | 7 +++++++
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 8300cb219d..9cdce6c6bd 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -490,13 +490,6 @@ static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
 /* Base/displacement are at the same locations. */
 #define decode_basedisp_rs decode_basedisp_s
 
-/* helper functions for run_on_cpu() */
-static inline void s390_do_cpu_reset(CPUState *cs, run_on_cpu_data arg)
-{
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
-
-    scc->cpu_reset(cs);
-}
 static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
 {
     cpu_reset(cs);
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
index 10ac845bcd..1847cdb0ca 100644
--- a/target/s390x/diag.c
+++ b/target/s390x/diag.c
@@ -39,6 +39,13 @@ static int modified_clear_reset(S390CPU *cpu)
     return 0;
 }
 
+static inline void s390_do_cpu_reset(CPUState *cs, run_on_cpu_data arg)
+{
+    S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
+
+    scc->cpu_reset(cs);
+}
+
 static int load_normal_reset(S390CPU *cpu)
 {
     S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);

From d9b8daf9963821ab9a5c812f989f27344ddc10fa Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:48 +0200
Subject: [PATCH 35/44] target/s390x: move get_per_in_range() to misc_helper.c
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Only used in that file.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-14-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.h         | 11 -----------
 target/s390x/misc_helper.c | 11 +++++++++++
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 9cdce6c6bd..55aab52f84 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -438,17 +438,6 @@ static inline uint8_t get_per_atmid(CPUS390XState *env)
            ((env->psw.mask & PSW_ASC_ACCREG)?    (1 << 2) : 0);
 }
 
-/* Check if an address is within the PER starting address and the PER
-   ending address.  The address range might loop.  */
-static inline bool get_per_in_range(CPUS390XState *env, uint64_t addr)
-{
-    if (env->cregs[10] <= env->cregs[11]) {
-        return env->cregs[10] <= addr && addr <= env->cregs[11];
-    } else {
-        return env->cregs[10] <= addr || addr <= env->cregs[11];
-    }
-}
-
 S390CPU *cpu_s390x_init(const char *cpu_model);
 S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp);
 S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp);
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 34d730ba73..d5497cbcba 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -455,6 +455,17 @@ void HELPER(per_check_exception)(CPUS390XState *env)
     }
 }
 
+/* Check if an address is within the PER starting address and the PER
+   ending address.  The address range might loop.  */
+static inline bool get_per_in_range(CPUS390XState *env, uint64_t addr)
+{
+    if (env->cregs[10] <= env->cregs[11]) {
+        return env->cregs[10] <= addr && addr <= env->cregs[11];
+    } else {
+        return env->cregs[10] <= addr || addr <= env->cregs[11];
+    }
+}
+
 void HELPER(per_branch)(CPUS390XState *env, uint64_t from, uint64_t to)
 {
     if ((env->cregs[9] & PER_CR9_EVENT_BRANCH)) {

From 4e58b838dd2028988fb932a96e3e907df8b5e59f Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:49 +0200
Subject: [PATCH 36/44] target/s390x: introduce internal.h
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

cpu.h should only contain what really has to be accessed outside of
target/s390x/. Add internal.h which can only be used inside target/s390x/.

Move everything that isn't fast enough to run away and restructure it
right away. We'll move all kvm_* stuff later.

Minor style fixes to avoid checkpatch warning to:
- struct Lowcore: "{" goes into same line as typedef
- struct LowCore: add spaces around "-" in array length calculations
- time2tod() and tod2time(): move "{" to separate line
- get_per_atmid(): add space between ")" and "?". Move cases by one char.
- get_per_atmid(): drop extra paremthesis around (1 << 6)

Change license of new file to GPL2+ and keep copyright notice.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-15-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/arch_dump.c   |   1 +
 target/s390x/cc_helper.c   |   1 +
 target/s390x/cpu.c         |   1 +
 target/s390x/cpu.h         | 343 --------------------------------
 target/s390x/cpu_models.c  |   1 +
 target/s390x/diag.c        |   1 +
 target/s390x/excp_helper.c |   1 +
 target/s390x/fpu_helper.c  |   1 +
 target/s390x/gdbstub.c     |   1 +
 target/s390x/helper.c      |   1 +
 target/s390x/int_helper.c  |   1 +
 target/s390x/internal.h    | 391 +++++++++++++++++++++++++++++++++++++
 target/s390x/interrupt.c   |   1 +
 target/s390x/ioinst.c      |   1 +
 target/s390x/kvm.c         |   1 +
 target/s390x/machine.c     |   1 +
 target/s390x/mem_helper.c  |   1 +
 target/s390x/misc_helper.c |   1 +
 target/s390x/mmu_helper.c  |   1 +
 target/s390x/translate.c   |   1 +
 20 files changed, 409 insertions(+), 343 deletions(-)
 create mode 100644 target/s390x/internal.h

diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
index 399030d118..9b0bf92698 100644
--- a/target/s390x/arch_dump.c
+++ b/target/s390x/arch_dump.c
@@ -13,6 +13,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "elf.h"
 #include "exec/cpu-all.h"
 #include "sysemu/dump.h"
diff --git a/target/s390x/cc_helper.c b/target/s390x/cc_helper.c
index 1cf855133e..f008897e84 100644
--- a/target/s390x/cc_helper.c
+++ b/target/s390x/cc_helper.c
@@ -20,6 +20,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/exec-all.h"
 #include "exec/helper-proto.h"
 #include "qemu/host-utils.h"
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 489bc25334..dadd383d90 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -26,6 +26,7 @@
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "cpu.h"
+#include "internal.h"
 #include "qemu-common.h"
 #include "qemu/cutils.h"
 #include "qemu/timer.h"
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 55aab52f84..af941f8e51 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -213,20 +213,6 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)
 extern const struct VMStateDescription vmstate_s390_cpu;
 #endif
 
-void s390_cpu_do_interrupt(CPUState *cpu);
-bool s390_cpu_exec_interrupt(CPUState *cpu, int int_req);
-void s390_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
-                         int flags);
-int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
-                              int cpuid, void *opaque);
-
-hwaddr s390_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
-hwaddr s390_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
-int s390_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
-int s390_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
-void s390_cpu_gdb_init(CPUState *cs);
-void s390x_cpu_debug_excp_handler(CPUState *cs);
-
 #include "sysemu/kvm.h"
 
 /* distinguish between 24 bit and 31 bit addressing */
@@ -390,26 +376,6 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,
     *flags = (env->psw.mask >> FLAG_MASK_PSW_SHIFT) & FLAG_MASK_PSW;
 }
 
-#define MAX_ILEN 6
-
-/* While the PoO talks about ILC (a number between 1-3) what is actually
-   stored in LowCore is shifted left one bit (an even between 2-6).  As
-   this is the actual length of the insn and therefore more useful, that
-   is what we want to pass around and manipulate.  To make sure that we
-   have applied this distinction universally, rename the "ILC" to "ILEN".  */
-static inline int get_ilen(uint8_t opc)
-{
-    switch (opc >> 6) {
-    case 0:
-        return 2;
-    case 1:
-    case 2:
-        return 4;
-    default:
-        return 6;
-    }
-}
-
 /* PER bits from control register 9 */
 #define PER_CR9_EVENT_BRANCH           0x80000000
 #define PER_CR9_EVENT_IFETCH           0x40000000
@@ -426,66 +392,17 @@ static inline int get_ilen(uint8_t opc)
 #define PER_CODE_EVENT_STORE_REAL      0x0800
 #define PER_CODE_EVENT_NULLIFICATION   0x0100
 
-/* Compute the ATMID field that is stored in the per_perc_atmid lowcore
-   entry when a PER exception is triggered.  */
-static inline uint8_t get_per_atmid(CPUS390XState *env)
-{
-    return ((env->psw.mask & PSW_MASK_64) ?      (1 << 7) : 0) |
-           (                                     (1 << 6)    ) |
-           ((env->psw.mask & PSW_MASK_32) ?      (1 << 5) : 0) |
-           ((env->psw.mask & PSW_MASK_DAT)?      (1 << 4) : 0) |
-           ((env->psw.mask & PSW_ASC_SECONDARY)? (1 << 3) : 0) |
-           ((env->psw.mask & PSW_ASC_ACCREG)?    (1 << 2) : 0);
-}
-
 S390CPU *cpu_s390x_init(const char *cpu_model);
 S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp);
-S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp);
-void s390x_translate_init(void);
 
 /* you can call this signal handler from your SIGBUS and SIGSEGV
    signal handlers to inform the virtual CPU of exceptions. non zero
    is returned if the signal was handled by the virtual CPU.  */
 int cpu_s390x_signal_handler(int host_signum, void *pinfo,
                            void *puc);
-int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
-                              int mmu_idx);
 
 
 #ifndef CONFIG_USER_ONLY
-void do_restart_interrupt(CPUS390XState *env);
-void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
-                                   MMUAccessType access_type,
-                                   int mmu_idx, uintptr_t retaddr);
-
-static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
-                                       uint8_t *ar)
-{
-    hwaddr addr = 0;
-    uint8_t reg;
-
-    reg = ipb >> 28;
-    if (reg > 0) {
-        addr = env->regs[reg];
-    }
-    addr += (ipb >> 16) & 0xfff;
-    if (ar) {
-        *ar = reg;
-    }
-
-    return addr;
-}
-
-/* Base/displacement are at the same locations. */
-#define decode_basedisp_rs decode_basedisp_s
-
-static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
-{
-    cpu_reset(cs);
-}
-
-void s390x_tod_timer(void *opaque);
-void s390x_cpu_timer(void *opaque);
 
 int s390_virtio_hypercall(CPUS390XState *env);
 
@@ -543,47 +460,12 @@ static inline int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
 }
 
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
-unsigned int s390_cpu_halt(S390CPU *cpu);
-void s390_cpu_unhalt(S390CPU *cpu);
 unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu);
-static inline uint8_t s390_cpu_get_state(S390CPU *cpu)
-{
-    return cpu->env.cpu_state;
-}
-
-void cpu_inject_ext(S390CPU *cpu, uint32_t code, uint32_t param,
-                    uint64_t param64);
-
-/* ioinst.c */
-void ioinst_handle_xsch(S390CPU *cpu, uint64_t reg1);
-void ioinst_handle_csch(S390CPU *cpu, uint64_t reg1);
-void ioinst_handle_hsch(S390CPU *cpu, uint64_t reg1);
-void ioinst_handle_msch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
-void ioinst_handle_ssch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
-void ioinst_handle_stcrw(S390CPU *cpu, uint32_t ipb);
-void ioinst_handle_stsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
-int ioinst_handle_tsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
-void ioinst_handle_chsc(S390CPU *cpu, uint32_t ipb);
-int ioinst_handle_tpi(S390CPU *cpu, uint32_t ipb);
-void ioinst_handle_schm(S390CPU *cpu, uint64_t reg1, uint64_t reg2,
-                        uint32_t ipb);
-void ioinst_handle_rsch(S390CPU *cpu, uint64_t reg1);
-void ioinst_handle_rchp(S390CPU *cpu, uint64_t reg1);
-void ioinst_handle_sal(S390CPU *cpu, uint64_t reg1);
 
 /* service interrupts are floating therefore we must not pass an cpustate */
 void s390_sclp_extint(uint32_t parm);
 
 #else
-static inline unsigned int s390_cpu_halt(S390CPU *cpu)
-{
-    return 0;
-}
-
-static inline void s390_cpu_unhalt(S390CPU *cpu)
-{
-}
-
 static inline unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
 {
     return 0;
@@ -597,10 +479,6 @@ extern void subsystem_reset(void);
 
 void s390_cpu_list(FILE *f, fprintf_function cpu_fprintf);
 #define cpu_list s390_cpu_list
-void s390_cpu_model_register_props(Object *obj);
-void s390_cpu_model_class_register_props(ObjectClass *oc);
-void s390_realize_cpu_model(CPUState *cs, Error **errp);
-ObjectClass *s390_cpu_class_by_name(const char *name);
 const char *s390_default_cpu_model_name(void);
 
 #define EXCP_EXT 1 /* external interrupt */
@@ -638,69 +516,6 @@ const char *s390_default_cpu_model_name(void);
 /* Total Core Registers. */
 #define S390_NUM_CORE_REGS 18
 
-/* CC optimization */
-
-/* Instead of computing the condition codes after each x86 instruction,
- * QEMU just stores the result (called CC_DST), the type of operation
- * (called CC_OP) and whatever operands are needed (CC_SRC and possibly
- * CC_VR). When the condition codes are needed, the condition codes can
- * be calculated using this information. Condition codes are not generated
- * if they are only needed for conditional branches.
- */
-enum cc_op {
-    CC_OP_CONST0 = 0,           /* CC is 0 */
-    CC_OP_CONST1,               /* CC is 1 */
-    CC_OP_CONST2,               /* CC is 2 */
-    CC_OP_CONST3,               /* CC is 3 */
-
-    CC_OP_DYNAMIC,              /* CC calculation defined by env->cc_op */
-    CC_OP_STATIC,               /* CC value is env->cc_op */
-
-    CC_OP_NZ,                   /* env->cc_dst != 0 */
-    CC_OP_LTGT_32,              /* signed less/greater than (32bit) */
-    CC_OP_LTGT_64,              /* signed less/greater than (64bit) */
-    CC_OP_LTUGTU_32,            /* unsigned less/greater than (32bit) */
-    CC_OP_LTUGTU_64,            /* unsigned less/greater than (64bit) */
-    CC_OP_LTGT0_32,             /* signed less/greater than 0 (32bit) */
-    CC_OP_LTGT0_64,             /* signed less/greater than 0 (64bit) */
-
-    CC_OP_ADD_64,               /* overflow on add (64bit) */
-    CC_OP_ADDU_64,              /* overflow on unsigned add (64bit) */
-    CC_OP_ADDC_64,              /* overflow on unsigned add-carry (64bit) */
-    CC_OP_SUB_64,               /* overflow on subtraction (64bit) */
-    CC_OP_SUBU_64,              /* overflow on unsigned subtraction (64bit) */
-    CC_OP_SUBB_64,              /* overflow on unsigned sub-borrow (64bit) */
-    CC_OP_ABS_64,               /* sign eval on abs (64bit) */
-    CC_OP_NABS_64,              /* sign eval on nabs (64bit) */
-
-    CC_OP_ADD_32,               /* overflow on add (32bit) */
-    CC_OP_ADDU_32,              /* overflow on unsigned add (32bit) */
-    CC_OP_ADDC_32,              /* overflow on unsigned add-carry (32bit) */
-    CC_OP_SUB_32,               /* overflow on subtraction (32bit) */
-    CC_OP_SUBU_32,              /* overflow on unsigned subtraction (32bit) */
-    CC_OP_SUBB_32,              /* overflow on unsigned sub-borrow (32bit) */
-    CC_OP_ABS_32,               /* sign eval on abs (64bit) */
-    CC_OP_NABS_32,              /* sign eval on nabs (64bit) */
-
-    CC_OP_COMP_32,              /* complement */
-    CC_OP_COMP_64,              /* complement */
-
-    CC_OP_TM_32,                /* test under mask (32bit) */
-    CC_OP_TM_64,                /* test under mask (64bit) */
-
-    CC_OP_NZ_F32,               /* FP dst != 0 (32bit) */
-    CC_OP_NZ_F64,               /* FP dst != 0 (64bit) */
-    CC_OP_NZ_F128,              /* FP dst != 0 (128bit) */
-
-    CC_OP_ICM,                  /* insert characters under mask */
-    CC_OP_SLA_32,               /* Calculate shift left signed (32bit) */
-    CC_OP_SLA_64,               /* Calculate shift left signed (64bit) */
-    CC_OP_FLOGR,                /* find leftmost one */
-    CC_OP_MAX
-};
-
-const char *cc_name(enum cc_op cc_op);
-
 static inline void setcc(S390CPU *cpu, uint64_t cc)
 {
     CPUS390XState *env = &cpu->env;
@@ -710,130 +525,6 @@ static inline void setcc(S390CPU *cpu, uint64_t cc)
     env->cc_op = cc;
 }
 
-#ifndef CONFIG_USER_ONLY
-
-typedef struct LowCore
-{
-    /* prefix area: defined by architecture */
-    uint32_t        ccw1[2];                  /* 0x000 */
-    uint32_t        ccw2[4];                  /* 0x008 */
-    uint8_t         pad1[0x80-0x18];          /* 0x018 */
-    uint32_t        ext_params;               /* 0x080 */
-    uint16_t        cpu_addr;                 /* 0x084 */
-    uint16_t        ext_int_code;             /* 0x086 */
-    uint16_t        svc_ilen;                 /* 0x088 */
-    uint16_t        svc_code;                 /* 0x08a */
-    uint16_t        pgm_ilen;                 /* 0x08c */
-    uint16_t        pgm_code;                 /* 0x08e */
-    uint32_t        data_exc_code;            /* 0x090 */
-    uint16_t        mon_class_num;            /* 0x094 */
-    uint16_t        per_perc_atmid;           /* 0x096 */
-    uint64_t        per_address;              /* 0x098 */
-    uint8_t         exc_access_id;            /* 0x0a0 */
-    uint8_t         per_access_id;            /* 0x0a1 */
-    uint8_t         op_access_id;             /* 0x0a2 */
-    uint8_t         ar_access_id;             /* 0x0a3 */
-    uint8_t         pad2[0xA8-0xA4];          /* 0x0a4 */
-    uint64_t        trans_exc_code;           /* 0x0a8 */
-    uint64_t        monitor_code;             /* 0x0b0 */
-    uint16_t        subchannel_id;            /* 0x0b8 */
-    uint16_t        subchannel_nr;            /* 0x0ba */
-    uint32_t        io_int_parm;              /* 0x0bc */
-    uint32_t        io_int_word;              /* 0x0c0 */
-    uint8_t         pad3[0xc8-0xc4];          /* 0x0c4 */
-    uint32_t        stfl_fac_list;            /* 0x0c8 */
-    uint8_t         pad4[0xe8-0xcc];          /* 0x0cc */
-    uint32_t        mcck_interruption_code[2]; /* 0x0e8 */
-    uint8_t         pad5[0xf4-0xf0];          /* 0x0f0 */
-    uint32_t        external_damage_code;     /* 0x0f4 */
-    uint64_t        failing_storage_address;  /* 0x0f8 */
-    uint8_t         pad6[0x110-0x100];        /* 0x100 */
-    uint64_t        per_breaking_event_addr;  /* 0x110 */
-    uint8_t         pad7[0x120-0x118];        /* 0x118 */
-    PSW             restart_old_psw;          /* 0x120 */
-    PSW             external_old_psw;         /* 0x130 */
-    PSW             svc_old_psw;              /* 0x140 */
-    PSW             program_old_psw;          /* 0x150 */
-    PSW             mcck_old_psw;             /* 0x160 */
-    PSW             io_old_psw;               /* 0x170 */
-    uint8_t         pad8[0x1a0-0x180];        /* 0x180 */
-    PSW             restart_new_psw;          /* 0x1a0 */
-    PSW             external_new_psw;         /* 0x1b0 */
-    PSW             svc_new_psw;              /* 0x1c0 */
-    PSW             program_new_psw;          /* 0x1d0 */
-    PSW             mcck_new_psw;             /* 0x1e0 */
-    PSW             io_new_psw;               /* 0x1f0 */
-    PSW             return_psw;               /* 0x200 */
-    uint8_t         irb[64];                  /* 0x210 */
-    uint64_t        sync_enter_timer;         /* 0x250 */
-    uint64_t        async_enter_timer;        /* 0x258 */
-    uint64_t        exit_timer;               /* 0x260 */
-    uint64_t        last_update_timer;        /* 0x268 */
-    uint64_t        user_timer;               /* 0x270 */
-    uint64_t        system_timer;             /* 0x278 */
-    uint64_t        last_update_clock;        /* 0x280 */
-    uint64_t        steal_clock;              /* 0x288 */
-    PSW             return_mcck_psw;          /* 0x290 */
-    uint8_t         pad9[0xc00-0x2a0];        /* 0x2a0 */
-    /* System info area */
-    uint64_t        save_area[16];            /* 0xc00 */
-    uint8_t         pad10[0xd40-0xc80];       /* 0xc80 */
-    uint64_t        kernel_stack;             /* 0xd40 */
-    uint64_t        thread_info;              /* 0xd48 */
-    uint64_t        async_stack;              /* 0xd50 */
-    uint64_t        kernel_asce;              /* 0xd58 */
-    uint64_t        user_asce;                /* 0xd60 */
-    uint64_t        panic_stack;              /* 0xd68 */
-    uint64_t        user_exec_asce;           /* 0xd70 */
-    uint8_t         pad11[0xdc0-0xd78];       /* 0xd78 */
-
-    /* SMP info area: defined by DJB */
-    uint64_t        clock_comparator;         /* 0xdc0 */
-    uint64_t        ext_call_fast;            /* 0xdc8 */
-    uint64_t        percpu_offset;            /* 0xdd0 */
-    uint64_t        current_task;             /* 0xdd8 */
-    uint32_t        softirq_pending;          /* 0xde0 */
-    uint32_t        pad_0x0de4;               /* 0xde4 */
-    uint64_t        int_clock;                /* 0xde8 */
-    uint8_t         pad12[0xe00-0xdf0];       /* 0xdf0 */
-
-    /* 0xe00 is used as indicator for dump tools */
-    /* whether the kernel died with panic() or not */
-    uint32_t        panic_magic;              /* 0xe00 */
-
-    uint8_t         pad13[0x11b8-0xe04];      /* 0xe04 */
-
-    /* 64 bit extparam used for pfault, diag 250 etc  */
-    uint64_t        ext_params2;               /* 0x11B8 */
-
-    uint8_t         pad14[0x1200-0x11C0];      /* 0x11C0 */
-
-    /* System info area */
-
-    uint64_t        floating_pt_save_area[16]; /* 0x1200 */
-    uint64_t        gpregs_save_area[16];      /* 0x1280 */
-    uint32_t        st_status_fixed_logout[4]; /* 0x1300 */
-    uint8_t         pad15[0x1318-0x1310];      /* 0x1310 */
-    uint32_t        prefixreg_save_area;       /* 0x1318 */
-    uint32_t        fpt_creg_save_area;        /* 0x131c */
-    uint8_t         pad16[0x1324-0x1320];      /* 0x1320 */
-    uint32_t        tod_progreg_save_area;     /* 0x1324 */
-    uint32_t        cpu_timer_save_area[2];    /* 0x1328 */
-    uint32_t        clock_comp_save_area[2];   /* 0x1330 */
-    uint8_t         pad17[0x1340-0x1338];      /* 0x1338 */
-    uint32_t        access_regs_save_area[16]; /* 0x1340 */
-    uint64_t        cregs_save_area[16];       /* 0x1380 */
-
-    /* align to the top of the prefix area */
-
-    uint8_t         pad18[0x2000-0x1400];      /* 0x1400 */
-} QEMU_PACKED LowCore;
-
-LowCore *cpu_map_lowcore(CPUS390XState *env);
-void cpu_unmap_lowcore(LowCore *lowcore);
-
-#endif
-
 /* STSI */
 #define STSI_LEVEL_MASK         0x00000000f0000000ULL
 #define STSI_LEVEL_CURRENT      0x0000000000000000ULL
@@ -1009,15 +700,7 @@ struct sysib_322 {
 /* SIGP order code mask corresponding to bit positions 56-63 */
 #define SIGP_ORDER_MASK 0x000000ff
 
-void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr);
-uint64_t get_psw_mask(CPUS390XState *env);
-target_ulong mmu_real2abs(CPUS390XState *env, target_ulong raddr);
-int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
-                  target_ulong *raddr, int *flags, bool exc);
 int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
-uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst,
-                 uint64_t vr);
-void s390_cpu_recompute_watchpoints(CPUState *cs);
 
 int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
                          int len, bool is_write);
@@ -1029,39 +712,13 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
 #define s390_cpu_virt_mem_check_write(cpu, laddr, ar, len)   \
         s390_cpu_virt_mem_rw(cpu, laddr, ar, NULL, len, true)
 
-/* The value of the TOD clock for 1.1.1970. */
-#define TOD_UNIX_EPOCH 0x7d91048bca000000ULL
-
-/* Converts ns to s390's clock format */
-static inline uint64_t time2tod(uint64_t ns) {
-    return (ns << 9) / 125;
-}
-
-/* Converts s390's clock format to ns */
-static inline uint64_t tod2time(uint64_t t) {
-    return (t * 125) >> 9;
-}
-
 /* from s390-virtio-ccw */
 #define MEM_SECTION_SIZE             0x10000000UL
 #define MAX_AVAIL_SLOTS              32
 
-/* fpu_helper.c */
-uint32_t set_cc_nz_f32(float32 v);
-uint32_t set_cc_nz_f64(float64 v);
-uint32_t set_cc_nz_f128(float128 v);
-
-/* misc_helper.c */
-#ifndef CONFIG_USER_ONLY
-int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
-void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3);
-#endif
 /* automatically detect the instruction length */
 #define ILEN_AUTO                   0xff
 void program_interrupt(CPUS390XState *env, uint32_t code, int ilen);
-void trigger_pgm_exception(CPUS390XState *env, uint32_t code, uint32_t ilen);
-void QEMU_NORETURN runtime_exception(CPUS390XState *env, int excp,
-                                     uintptr_t retaddr);
 
 #ifdef CONFIG_KVM
 void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code);
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 915f067991..2ce9157197 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -12,6 +12,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "gen-features.h"
 #include "qapi/error.h"
 #include "qapi/visitor.h"
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
index 1847cdb0ca..e6b5e6de37 100644
--- a/target/s390x/diag.c
+++ b/target/s390x/diag.c
@@ -14,6 +14,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/address-spaces.h"
 #include "exec/exec-all.h"
 #include "hw/watchdog/wdt_diag288.h"
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index db86259188..361f970db3 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -21,6 +21,7 @@
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "cpu.h"
+#include "internal.h"
 #include "qemu/timer.h"
 #include "exec/exec-all.h"
 #include "exec/cpu_ldst.h"
diff --git a/target/s390x/fpu_helper.c b/target/s390x/fpu_helper.c
index 26f124fe96..ffbeb3b2df 100644
--- a/target/s390x/fpu_helper.c
+++ b/target/s390x/fpu_helper.c
@@ -20,6 +20,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/exec-all.h"
 #include "exec/cpu_ldst.h"
 #include "exec/helper-proto.h"
diff --git a/target/s390x/gdbstub.c b/target/s390x/gdbstub.c
index a7efafee9f..b8c81dadcf 100644
--- a/target/s390x/gdbstub.c
+++ b/target/s390x/gdbstub.c
@@ -20,6 +20,7 @@
 #include "qemu/osdep.h"
 #include "qemu-common.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/exec-all.h"
 #include "exec/gdbstub.h"
 #include "qemu/bitops.h"
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index e31d3e51df..3adb9de122 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -21,6 +21,7 @@
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/gdbstub.h"
 #include "qemu/timer.h"
 #include "exec/exec-all.h"
diff --git a/target/s390x/int_helper.c b/target/s390x/int_helper.c
index f26f36a904..0076bea047 100644
--- a/target/s390x/int_helper.c
+++ b/target/s390x/int_helper.c
@@ -20,6 +20,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/exec-all.h"
 #include "qemu/host-utils.h"
 #include "exec/helper-proto.h"
diff --git a/target/s390x/internal.h b/target/s390x/internal.h
new file mode 100644
index 0000000000..b4d3583b24
--- /dev/null
+++ b/target/s390x/internal.h
@@ -0,0 +1,391 @@
+/*
+ * s390x internal definitions and helpers
+ *
+ * Copyright (c) 2009 Ulrich Hecht
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef S390X_INTERNAL_H
+#define S390X_INTERNAL_H
+
+#include "cpu.h"
+
+#ifndef CONFIG_USER_ONLY
+typedef struct LowCore {
+    /* prefix area: defined by architecture */
+    uint32_t        ccw1[2];                  /* 0x000 */
+    uint32_t        ccw2[4];                  /* 0x008 */
+    uint8_t         pad1[0x80 - 0x18];        /* 0x018 */
+    uint32_t        ext_params;               /* 0x080 */
+    uint16_t        cpu_addr;                 /* 0x084 */
+    uint16_t        ext_int_code;             /* 0x086 */
+    uint16_t        svc_ilen;                 /* 0x088 */
+    uint16_t        svc_code;                 /* 0x08a */
+    uint16_t        pgm_ilen;                 /* 0x08c */
+    uint16_t        pgm_code;                 /* 0x08e */
+    uint32_t        data_exc_code;            /* 0x090 */
+    uint16_t        mon_class_num;            /* 0x094 */
+    uint16_t        per_perc_atmid;           /* 0x096 */
+    uint64_t        per_address;              /* 0x098 */
+    uint8_t         exc_access_id;            /* 0x0a0 */
+    uint8_t         per_access_id;            /* 0x0a1 */
+    uint8_t         op_access_id;             /* 0x0a2 */
+    uint8_t         ar_access_id;             /* 0x0a3 */
+    uint8_t         pad2[0xA8 - 0xA4];        /* 0x0a4 */
+    uint64_t        trans_exc_code;           /* 0x0a8 */
+    uint64_t        monitor_code;             /* 0x0b0 */
+    uint16_t        subchannel_id;            /* 0x0b8 */
+    uint16_t        subchannel_nr;            /* 0x0ba */
+    uint32_t        io_int_parm;              /* 0x0bc */
+    uint32_t        io_int_word;              /* 0x0c0 */
+    uint8_t         pad3[0xc8 - 0xc4];        /* 0x0c4 */
+    uint32_t        stfl_fac_list;            /* 0x0c8 */
+    uint8_t         pad4[0xe8 - 0xcc];        /* 0x0cc */
+    uint32_t        mcck_interruption_code[2]; /* 0x0e8 */
+    uint8_t         pad5[0xf4 - 0xf0];        /* 0x0f0 */
+    uint32_t        external_damage_code;     /* 0x0f4 */
+    uint64_t        failing_storage_address;  /* 0x0f8 */
+    uint8_t         pad6[0x110 - 0x100];      /* 0x100 */
+    uint64_t        per_breaking_event_addr;  /* 0x110 */
+    uint8_t         pad7[0x120 - 0x118];      /* 0x118 */
+    PSW             restart_old_psw;          /* 0x120 */
+    PSW             external_old_psw;         /* 0x130 */
+    PSW             svc_old_psw;              /* 0x140 */
+    PSW             program_old_psw;          /* 0x150 */
+    PSW             mcck_old_psw;             /* 0x160 */
+    PSW             io_old_psw;               /* 0x170 */
+    uint8_t         pad8[0x1a0 - 0x180];      /* 0x180 */
+    PSW             restart_new_psw;          /* 0x1a0 */
+    PSW             external_new_psw;         /* 0x1b0 */
+    PSW             svc_new_psw;              /* 0x1c0 */
+    PSW             program_new_psw;          /* 0x1d0 */
+    PSW             mcck_new_psw;             /* 0x1e0 */
+    PSW             io_new_psw;               /* 0x1f0 */
+    PSW             return_psw;               /* 0x200 */
+    uint8_t         irb[64];                  /* 0x210 */
+    uint64_t        sync_enter_timer;         /* 0x250 */
+    uint64_t        async_enter_timer;        /* 0x258 */
+    uint64_t        exit_timer;               /* 0x260 */
+    uint64_t        last_update_timer;        /* 0x268 */
+    uint64_t        user_timer;               /* 0x270 */
+    uint64_t        system_timer;             /* 0x278 */
+    uint64_t        last_update_clock;        /* 0x280 */
+    uint64_t        steal_clock;              /* 0x288 */
+    PSW             return_mcck_psw;          /* 0x290 */
+    uint8_t         pad9[0xc00 - 0x2a0];      /* 0x2a0 */
+    /* System info area */
+    uint64_t        save_area[16];            /* 0xc00 */
+    uint8_t         pad10[0xd40 - 0xc80];     /* 0xc80 */
+    uint64_t        kernel_stack;             /* 0xd40 */
+    uint64_t        thread_info;              /* 0xd48 */
+    uint64_t        async_stack;              /* 0xd50 */
+    uint64_t        kernel_asce;              /* 0xd58 */
+    uint64_t        user_asce;                /* 0xd60 */
+    uint64_t        panic_stack;              /* 0xd68 */
+    uint64_t        user_exec_asce;           /* 0xd70 */
+    uint8_t         pad11[0xdc0 - 0xd78];     /* 0xd78 */
+
+    /* SMP info area: defined by DJB */
+    uint64_t        clock_comparator;         /* 0xdc0 */
+    uint64_t        ext_call_fast;            /* 0xdc8 */
+    uint64_t        percpu_offset;            /* 0xdd0 */
+    uint64_t        current_task;             /* 0xdd8 */
+    uint32_t        softirq_pending;          /* 0xde0 */
+    uint32_t        pad_0x0de4;               /* 0xde4 */
+    uint64_t        int_clock;                /* 0xde8 */
+    uint8_t         pad12[0xe00 - 0xdf0];     /* 0xdf0 */
+
+    /* 0xe00 is used as indicator for dump tools */
+    /* whether the kernel died with panic() or not */
+    uint32_t        panic_magic;              /* 0xe00 */
+
+    uint8_t         pad13[0x11b8 - 0xe04];    /* 0xe04 */
+
+    /* 64 bit extparam used for pfault, diag 250 etc  */
+    uint64_t        ext_params2;               /* 0x11B8 */
+
+    uint8_t         pad14[0x1200 - 0x11C0];    /* 0x11C0 */
+
+    /* System info area */
+
+    uint64_t        floating_pt_save_area[16]; /* 0x1200 */
+    uint64_t        gpregs_save_area[16];      /* 0x1280 */
+    uint32_t        st_status_fixed_logout[4]; /* 0x1300 */
+    uint8_t         pad15[0x1318 - 0x1310];    /* 0x1310 */
+    uint32_t        prefixreg_save_area;       /* 0x1318 */
+    uint32_t        fpt_creg_save_area;        /* 0x131c */
+    uint8_t         pad16[0x1324 - 0x1320];    /* 0x1320 */
+    uint32_t        tod_progreg_save_area;     /* 0x1324 */
+    uint32_t        cpu_timer_save_area[2];    /* 0x1328 */
+    uint32_t        clock_comp_save_area[2];   /* 0x1330 */
+    uint8_t         pad17[0x1340 - 0x1338];    /* 0x1338 */
+    uint32_t        access_regs_save_area[16]; /* 0x1340 */
+    uint64_t        cregs_save_area[16];       /* 0x1380 */
+
+    /* align to the top of the prefix area */
+
+    uint8_t         pad18[0x2000 - 0x1400];    /* 0x1400 */
+} QEMU_PACKED LowCore;
+#endif /* CONFIG_USER_ONLY */
+
+#define MAX_ILEN 6
+
+/* While the PoO talks about ILC (a number between 1-3) what is actually
+   stored in LowCore is shifted left one bit (an even between 2-6).  As
+   this is the actual length of the insn and therefore more useful, that
+   is what we want to pass around and manipulate.  To make sure that we
+   have applied this distinction universally, rename the "ILC" to "ILEN".  */
+static inline int get_ilen(uint8_t opc)
+{
+    switch (opc >> 6) {
+    case 0:
+        return 2;
+    case 1:
+    case 2:
+        return 4;
+    default:
+        return 6;
+    }
+}
+
+/* Compute the ATMID field that is stored in the per_perc_atmid lowcore
+   entry when a PER exception is triggered.  */
+static inline uint8_t get_per_atmid(CPUS390XState *env)
+{
+    return ((env->psw.mask & PSW_MASK_64) ?       (1 << 7) : 0) |
+                                                  (1 << 6)      |
+           ((env->psw.mask & PSW_MASK_32) ?       (1 << 5) : 0) |
+           ((env->psw.mask & PSW_MASK_DAT) ?      (1 << 4) : 0) |
+           ((env->psw.mask & PSW_ASC_SECONDARY) ? (1 << 3) : 0) |
+           ((env->psw.mask & PSW_ASC_ACCREG) ?    (1 << 2) : 0);
+}
+
+/* CC optimization */
+
+/* Instead of computing the condition codes after each x86 instruction,
+ * QEMU just stores the result (called CC_DST), the type of operation
+ * (called CC_OP) and whatever operands are needed (CC_SRC and possibly
+ * CC_VR). When the condition codes are needed, the condition codes can
+ * be calculated using this information. Condition codes are not generated
+ * if they are only needed for conditional branches.
+ */
+enum cc_op {
+    CC_OP_CONST0 = 0,           /* CC is 0 */
+    CC_OP_CONST1,               /* CC is 1 */
+    CC_OP_CONST2,               /* CC is 2 */
+    CC_OP_CONST3,               /* CC is 3 */
+
+    CC_OP_DYNAMIC,              /* CC calculation defined by env->cc_op */
+    CC_OP_STATIC,               /* CC value is env->cc_op */
+
+    CC_OP_NZ,                   /* env->cc_dst != 0 */
+    CC_OP_LTGT_32,              /* signed less/greater than (32bit) */
+    CC_OP_LTGT_64,              /* signed less/greater than (64bit) */
+    CC_OP_LTUGTU_32,            /* unsigned less/greater than (32bit) */
+    CC_OP_LTUGTU_64,            /* unsigned less/greater than (64bit) */
+    CC_OP_LTGT0_32,             /* signed less/greater than 0 (32bit) */
+    CC_OP_LTGT0_64,             /* signed less/greater than 0 (64bit) */
+
+    CC_OP_ADD_64,               /* overflow on add (64bit) */
+    CC_OP_ADDU_64,              /* overflow on unsigned add (64bit) */
+    CC_OP_ADDC_64,              /* overflow on unsigned add-carry (64bit) */
+    CC_OP_SUB_64,               /* overflow on subtraction (64bit) */
+    CC_OP_SUBU_64,              /* overflow on unsigned subtraction (64bit) */
+    CC_OP_SUBB_64,              /* overflow on unsigned sub-borrow (64bit) */
+    CC_OP_ABS_64,               /* sign eval on abs (64bit) */
+    CC_OP_NABS_64,              /* sign eval on nabs (64bit) */
+
+    CC_OP_ADD_32,               /* overflow on add (32bit) */
+    CC_OP_ADDU_32,              /* overflow on unsigned add (32bit) */
+    CC_OP_ADDC_32,              /* overflow on unsigned add-carry (32bit) */
+    CC_OP_SUB_32,               /* overflow on subtraction (32bit) */
+    CC_OP_SUBU_32,              /* overflow on unsigned subtraction (32bit) */
+    CC_OP_SUBB_32,              /* overflow on unsigned sub-borrow (32bit) */
+    CC_OP_ABS_32,               /* sign eval on abs (64bit) */
+    CC_OP_NABS_32,              /* sign eval on nabs (64bit) */
+
+    CC_OP_COMP_32,              /* complement */
+    CC_OP_COMP_64,              /* complement */
+
+    CC_OP_TM_32,                /* test under mask (32bit) */
+    CC_OP_TM_64,                /* test under mask (64bit) */
+
+    CC_OP_NZ_F32,               /* FP dst != 0 (32bit) */
+    CC_OP_NZ_F64,               /* FP dst != 0 (64bit) */
+    CC_OP_NZ_F128,              /* FP dst != 0 (128bit) */
+
+    CC_OP_ICM,                  /* insert characters under mask */
+    CC_OP_SLA_32,               /* Calculate shift left signed (32bit) */
+    CC_OP_SLA_64,               /* Calculate shift left signed (64bit) */
+    CC_OP_FLOGR,                /* find leftmost one */
+    CC_OP_MAX
+};
+
+/* The value of the TOD clock for 1.1.1970. */
+#define TOD_UNIX_EPOCH 0x7d91048bca000000ULL
+
+/* Converts ns to s390's clock format */
+static inline uint64_t time2tod(uint64_t ns)
+{
+    return (ns << 9) / 125;
+}
+
+/* Converts s390's clock format to ns */
+static inline uint64_t tod2time(uint64_t t)
+{
+    return (t * 125) >> 9;
+}
+
+static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
+                                       uint8_t *ar)
+{
+    hwaddr addr = 0;
+    uint8_t reg;
+
+    reg = ipb >> 28;
+    if (reg > 0) {
+        addr = env->regs[reg];
+    }
+    addr += (ipb >> 16) & 0xfff;
+    if (ar) {
+        *ar = reg;
+    }
+
+    return addr;
+}
+
+/* Base/displacement are at the same locations. */
+#define decode_basedisp_rs decode_basedisp_s
+
+static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
+{
+    cpu_reset(cs);
+}
+
+static inline uint8_t s390_cpu_get_state(S390CPU *cpu)
+{
+    return cpu->env.cpu_state;
+}
+
+
+/* arch_dump.c */
+int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
+                              int cpuid, void *opaque);
+
+
+/* cc_helper.c */
+const char *cc_name(enum cc_op cc_op);
+void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr);
+uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst,
+                 uint64_t vr);
+
+
+/* cpu.c */
+#ifndef CONFIG_USER_ONLY
+unsigned int s390_cpu_halt(S390CPU *cpu);
+void s390_cpu_unhalt(S390CPU *cpu);
+#else
+static inline unsigned int s390_cpu_halt(S390CPU *cpu)
+{
+    return 0;
+}
+
+static inline void s390_cpu_unhalt(S390CPU *cpu)
+{
+}
+#endif /* CONFIG_USER_ONLY */
+
+
+/* cpu_models.c */
+void s390_cpu_model_register_props(Object *obj);
+void s390_cpu_model_class_register_props(ObjectClass *oc);
+void s390_realize_cpu_model(CPUState *cs, Error **errp);
+ObjectClass *s390_cpu_class_by_name(const char *name);
+
+
+/* excp_helper.c */
+void s390x_cpu_debug_excp_handler(CPUState *cs);
+void s390_cpu_do_interrupt(CPUState *cpu);
+bool s390_cpu_exec_interrupt(CPUState *cpu, int int_req);
+int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
+                              int mmu_idx);
+void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
+                                   MMUAccessType access_type,
+                                   int mmu_idx, uintptr_t retaddr);
+
+
+/* fpu_helper.c */
+uint32_t set_cc_nz_f32(float32 v);
+uint32_t set_cc_nz_f64(float64 v);
+uint32_t set_cc_nz_f128(float128 v);
+
+
+/* gdbstub.c */
+int s390_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
+int s390_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
+void s390_cpu_gdb_init(CPUState *cs);
+
+
+/* helper.c */
+void s390_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
+                         int flags);
+hwaddr s390_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
+hwaddr s390_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
+uint64_t get_psw_mask(CPUS390XState *env);
+void s390_cpu_recompute_watchpoints(CPUState *cs);
+void s390x_tod_timer(void *opaque);
+void s390x_cpu_timer(void *opaque);
+S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp);
+void do_restart_interrupt(CPUS390XState *env);
+#ifndef CONFIG_USER_ONLY
+LowCore *cpu_map_lowcore(CPUS390XState *env);
+void cpu_unmap_lowcore(LowCore *lowcore);
+#endif /* CONFIG_USER_ONLY */
+
+
+/* interrupt.c */
+void trigger_pgm_exception(CPUS390XState *env, uint32_t code, uint32_t ilen);
+void cpu_inject_ext(S390CPU *cpu, uint32_t code, uint32_t param,
+                    uint64_t param64);
+
+
+/* ioinst.c */
+void ioinst_handle_xsch(S390CPU *cpu, uint64_t reg1);
+void ioinst_handle_csch(S390CPU *cpu, uint64_t reg1);
+void ioinst_handle_hsch(S390CPU *cpu, uint64_t reg1);
+void ioinst_handle_msch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
+void ioinst_handle_ssch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
+void ioinst_handle_stcrw(S390CPU *cpu, uint32_t ipb);
+void ioinst_handle_stsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
+int ioinst_handle_tsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
+void ioinst_handle_chsc(S390CPU *cpu, uint32_t ipb);
+int ioinst_handle_tpi(S390CPU *cpu, uint32_t ipb);
+void ioinst_handle_schm(S390CPU *cpu, uint64_t reg1, uint64_t reg2,
+                        uint32_t ipb);
+void ioinst_handle_rsch(S390CPU *cpu, uint64_t reg1);
+void ioinst_handle_rchp(S390CPU *cpu, uint64_t reg1);
+void ioinst_handle_sal(S390CPU *cpu, uint64_t reg1);
+
+
+/* mem_helper.c */
+target_ulong mmu_real2abs(CPUS390XState *env, target_ulong raddr);
+
+
+/* mmu_helper.c */
+int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
+                  target_ulong *raddr, int *flags, bool exc);
+
+
+/* misc_helper.c */
+void QEMU_NORETURN runtime_exception(CPUS390XState *env, int excp,
+                                     uintptr_t retaddr);
+int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
+void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3);
+
+
+/* translate.c */
+void s390x_translate_init(void);
+
+#endif /* S390X_INTERNAL_H */
diff --git a/target/s390x/interrupt.c b/target/s390x/interrupt.c
index fde3da793a..119ca74230 100644
--- a/target/s390x/interrupt.c
+++ b/target/s390x/interrupt.c
@@ -10,6 +10,7 @@
 #include "qemu/osdep.h"
 #include "qemu/log.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/exec-all.h"
 #include "sysemu/kvm.h"
 #include "hw/s390x/ioinst.h"
diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c
index 3fa3301f50..47490f838a 100644
--- a/target/s390x/ioinst.c
+++ b/target/s390x/ioinst.c
@@ -12,6 +12,7 @@
 #include "qemu/osdep.h"
 
 #include "cpu.h"
+#include "internal.h"
 #include "hw/s390x/ioinst.h"
 #include "trace.h"
 #include "hw/s390x/s390-pci-bus.h"
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 23109a7c76..e271f958a4 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -29,6 +29,7 @@
 
 #include "qemu-common.h"
 #include "cpu.h"
+#include "internal.h"
 #include "qemu/error-report.h"
 #include "qemu/timer.h"
 #include "sysemu/sysemu.h"
diff --git a/target/s390x/machine.c b/target/s390x/machine.c
index 2dcadfdd29..592db6b515 100644
--- a/target/s390x/machine.c
+++ b/target/s390x/machine.c
@@ -17,6 +17,7 @@
 #include "qemu/osdep.h"
 #include "hw/hw.h"
 #include "cpu.h"
+#include "internal.h"
 #include "sysemu/kvm.h"
 
 static int cpu_post_load(void *opaque, int version_id)
diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c
index b91c7402c4..ec4760e390 100644
--- a/target/s390x/mem_helper.c
+++ b/target/s390x/mem_helper.c
@@ -20,6 +20,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/address-spaces.h"
 #include "exec/helper-proto.h"
 #include "exec/exec-all.h"
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index d5497cbcba..50cc046ca2 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -21,6 +21,7 @@
 #include "qemu/osdep.h"
 #include "qemu/main-loop.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/memory.h"
 #include "qemu/host-utils.h"
 #include "exec/helper-proto.h"
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
index 1ad01584b4..09fe5bba29 100644
--- a/target/s390x/mmu_helper.c
+++ b/target/s390x/mmu_helper.c
@@ -19,6 +19,7 @@
 #include "qemu/error-report.h"
 #include "exec/address-spaces.h"
 #include "cpu.h"
+#include "internal.h"
 #include "sysemu/kvm.h"
 #include "trace.h"
 #include "hw/s390x/storage-keys.h"
diff --git a/target/s390x/translate.c b/target/s390x/translate.c
index cd96a8dee2..4b0db7b7bd 100644
--- a/target/s390x/translate.c
+++ b/target/s390x/translate.c
@@ -30,6 +30,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "disas/disas.h"
 #include "exec/exec-all.h"
 #include "tcg-op.h"

From b6089b059c111ae4c083a5f6d1b6038ec7c92b47 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:50 +0200
Subject: [PATCH 37/44] target/s390x: move a couple of functions to cpu.c
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Prepare to move more stuff (especially KVM related) from cpu.h to
internal.h.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-16-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.c | 79 ++++++++++++++++++++++++++++++++++++++++
 target/s390x/cpu.h | 89 ++++++----------------------------------------
 2 files changed, 89 insertions(+), 79 deletions(-)

diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index dadd383d90..90e2db7b1f 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -392,6 +392,85 @@ unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
 
     return s390_count_running_cpus();
 }
+
+int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
+{
+    if (kvm_enabled()) {
+        return kvm_s390_get_clock(tod_high, tod_low);
+    }
+    /* Fixme TCG */
+    *tod_high = 0;
+    *tod_low = 0;
+    return 0;
+}
+
+int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
+{
+    if (kvm_enabled()) {
+        return kvm_s390_set_clock(tod_high, tod_low);
+    }
+    /* Fixme TCG */
+    return 0;
+}
+
+int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit)
+{
+    if (kvm_enabled()) {
+        return kvm_s390_set_mem_limit(new_limit, hw_limit);
+    }
+    return 0;
+}
+
+void s390_cmma_reset(void)
+{
+    if (kvm_enabled()) {
+        kvm_s390_cmma_reset();
+    }
+}
+
+int s390_cpu_restart(S390CPU *cpu)
+{
+    if (kvm_enabled()) {
+        return kvm_s390_cpu_restart(cpu);
+    }
+    return -ENOSYS;
+}
+
+int s390_get_memslot_count(void)
+{
+    if (kvm_enabled()) {
+        return kvm_s390_get_memslot_count();
+    } else {
+        return MAX_AVAIL_SLOTS;
+    }
+}
+
+int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id,
+                                int vq, bool assign)
+{
+    if (kvm_enabled()) {
+        return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign);
+    } else {
+        return 0;
+    }
+}
+
+void s390_crypto_reset(void)
+{
+    if (kvm_enabled()) {
+        kvm_s390_crypto_reset();
+    }
+}
+
+bool s390_get_squash_mcss(void)
+{
+    if (object_property_get_bool(OBJECT(qdev_get_machine()), "s390-squash-mcss",
+                                 NULL)) {
+        return true;
+    }
+
+    return false;
+}
 #endif
 
 static gchar *s390_gdb_arch_name(CPUState *cs)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index af941f8e51..a2cefb7a0c 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -439,25 +439,8 @@ static inline void kvm_s390_access_exception(S390CPU *cpu, uint16_t code,
 }
 #endif
 
-static inline int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
-{
-    if (kvm_enabled()) {
-        return kvm_s390_get_clock(tod_high, tod_low);
-    }
-    /* Fixme TCG */
-    *tod_high = 0;
-    *tod_low = 0;
-    return 0;
-}
-
-static inline int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
-{
-    if (kvm_enabled()) {
-        return kvm_s390_set_clock(tod_high, tod_low);
-    }
-    /* Fixme TCG */
-    return 0;
-}
+int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low);
+int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low);
 
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
 unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu);
@@ -805,69 +788,17 @@ static inline void kvm_s390_crypto_reset(void)
 }
 #endif
 
-static inline int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit)
-{
-    if (kvm_enabled()) {
-        return kvm_s390_set_mem_limit(new_limit, hw_limit);
-    }
-    return 0;
-}
-
-static inline void s390_cmma_reset(void)
-{
-    if (kvm_enabled()) {
-        kvm_s390_cmma_reset();
-    }
-}
-
-static inline int s390_cpu_restart(S390CPU *cpu)
-{
-    if (kvm_enabled()) {
-        return kvm_s390_cpu_restart(cpu);
-    }
-    return -ENOSYS;
-}
-
-static inline int s390_get_memslot_count(void)
-{
-    if (kvm_enabled()) {
-        return kvm_s390_get_memslot_count();
-    } else {
-        return MAX_AVAIL_SLOTS;
-    }
-}
-
+int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit);
+void s390_cmma_reset(void);
+int s390_cpu_restart(S390CPU *cpu);
+int s390_get_memslot_count(void);
 void s390_io_interrupt(uint16_t subchannel_id, uint16_t subchannel_nr,
                        uint32_t io_int_parm, uint32_t io_int_word);
 void s390_crw_mchk(void);
-
-static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier,
-                                              uint32_t sch_id, int vq,
-                                              bool assign)
-{
-    if (kvm_enabled()) {
-        return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign);
-    } else {
-        return 0;
-    }
-}
-
-static inline void s390_crypto_reset(void)
-{
-    if (kvm_enabled()) {
-        kvm_s390_crypto_reset();
-    }
-}
-
-static inline bool s390_get_squash_mcss(void)
-{
-    if (object_property_get_bool(OBJECT(qdev_get_machine()), "s390-squash-mcss",
-                                 NULL)) {
-        return true;
-    }
-
-    return false;
-}
+int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id,
+                                int vq, bool assign);
+void s390_crypto_reset(void);
+bool s390_get_squash_mcss(void);
 
 /* machine check interruption code */
 

From 5e7164c50c9f6ac531a0e3c7a49b3771ddefb8f3 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:51 +0200
Subject: [PATCH 38/44] s390x: avoid calling kvm_ functions outside of
 target/s390x/
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Let's just introduce an helper.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-17-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 4 +---
 target/s390x/cpu.c         | 7 +++++++
 target/s390x/cpu.h         | 1 +
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 42f0edac36..dd504dd5ae 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -144,9 +144,7 @@ static void ccw_init(MachineState *machine)
     /* register hypercalls */
     virtio_ccw_register_hcalls();
 
-    if (kvm_enabled()) {
-        kvm_s390_enable_css_support(s390_cpu_addr2state(0));
-    }
+    s390_enable_css_support(s390_cpu_addr2state(0));
     /*
      * Non mcss-e enabled guests only see the devices from the default
      * css, which is determined by the value of the squash_mcss property.
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 90e2db7b1f..c538a95850 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -471,6 +471,13 @@ bool s390_get_squash_mcss(void)
 
     return false;
 }
+
+void s390_enable_css_support(S390CPU *cpu)
+{
+    if (kvm_enabled()) {
+        kvm_s390_enable_css_support(cpu);
+    }
+}
 #endif
 
 static gchar *s390_gdb_arch_name(CPUState *cs)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index a2cefb7a0c..77b29774cc 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -404,6 +404,7 @@ int cpu_s390x_signal_handler(int host_signum, void *pinfo,
 
 #ifndef CONFIG_USER_ONLY
 
+void s390_enable_css_support(S390CPU *cpu);
 int s390_virtio_hypercall(CPUS390XState *env);
 
 #ifdef CONFIG_KVM

From f16bbb9bbde3285dd40c806b46f80b49dfebfc4a Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:52 +0200
Subject: [PATCH 39/44] s390x/kvm: move KVM declarations and stubs to separate
 files

Let's do it just like the other architectures. Introduce kvm-stub.c
for stubs and kvm_s390x.h for the declarations.

Change license to GPL2+ and keep copyright notice.

As we are dropping the sysemu/kvm.h include from cpu.h, fix up includes.

Suggested-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-18-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/intc/s390_flic_kvm.c      |   1 +
 hw/s390x/s390-stattrib-kvm.c |   1 +
 include/hw/s390x/css.h       |   1 +
 target/s390x/Makefile.objs   |   1 +
 target/s390x/cpu.c           |   2 +
 target/s390x/cpu.h           | 119 -----------------------------------
 target/s390x/cpu_models.c    |   2 +
 target/s390x/interrupt.c     |   1 +
 target/s390x/kvm-stub.c      | 111 ++++++++++++++++++++++++++++++++
 target/s390x/kvm.c           |   1 +
 target/s390x/kvm_s390x.h     |  47 ++++++++++++++
 target/s390x/machine.c       |   1 +
 target/s390x/mmu_helper.c    |   1 +
 13 files changed, 170 insertions(+), 119 deletions(-)
 create mode 100644 target/s390x/kvm-stub.c
 create mode 100644 target/s390x/kvm_s390x.h

diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c
index be3fd00a57..7ead17ac3e 100644
--- a/hw/intc/s390_flic_kvm.c
+++ b/hw/intc/s390_flic_kvm.c
@@ -13,6 +13,7 @@
 #include "qemu/osdep.h"
 #include "qemu-common.h"
 #include "cpu.h"
+#include "kvm_s390x.h"
 #include <sys/ioctl.h>
 #include "qemu/error-report.h"
 #include "qapi/error.h"
diff --git a/hw/s390x/s390-stattrib-kvm.c b/hw/s390x/s390-stattrib-kvm.c
index ff3f89fd2d..ed95d13c68 100644
--- a/hw/s390x/s390-stattrib-kvm.c
+++ b/hw/s390x/s390-stattrib-kvm.c
@@ -17,6 +17,7 @@
 #include "sysemu/kvm.h"
 #include "exec/ram_addr.h"
 #include "cpu.h"
+#include "kvm_s390x.h"
 
 Object *kvm_s390_stattrib_create(void)
 {
diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
index 5b017e1fc3..0653d3c9be 100644
--- a/include/hw/s390x/css.h
+++ b/include/hw/s390x/css.h
@@ -16,6 +16,7 @@
 #include "hw/s390x/adapter.h"
 #include "hw/s390x/s390_flic.h"
 #include "hw/s390x/ioinst.h"
+#include "sysemu/kvm.h"
 
 /* Channel subsystem constants. */
 #define MAX_DEVNO 65535
diff --git a/target/s390x/Makefile.objs b/target/s390x/Makefile.objs
index f42cd1f9cc..9615256d81 100644
--- a/target/s390x/Makefile.objs
+++ b/target/s390x/Makefile.objs
@@ -3,6 +3,7 @@ obj-$(CONFIG_TCG) += translate.o cc_helper.o excp_helper.o fpu_helper.o
 obj-$(CONFIG_TCG) += int_helper.o mem_helper.o misc_helper.o
 obj-$(CONFIG_SOFTMMU) += machine.o ioinst.o arch_dump.o mmu_helper.o diag.o
 obj-$(CONFIG_KVM) += kvm.o
+obj-$(call lnot,$(CONFIG_KVM)) += kvm-stub.o
 
 # build and run feature list generator
 feat-src = $(SRC_PATH)/target/$(TARGET_BASE_ARCH)/
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index c538a95850..7267b60d41 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -27,6 +27,8 @@
 #include "qapi/error.h"
 #include "cpu.h"
 #include "internal.h"
+#include "kvm_s390x.h"
+#include "sysemu/kvm.h"
 #include "qemu-common.h"
 #include "qemu/cutils.h"
 #include "qemu/timer.h"
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 77b29774cc..464db3e556 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -213,8 +213,6 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)
 extern const struct VMStateDescription vmstate_s390_cpu;
 #endif
 
-#include "sysemu/kvm.h"
-
 /* distinguish between 24 bit and 31 bit addressing */
 #define HIGH_ORDER_BIT 0x80000000
 
@@ -407,39 +405,6 @@ int cpu_s390x_signal_handler(int host_signum, void *pinfo,
 void s390_enable_css_support(S390CPU *cpu);
 int s390_virtio_hypercall(CPUS390XState *env);
 
-#ifdef CONFIG_KVM
-void kvm_s390_service_interrupt(uint32_t parm);
-void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq);
-void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq);
-int kvm_s390_inject_flic(struct kvm_s390_irq *irq);
-void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code);
-int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
-                    int len, bool is_write);
-int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
-int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_clock);
-#else
-static inline void kvm_s390_service_interrupt(uint32_t parm)
-{
-}
-static inline int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
-{
-    return -ENOSYS;
-}
-static inline int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
-{
-    return -ENOSYS;
-}
-static inline int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar,
-                                  void *hostbuf, int len, bool is_write)
-{
-    return -ENOSYS;
-}
-static inline void kvm_s390_access_exception(S390CPU *cpu, uint16_t code,
-                                             uint64_t te_code)
-{
-}
-#endif
-
 int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low);
 int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low);
 
@@ -704,90 +669,6 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
 #define ILEN_AUTO                   0xff
 void program_interrupt(CPUS390XState *env, uint32_t code, int ilen);
 
-#ifdef CONFIG_KVM
-void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code);
-void kvm_s390_io_interrupt(uint16_t subchannel_id,
-                           uint16_t subchannel_nr, uint32_t io_int_parm,
-                           uint32_t io_int_word);
-void kvm_s390_crw_mchk(void);
-void kvm_s390_enable_css_support(S390CPU *cpu);
-int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
-                                    int vq, bool assign);
-int kvm_s390_cpu_restart(S390CPU *cpu);
-int kvm_s390_get_memslot_count(void);
-int kvm_s390_cmma_active(void);
-void kvm_s390_cmma_reset(void);
-int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
-void kvm_s390_reset_vcpu(S390CPU *cpu);
-int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit);
-void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
-int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
-int kvm_s390_get_ri(void);
-int kvm_s390_get_gs(void);
-void kvm_s390_crypto_reset(void);
-#else
-static inline void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code)
-{
-}
-static inline void kvm_s390_io_interrupt(uint16_t subchannel_id,
-                                        uint16_t subchannel_nr,
-                                        uint32_t io_int_parm,
-                                        uint32_t io_int_word)
-{
-}
-static inline void kvm_s390_crw_mchk(void)
-{
-}
-static inline void kvm_s390_enable_css_support(S390CPU *cpu)
-{
-}
-static inline int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier,
-                                                  uint32_t sch, int vq,
-                                                  bool assign)
-{
-    return -ENOSYS;
-}
-static inline int kvm_s390_cpu_restart(S390CPU *cpu)
-{
-    return -ENOSYS;
-}
-static inline void kvm_s390_cmma_reset(void)
-{
-}
-static inline int kvm_s390_get_memslot_count(void)
-{
-  return MAX_AVAIL_SLOTS;
-}
-static inline int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state)
-{
-    return -ENOSYS;
-}
-static inline void kvm_s390_reset_vcpu(S390CPU *cpu)
-{
-}
-static inline int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit)
-{
-    return 0;
-}
-static inline void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu)
-{
-}
-static inline int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
-{
-    return 0;
-}
-static inline int kvm_s390_get_ri(void)
-{
-    return 0;
-}
-static inline int kvm_s390_get_gs(void)
-{
-    return 0;
-}
-static inline void kvm_s390_crypto_reset(void)
-{
-}
-#endif
 
 int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit);
 void s390_cmma_reset(void);
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 2ce9157197..18cbf91d9c 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -13,6 +13,8 @@
 #include "qemu/osdep.h"
 #include "cpu.h"
 #include "internal.h"
+#include "kvm_s390x.h"
+#include "sysemu/kvm.h"
 #include "gen-features.h"
 #include "qapi/error.h"
 #include "qapi/visitor.h"
diff --git a/target/s390x/interrupt.c b/target/s390x/interrupt.c
index 119ca74230..058e219fe5 100644
--- a/target/s390x/interrupt.c
+++ b/target/s390x/interrupt.c
@@ -10,6 +10,7 @@
 #include "qemu/osdep.h"
 #include "qemu/log.h"
 #include "cpu.h"
+#include "kvm_s390x.h"
 #include "internal.h"
 #include "exec/exec-all.h"
 #include "sysemu/kvm.h"
diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c
new file mode 100644
index 0000000000..261e1cdc44
--- /dev/null
+++ b/target/s390x/kvm-stub.c
@@ -0,0 +1,111 @@
+/*
+ * QEMU KVM support -- s390x specific function stubs.
+ *
+ * Copyright (c) 2009 Ulrich Hecht
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "cpu.h"
+#include "kvm_s390x.h"
+
+void kvm_s390_service_interrupt(uint32_t parm)
+{
+}
+
+void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code)
+{
+}
+
+int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
+                    int len, bool is_write)
+{
+    return -ENOSYS;
+}
+
+void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code)
+{
+}
+
+void kvm_s390_io_interrupt(uint16_t subchannel_id, uint16_t subchannel_nr,
+                           uint32_t io_int_parm, uint32_t io_int_word)
+{
+}
+
+void kvm_s390_crw_mchk(void)
+{
+}
+
+int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state)
+{
+    return -ENOSYS;
+}
+
+void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu)
+{
+}
+
+int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
+{
+    return 0;
+}
+
+int kvm_s390_get_ri(void)
+{
+    return 0;
+}
+
+int kvm_s390_get_gs(void)
+{
+    return 0;
+}
+
+int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
+{
+    return -ENOSYS;
+}
+
+int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
+{
+    return -ENOSYS;
+}
+
+void kvm_s390_enable_css_support(S390CPU *cpu)
+{
+}
+
+int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
+                                    int vq, bool assign)
+{
+    return -ENOSYS;
+}
+
+int kvm_s390_cpu_restart(S390CPU *cpu)
+{
+    return -ENOSYS;
+}
+
+void kvm_s390_cmma_reset(void)
+{
+}
+
+int kvm_s390_get_memslot_count(void)
+{
+  return MAX_AVAIL_SLOTS;
+}
+
+void kvm_s390_reset_vcpu(S390CPU *cpu)
+{
+}
+
+int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit)
+{
+    return 0;
+}
+
+void kvm_s390_crypto_reset(void)
+{
+}
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index e271f958a4..d07763ff2c 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -30,6 +30,7 @@
 #include "qemu-common.h"
 #include "cpu.h"
 #include "internal.h"
+#include "kvm_s390x.h"
 #include "qemu/error-report.h"
 #include "qemu/timer.h"
 #include "sysemu/sysemu.h"
diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h
new file mode 100644
index 0000000000..2d594bd4ee
--- /dev/null
+++ b/target/s390x/kvm_s390x.h
@@ -0,0 +1,47 @@
+/*
+ * QEMU KVM support -- s390x specific functions.
+ *
+ * Copyright (c) 2009 Ulrich Hecht
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef KVM_S390X_H
+#define KVM_S390X_H
+
+struct kvm_s390_irq;
+
+void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq);
+void kvm_s390_service_interrupt(uint32_t parm);
+void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq);
+void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code);
+int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
+                    int len, bool is_write);
+void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code);
+void kvm_s390_io_interrupt(uint16_t subchannel_id,
+                           uint16_t subchannel_nr, uint32_t io_int_parm,
+                           uint32_t io_int_word);
+void kvm_s390_crw_mchk(void);
+int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
+void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
+int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
+int kvm_s390_get_ri(void);
+int kvm_s390_get_gs(void);
+int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
+int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_clock);
+void kvm_s390_enable_css_support(S390CPU *cpu);
+int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
+                                    int vq, bool assign);
+int kvm_s390_cpu_restart(S390CPU *cpu);
+int kvm_s390_get_memslot_count(void);
+int kvm_s390_cmma_active(void);
+void kvm_s390_cmma_reset(void);
+void kvm_s390_reset_vcpu(S390CPU *cpu);
+int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit);
+void kvm_s390_crypto_reset(void);
+
+/* implemented outside of target/s390x/ */
+int kvm_s390_inject_flic(struct kvm_s390_irq *irq);
+
+#endif /* KVM_S390X_H */
diff --git a/target/s390x/machine.c b/target/s390x/machine.c
index 592db6b515..097a147dbb 100644
--- a/target/s390x/machine.c
+++ b/target/s390x/machine.c
@@ -18,6 +18,7 @@
 #include "hw/hw.h"
 #include "cpu.h"
 #include "internal.h"
+#include "kvm_s390x.h"
 #include "sysemu/kvm.h"
 
 static int cpu_post_load(void *opaque, int version_id)
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
index 09fe5bba29..b528c5921d 100644
--- a/target/s390x/mmu_helper.c
+++ b/target/s390x/mmu_helper.c
@@ -20,6 +20,7 @@
 #include "exec/address-spaces.h"
 #include "cpu.h"
 #include "internal.h"
+#include "kvm_s390x.h"
 #include "sysemu/kvm.h"
 #include "trace.h"
 #include "hw/s390x/storage-keys.h"

From c862bddbcb9fc5993a26365d3f2adcc7fba9fbe4 Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Fri, 18 Aug 2017 13:43:53 +0200
Subject: [PATCH 40/44] target/s390x: cleanup cpu.h
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Let's reshuffle the function prototypes so we get a cleaner outline
of the files.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170818114353.13455-19-david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu.h | 137 ++++++++++++++++++++++-----------------------
 1 file changed, 68 insertions(+), 69 deletions(-)

diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 464db3e556..4ec338077e 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -390,46 +390,6 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,
 #define PER_CODE_EVENT_STORE_REAL      0x0800
 #define PER_CODE_EVENT_NULLIFICATION   0x0100
 
-S390CPU *cpu_s390x_init(const char *cpu_model);
-S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp);
-
-/* you can call this signal handler from your SIGBUS and SIGSEGV
-   signal handlers to inform the virtual CPU of exceptions. non zero
-   is returned if the signal was handled by the virtual CPU.  */
-int cpu_s390x_signal_handler(int host_signum, void *pinfo,
-                           void *puc);
-
-
-#ifndef CONFIG_USER_ONLY
-
-void s390_enable_css_support(S390CPU *cpu);
-int s390_virtio_hypercall(CPUS390XState *env);
-
-int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low);
-int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low);
-
-S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
-unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu);
-
-/* service interrupts are floating therefore we must not pass an cpustate */
-void s390_sclp_extint(uint32_t parm);
-
-#else
-static inline unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
-{
-    return 0;
-}
-#endif
-
-extern void subsystem_reset(void);
-
-#define cpu_init(model) CPU(cpu_s390x_init(model))
-#define cpu_signal_handler cpu_s390x_signal_handler
-
-void s390_cpu_list(FILE *f, fprintf_function cpu_fprintf);
-#define cpu_list s390_cpu_list
-const char *s390_default_cpu_model_name(void);
-
 #define EXCP_EXT 1 /* external interrupt */
 #define EXCP_SVC 2 /* supervisor call (syscall) */
 #define EXCP_PGM 3 /* program interruption */
@@ -649,39 +609,10 @@ struct sysib_322 {
 /* SIGP order code mask corresponding to bit positions 56-63 */
 #define SIGP_ORDER_MASK 0x000000ff
 
-int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
-
-int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
-                         int len, bool is_write);
-
-#define s390_cpu_virt_mem_read(cpu, laddr, ar, dest, len)    \
-        s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, false)
-#define s390_cpu_virt_mem_write(cpu, laddr, ar, dest, len)       \
-        s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, true)
-#define s390_cpu_virt_mem_check_write(cpu, laddr, ar, len)   \
-        s390_cpu_virt_mem_rw(cpu, laddr, ar, NULL, len, true)
-
 /* from s390-virtio-ccw */
 #define MEM_SECTION_SIZE             0x10000000UL
 #define MAX_AVAIL_SLOTS              32
 
-/* automatically detect the instruction length */
-#define ILEN_AUTO                   0xff
-void program_interrupt(CPUS390XState *env, uint32_t code, int ilen);
-
-
-int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit);
-void s390_cmma_reset(void);
-int s390_cpu_restart(S390CPU *cpu);
-int s390_get_memslot_count(void);
-void s390_io_interrupt(uint16_t subchannel_id, uint16_t subchannel_nr,
-                       uint32_t io_int_parm, uint32_t io_int_word);
-void s390_crw_mchk(void);
-int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id,
-                                int vq, bool assign);
-void s390_crypto_reset(void);
-bool s390_get_squash_mcss(void);
-
 /* machine check interruption code */
 
 /* subclasses */
@@ -727,4 +658,72 @@ bool s390_get_squash_mcss(void);
 #define MCIC_VB_CT 0x0000000000020000ULL
 #define MCIC_VB_CC 0x0000000000010000ULL
 
+
+/* cpu.c */
+int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low);
+int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low);
+void s390_crypto_reset(void);
+bool s390_get_squash_mcss(void);
+int s390_get_memslot_count(void);
+int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit);
+void s390_cmma_reset(void);
+int s390_cpu_restart(S390CPU *cpu);
+void s390_enable_css_support(S390CPU *cpu);
+int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id,
+                                int vq, bool assign);
+#ifndef CONFIG_USER_ONLY
+unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu);
+#else
+static inline unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
+{
+    return 0;
+}
+#endif /* CONFIG_USER_ONLY */
+
+
+/* cpu_models.c */
+void s390_cpu_list(FILE *f, fprintf_function cpu_fprintf);
+#define cpu_list s390_cpu_list
+const char *s390_default_cpu_model_name(void);
+
+
+/* helper.c */
+S390CPU *cpu_s390x_init(const char *cpu_model);
+#define cpu_init(model) CPU(cpu_s390x_init(model))
+S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp);
+/* you can call this signal handler from your SIGBUS and SIGSEGV
+   signal handlers to inform the virtual CPU of exceptions. non zero
+   is returned if the signal was handled by the virtual CPU.  */
+int cpu_s390x_signal_handler(int host_signum, void *pinfo, void *puc);
+#define cpu_signal_handler cpu_s390x_signal_handler
+
+
+/* interrupt.c */
+void s390_crw_mchk(void);
+void s390_io_interrupt(uint16_t subchannel_id, uint16_t subchannel_nr,
+                       uint32_t io_int_parm, uint32_t io_int_word);
+/* automatically detect the instruction length */
+#define ILEN_AUTO                   0xff
+void program_interrupt(CPUS390XState *env, uint32_t code, int ilen);
+/* service interrupts are floating therefore we must not pass an cpustate */
+void s390_sclp_extint(uint32_t parm);
+
+
+/* mmu_helper.c */
+int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
+                         int len, bool is_write);
+#define s390_cpu_virt_mem_read(cpu, laddr, ar, dest, len)    \
+        s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, false)
+#define s390_cpu_virt_mem_write(cpu, laddr, ar, dest, len)       \
+        s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, true)
+#define s390_cpu_virt_mem_check_write(cpu, laddr, ar, len)   \
+        s390_cpu_virt_mem_rw(cpu, laddr, ar, NULL, len, true)
+
+
+/* outside of target/s390x/ */
+S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
+extern void subsystem_reset(void);
+int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
+int s390_virtio_hypercall(CPUS390XState *env);
+
 #endif

From 3ea6d20e0baacb4a1211ed0ea57db14e2fc927ce Mon Sep 17 00:00:00 2001
From: Thomas Huth <thuth@redhat.com>
Date: Thu, 24 Aug 2017 14:00:29 +0200
Subject: [PATCH 41/44] s390x/s390-stattrib: Mark the storage attribute as not
 user_creatable

The storage attribute devices are only meant to be instantiated one
time, internally. They can not be used by the user, so mark them with
user_creatable = false.

Suggested-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1503576029-24264-1-git-send-email-thuth@redhat.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-stattrib-kvm.c | 4 ++++
 hw/s390x/s390-stattrib.c     | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/hw/s390x/s390-stattrib-kvm.c b/hw/s390x/s390-stattrib-kvm.c
index ed95d13c68..41770a7dec 100644
--- a/hw/s390x/s390-stattrib-kvm.c
+++ b/hw/s390x/s390-stattrib-kvm.c
@@ -164,6 +164,7 @@ static int kvm_s390_stattrib_get_active(S390StAttribState *sa)
 static void kvm_s390_stattrib_class_init(ObjectClass *oc, void *data)
 {
     S390StAttribClass *sac = S390_STATTRIB_CLASS(oc);
+    DeviceClass *dc = DEVICE_CLASS(oc);
 
     sac->get_stattr = kvm_s390_stattrib_get_stattr;
     sac->peek_stattr = kvm_s390_stattrib_peek_stattr;
@@ -172,6 +173,9 @@ static void kvm_s390_stattrib_class_init(ObjectClass *oc, void *data)
     sac->get_dirtycount = kvm_s390_stattrib_get_dirtycount;
     sac->synchronize = kvm_s390_stattrib_synchronize;
     sac->get_active = kvm_s390_stattrib_get_active;
+
+    /* Reason: Can only be instantiated one time (internally) */
+    dc->user_creatable = false;
 }
 
 static const TypeInfo kvm_s390_stattrib_info = {
diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
index 14a02711a2..2902f54f11 100644
--- a/hw/s390x/s390-stattrib.c
+++ b/hw/s390x/s390-stattrib.c
@@ -306,6 +306,7 @@ static int qemu_s390_get_active(S390StAttribState *sa)
 static void qemu_s390_stattrib_class_init(ObjectClass *oc, void *data)
 {
     S390StAttribClass *sa_cl = S390_STATTRIB_CLASS(oc);
+    DeviceClass *dc = DEVICE_CLASS(oc);
 
     sa_cl->synchronize = qemu_s390_synchronize_stub;
     sa_cl->get_stattr = qemu_s390_get_stattr_stub;
@@ -314,6 +315,9 @@ static void qemu_s390_stattrib_class_init(ObjectClass *oc, void *data)
     sa_cl->set_migrationmode = qemu_s390_set_migrationmode_stub;
     sa_cl->get_dirtycount = qemu_s390_get_dirtycount_stub;
     sa_cl->get_active = qemu_s390_get_active;
+
+    /* Reason: Can only be instantiated one time (internally) */
+    dc->user_creatable = false;
 }
 
 static const TypeInfo qemu_s390_stattrib_info = {

From 3a1e4561ad63b303b092387ae006bd41468ece63 Mon Sep 17 00:00:00 2001
From: Farhan Ali <alifm@linux.vnet.ibm.com>
Date: Fri, 25 Aug 2017 09:24:46 -0400
Subject: [PATCH 42/44] s390-ccw: Fix alignment for CCW1

The commit 198c0d1f9df8c4 s390x/css: check ccw address validity
exposes an alignment issue in ccw bios.

According to PoP the CCW must be doubleword aligned. Let's fix
this in the bios.

Cc: qemu-stable@nongnu.org
Signed-off-by: Farhan Ali <alifm@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Reviewed-by: Eric Farman <farman@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Message-Id: <3ed8b810b6592daee6a775037ce21f850e40647d.1503667215.git.alifm@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 pc-bios/s390-ccw/cio.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/cio.h b/pc-bios/s390-ccw/cio.h
index f5b4549ea3..55eaeee4b6 100644
--- a/pc-bios/s390-ccw/cio.h
+++ b/pc-bios/s390-ccw/cio.h
@@ -133,7 +133,7 @@ struct ccw1 {
     __u8 flags;
     __u16 count;
     __u32 cda;
-} __attribute__ ((packed));
+} __attribute__ ((packed, aligned(8)));
 
 #define CCW_FLAG_DC              0x80
 #define CCW_FLAG_CC              0x40

From 917726611ef352593f7e3168741a1e33c81dba00 Mon Sep 17 00:00:00 2001
From: Cornelia Huck <cohuck@redhat.com>
Date: Mon, 28 Aug 2017 10:22:54 +0200
Subject: [PATCH 43/44] pc-bios/s390-ccw.img: update image

Contains the following commit:
- s390-ccw: Fix alignment for CCW1

Cc: qemu-stable@nongnu.org
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 pc-bios/s390-ccw.img | Bin 30520 -> 26416 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img
index 0a08c3936a62bb225a3ed6a61e6e527dfecb8f40..0b039291a57b8fe463679e5f462920a95e2437b4 100644
GIT binary patch
literal 26416
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
XO8V;aQdj7we6{}65!#BnF<$(4!;=Y3

literal 30520
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


From 2f21b8d431030bcb7478ee9521bdfd3d0ef3901d Mon Sep 17 00:00:00 2001
From: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Date: Mon, 28 Aug 2017 10:04:44 +0200
Subject: [PATCH 44/44] s390x/pci: fixup trap_msix()

The function trap_msix() is to check if pcistg instruction would access
msix table entries. The correct boundary condition should be
[table_offset, table_offset+entries*entry_size). But the current
condition calculated misses the last entry. So let's fixup it.

Acked-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Message-Id: <1503907487-2764-2-git-send-email-zyimin@linux.vnet.ibm.com>
Cc: qemu-stable@nongnu.org
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-pci-inst.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index b7beb8c36a..eba9ffb5f2 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -440,8 +440,8 @@ static int trap_msix(S390PCIBusDevice *pbdev, uint64_t offset, uint8_t pcias)
 {
     if (pbdev->msix.available && pbdev->msix.table_bar == pcias &&
         offset >= pbdev->msix.table_offset &&
-        offset <= pbdev->msix.table_offset +
-                  (pbdev->msix.entries - 1) * PCI_MSIX_ENTRY_SIZE) {
+        offset < (pbdev->msix.table_offset +
+                  pbdev->msix.entries * PCI_MSIX_ENTRY_SIZE)) {
         return 1;
     } else {
         return 0;