All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11
@ 2017-08-30 16:52 Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 01/44] s390x/css: use macro for event-information pending error recover code Cornelia Huck
                   ` (44 more replies)
  0 siblings, 45 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

The following changes since commit 1ab5eb4efb91a3d4569b0df6e824cc08ab4bd8ec:

  Update version for v2.10.0 release (2017-08-30 17:02:54 +0100)

are available in the git repository at:

  git://github.com/cohuck/qemu tags/s390x-20170830

for you to fetch changes up to 2f21b8d431030bcb7478ee9521bdfd3d0ef3901d:

  s390x/pci: fixup trap_msix() (2017-08-30 18:23:26 +0200)

----------------------------------------------------------------
First batch of s390x patches:
- 2.11 compat machine
- support the new --s390-pgste linker option, making it possible to
  avoid enabling the global vm.allocate_pgste systl if all pieces
  are in place
- correctly identify some devices as not hotpluggable
- clean up some tests and enable them for s390x
- wire up the diag288 watchdog in tcg
- clean up dependencies on CONFIG_PCI, making it possible to disable
  it by hand
- lots of cleanup in target/s390x/
- fix alignment of the ccw1 structure in the s390-ccw bios
- and some more bugfixes

----------------------------------------------------------------

Christian Borntraeger (1):
  configure: enable --s390-pgste linker option

Cornelia Huck (13):
  s390x: introduce 2.11 compat machine
  s390x/tcg: specification exception for unknown diag
  s390x: wire up diag288 in tcg
  9pfs: fix dependencies
  kvm: remove hard dependency on pci
  s390x/pci: add stubs
  s390x: chsc nt2 events are pci-only
  s390x/pci: do not advertise pci on non-pci builds
  s390x/ccw: create s390 phb conditionally
  s390x/sclp: properly guard pci-specific functions
  s390x/pci: fence off instructions for non-pci
  s390x: refine pci dependencies
  pc-bios/s390-ccw.img: update image

David Hildenbrand (18):
  s390x/kvm: drop KVMState parameter from s390_get_memslot_count()
  s390x/kvm: drop KVMState parameter from kvm_s390_set_mem_limit()
  target/s390x: simplify ri_allowed()
  target/s390x: simplify gs_allowed()
  target/s390x: no need to pass kvm_state to savevm_gtod handlers
  s390x/cpumodel: factor out determination of default model name
  s390x: drop inclusion of sysemu/kvm.h from some files
  target/s390x: move gtod_*() declarations to s390-virtio.h
  target/s390x: move cc_name() to helper.c
  target/s390x: move cpu_mmu_idx_to_asc() to excp_helper.c
  target/s390x: move psw_key_valid() to mem_helper.c
  target/s390x: move s390_do_cpu_reset() to diag.c
  target/s390x: move get_per_in_range() to misc_helper.c
  target/s390x: introduce internal.h
  target/s390x: move a couple of functions to cpu.c
  s390x: avoid calling kvm_ functions outside of target/s390x/
  s390x/kvm: move KVM declarations and stubs to separate files
  target/s390x: cleanup cpu.h

Dong Jia Shi (2):
  s390x/css: use macro for event-information pending error recover code
  s390x/css: generate solicited crw for rchp completion signaling

Farhan Ali (1):
  s390-ccw: Fix alignment for CCW1

Thomas Huth (8):
  s390x/ipl: The s390-ipl device is not hot-pluggable
  tests/boot-sector: Do not overwrite the x86 buffer on other
    architectures
  tests/pxe: Check virtio-net-ccw on s390x
  tests: Run filter-redirector and -mirror test only on POSIX systems
  tests: Add network filter tests to the check-qtest-s390x list
  watchdog/wdt_diag288: Mark diag288 watchdog as non-hotpluggable
  s390x/s390-skeys: Mark the storage key devices with user_creatable =
    false
  s390x/s390-stattrib: Mark the storage attribute as not user_creatable

Yi Min Zhao (1):
  s390x/pci: fixup trap_msix()

 accel/kvm/kvm-all.c               |   6 +-
 configure                         |  21 +-
 default-configs/s390x-softmmu.mak |   2 +-
 fsdev/Makefile.objs               |   9 +-
 hw/9pfs/Makefile.objs             |   2 +-
 hw/Makefile.objs                  |   2 +-
 hw/intc/s390_flic_kvm.c           |   1 +
 hw/pci/pci-stub.c                 |  14 +
 hw/pci/pci.c                      |   2 +
 hw/s390x/Makefile.objs            |   3 +-
 hw/s390x/css.c                    |  16 +-
 hw/s390x/ipl.c                    |   2 +
 hw/s390x/s390-pci-bus.c           |  18 +-
 hw/s390x/s390-pci-bus.h           |  12 +-
 hw/s390x/s390-pci-inst.c          |   4 +-
 hw/s390x/s390-pci-stub.c          |  76 ++++
 hw/s390x/s390-skeys-kvm.c         |   4 +
 hw/s390x/s390-skeys.c             |   4 +
 hw/s390x/s390-stattrib-kvm.c      |   5 +
 hw/s390x/s390-stattrib.c          |   6 +-
 hw/s390x/s390-virtio-ccw.c        |  54 +--
 hw/s390x/s390-virtio.c            |   7 +-
 hw/s390x/s390-virtio.h            |   2 +
 hw/s390x/sclp.c                   |  42 ++-
 hw/s390x/sclpcpu.c                |   1 -
 hw/watchdog/wdt_diag288.c         |   1 +
 include/hw/compat.h               |   3 +
 include/hw/pci/pci.h              |   2 +
 include/hw/s390x/css.h            |   4 +-
 include/hw/s390x/ioinst.h         |  12 +-
 include/hw/s390x/sclp.h           |  17 +-
 pc-bios/s390-ccw.img              | Bin 30520 -> 26416 bytes
 pc-bios/s390-ccw/cio.h            |   2 +-
 target/s390x/Makefile.objs        |   1 +
 target/s390x/arch_dump.c          |   2 +-
 target/s390x/cc_helper.c          |   1 +
 target/s390x/cpu.c                |  89 +++++
 target/s390x/cpu.h                | 759 ++++----------------------------------
 target/s390x/cpu_models.c         |  11 +
 target/s390x/diag.c               |   8 +
 target/s390x/excp_helper.c        |  15 +
 target/s390x/fpu_helper.c         |   1 +
 target/s390x/gdbstub.c            |   1 +
 target/s390x/helper.c             |  49 +++
 target/s390x/int_helper.c         |   1 +
 target/s390x/internal.h           | 391 ++++++++++++++++++++
 target/s390x/interrupt.c          |   2 +
 target/s390x/ioinst.c             |  17 +
 target/s390x/kvm-stub.c           | 111 ++++++
 target/s390x/kvm.c                |  76 ++--
 target/s390x/kvm_s390x.h          |  47 +++
 target/s390x/machine.c            |   2 +
 target/s390x/mem_helper.c         |  12 +
 target/s390x/misc_helper.c        |  18 +-
 target/s390x/mmu_helper.c         |   2 +
 target/s390x/translate.c          |   1 +
 tests/Makefile.include            |  12 +-
 tests/boot-sector.c               |  61 ++-
 tests/pxe-test.c                  |   7 +
 tests/test-filter-mirror.c        |  14 +-
 tests/test-filter-redirector.c    |  32 +-
 tests/test-netfilter.c            |  11 +-
 62 files changed, 1257 insertions(+), 853 deletions(-)
 create mode 100644 hw/s390x/s390-pci-stub.c
 create mode 100644 target/s390x/internal.h
 create mode 100644 target/s390x/kvm-stub.c
 create mode 100644 target/s390x/kvm_s390x.h

-- 
2.13.5

^ permalink raw reply	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 01/44] s390x/css: use macro for event-information pending error recover code
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 02/44] s390x/css: generate solicited crw for rchp completion signaling Cornelia Huck
                   ` (43 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Dong Jia Shi,
	Cornelia Huck

From: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>

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
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 02/44] s390x/css: generate solicited crw for rchp completion signaling
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 01/44] s390x/css: use macro for event-information pending error recover code Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 03/44] s390x: introduce 2.11 compat machine Cornelia Huck
                   ` (42 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Dong Jia Shi,
	Cornelia Huck

From: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>

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);
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 03/44] s390x: introduce 2.11 compat machine
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 01/44] s390x/css: use macro for event-information pending error recover code Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 02/44] s390x/css: generate solicited crw for rchp completion signaling Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 04/44] s390x/ipl: The s390-ipl device is not hot-pluggable Cornelia Huck
                   ` (41 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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",\
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 04/44] s390x/ipl: The s390-ipl device is not hot-pluggable
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (2 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 03/44] s390x: introduce 2.11 compat machine Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 05/44] tests/boot-sector: Do not overwrite the x86 buffer on other architectures Cornelia Huck
                   ` (40 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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 = {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 05/44] tests/boot-sector: Do not overwrite the x86 buffer on other architectures
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (3 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 04/44] s390x/ipl: The s390-ipl device is not hot-pluggable Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 06/44] tests/pxe: Check virtio-net-ccw on s390x Cornelia Huck
                   ` (39 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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;
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 06/44] tests/pxe: Check virtio-net-ccw on s390x
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (4 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 05/44] tests/boot-sector: Do not overwrite the x86 buffer on other architectures Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 07/44] tests: Run filter-redirector and -mirror test only on POSIX systems Cornelia Huck
                   ` (38 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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);
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 07/44] tests: Run filter-redirector and -mirror test only on POSIX systems
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (5 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 06/44] tests/pxe: Check virtio-net-ccw on s390x Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 08/44] tests: Add network filter tests to the check-qtest-s390x list Cornelia Huck
                   ` (37 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 08/44] tests: Add network filter tests to the check-qtest-s390x list
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (6 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 07/44] tests: Run filter-redirector and -mirror test only on POSIX systems Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 09/44] s390x/tcg: specification exception for unknown diag Cornelia Huck
                   ` (36 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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;
 }
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 09/44] s390x/tcg: specification exception for unknown diag
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (7 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 08/44] tests: Add network filter tests to the check-qtest-s390x list Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 10/44] watchdog/wdt_diag288: Mark diag288 watchdog as non-hotpluggable Cornelia Huck
                   ` (35 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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);
     }
 }
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 10/44] watchdog/wdt_diag288: Mark diag288 watchdog as non-hotpluggable
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (8 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 09/44] s390x/tcg: specification exception for unknown diag Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 11/44] s390x: wire up diag288 in tcg Cornelia Huck
                   ` (34 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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;
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 11/44] s390x: wire up diag288 in tcg
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (9 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 10/44] watchdog/wdt_diag288: Mark diag288 watchdog as non-hotpluggable Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 12/44] configure: enable --s390-pgste linker option Cornelia Huck
                   ` (33 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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;
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 12/44] configure: enable --s390-pgste linker option
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (10 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 11/44] s390x: wire up diag288 in tcg Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 13/44] 9pfs: fix dependencies Cornelia Huck
                   ` (32 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david,
	Christian Ehrhardt, Dan Horak, Cornelia Huck

From: Christian Borntraeger <borntraeger@de.ibm.com>

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
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 13/44] 9pfs: fix dependencies
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (11 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 12/44] configure: enable --s390-pgste linker option Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 14/44] kvm: remove hard dependency on pci Cornelia Huck
                   ` (31 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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/
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 14/44] kvm: remove hard dependency on pci
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (12 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 13/44] 9pfs: fix dependencies Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 15/44] s390x/pci: add stubs Cornelia Huck
                   ` (30 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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))
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 15/44] s390x/pci: add stubs
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (13 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 14/44] kvm: remove hard dependency on pci Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 16/44] s390x: chsc nt2 events are pci-only Cornelia Huck
                   ` (29 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 16/44] s390x: chsc nt2 events are pci-only
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (14 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 15/44] s390x/pci: add stubs Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 17/44] s390x/pci: do not advertise pci on non-pci builds Cornelia Huck
                   ` (28 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 17/44] s390x/pci: do not advertise pci on non-pci builds
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (15 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 16/44] s390x: chsc nt2 events are pci-only Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 18/44] s390x/ccw: create s390 phb conditionally Cornelia Huck
                   ` (27 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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)) {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 18/44] s390x/ccw: create s390 phb conditionally
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (16 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 17/44] s390x/pci: do not advertise pci on non-pci builds Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 19/44] s390x/sclp: properly guard pci-specific functions Cornelia Huck
                   ` (26 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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();
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 19/44] s390x/sclp: properly guard pci-specific functions
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (17 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 18/44] s390x/ccw: create s390 phb conditionally Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 20/44] s390x/pci: fence off instructions for non-pci Cornelia Huck
                   ` (25 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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];
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 20/44] s390x/pci: fence off instructions for non-pci
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (18 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 19/44] s390x/sclp: properly guard pci-specific functions Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 21/44] s390x: refine pci dependencies Cornelia Huck
                   ` (24 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 21/44] s390x: refine pci dependencies
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (19 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 20/44] s390x/pci: fence off instructions for non-pci Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 22/44] s390x/s390-skeys: Mark the storage key devices with user_creatable = false Cornelia Huck
                   ` (23 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

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
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 22/44] s390x/s390-skeys: Mark the storage key devices with user_creatable = false
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (20 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 21/44] s390x: refine pci dependencies Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 23/44] s390x/kvm: drop KVMState parameter from s390_get_memslot_count() Cornelia Huck
                   ` (22 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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 = {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 23/44] s390x/kvm: drop KVMState parameter from s390_get_memslot_count()
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (21 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 22/44] s390x/s390-skeys: Mark the storage key devices with user_creatable = false Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 24/44] s390x/kvm: drop KVMState parameter from kvm_s390_set_mem_limit() Cornelia Huck
                   ` (21 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 24/44] s390x/kvm: drop KVMState parameter from kvm_s390_set_mem_limit()
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (22 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 23/44] s390x/kvm: drop KVMState parameter from s390_get_memslot_count() Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 25/44] target/s390x: simplify ri_allowed() Cornelia Huck
                   ` (20 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 25/44] target/s390x: simplify ri_allowed()
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (23 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 24/44] s390x/kvm: drop KVMState parameter from kvm_s390_set_mem_limit() Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 26/44] target/s390x: simplify gs_allowed() Cornelia Huck
                   ` (19 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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;
 }
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 26/44] target/s390x: simplify gs_allowed()
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (24 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 25/44] target/s390x: simplify ri_allowed() Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 27/44] target/s390x: no need to pass kvm_state to savevm_gtod handlers Cornelia Huck
                   ` (18 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 27/44] target/s390x: no need to pass kvm_state to savevm_gtod handlers
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (25 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 26/44] target/s390x: simplify gs_allowed() Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 28/44] s390x/cpumodel: factor out determination of default model name Cornelia Huck
                   ` (17 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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,
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 28/44] s390x/cpumodel: factor out determination of default model name
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (26 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 27/44] target/s390x: no need to pass kvm_state to savevm_gtod handlers Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 29/44] s390x: drop inclusion of sysemu/kvm.h from some files Cornelia Huck
                   ` (16 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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,
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 29/44] s390x: drop inclusion of sysemu/kvm.h from some files
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (27 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 28/44] s390x/cpumodel: factor out determination of default model name Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 30/44] target/s390x: move gtod_*() declarations to s390-virtio.h Cornelia Huck
                   ` (15 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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 {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 30/44] target/s390x: move gtod_*() declarations to s390-virtio.h
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (28 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 29/44] s390x: drop inclusion of sysemu/kvm.h from some files Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 31/44] target/s390x: move cc_name() to helper.c Cornelia Huck
                   ` (14 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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);
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 31/44] target/s390x: move cc_name() to helper.c
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (29 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 30/44] target/s390x: move gtod_*() declarations to s390-virtio.h Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 32/44] target/s390x: move cpu_mmu_idx_to_asc() to excp_helper.c Cornelia Huck
                   ` (13 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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];
+}
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 32/44] target/s390x: move cpu_mmu_idx_to_asc() to excp_helper.c
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (30 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 31/44] target/s390x: move cc_name() to helper.c Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 33/44] target/s390x: move psw_key_valid() to mem_helper.c Cornelia Huck
                   ` (12 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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)
 {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 33/44] target/s390x: move psw_key_valid() to mem_helper.c
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (31 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 32/44] target/s390x: move cpu_mmu_idx_to_asc() to excp_helper.c Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 34/44] target/s390x: move s390_do_cpu_reset() to diag.c Cornelia Huck
                   ` (11 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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)
 {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 34/44] target/s390x: move s390_do_cpu_reset() to diag.c
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (32 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 33/44] target/s390x: move psw_key_valid() to mem_helper.c Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 35/44] target/s390x: move get_per_in_range() to misc_helper.c Cornelia Huck
                   ` (10 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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);
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 35/44] target/s390x: move get_per_in_range() to misc_helper.c
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (33 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 34/44] target/s390x: move s390_do_cpu_reset() to diag.c Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 36/44] target/s390x: introduce internal.h Cornelia Huck
                   ` (9 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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)) {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 36/44] target/s390x: introduce internal.h
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (34 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 35/44] target/s390x: move get_per_in_range() to misc_helper.c Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 37/44] target/s390x: move a couple of functions to cpu.c Cornelia Huck
                   ` (8 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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"
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 37/44] target/s390x: move a couple of functions to cpu.c
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (35 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 36/44] target/s390x: introduce internal.h Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 38/44] s390x: avoid calling kvm_ functions outside of target/s390x/ Cornelia Huck
                   ` (7 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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 */
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 38/44] s390x: avoid calling kvm_ functions outside of target/s390x/
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (36 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 37/44] target/s390x: move a couple of functions to cpu.c Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 39/44] s390x/kvm: move KVM declarations and stubs to separate files Cornelia Huck
                   ` (6 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 39/44] s390x/kvm: move KVM declarations and stubs to separate files
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (37 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 38/44] s390x: avoid calling kvm_ functions outside of target/s390x/ Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 40/44] target/s390x: cleanup cpu.h Cornelia Huck
                   ` (5 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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"
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 40/44] target/s390x: cleanup cpu.h
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (38 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 39/44] s390x/kvm: move KVM declarations and stubs to separate files Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 41/44] s390x/s390-stattrib: Mark the storage attribute as not user_creatable Cornelia Huck
                   ` (4 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: David Hildenbrand <david@redhat.com>

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
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 41/44] s390x/s390-stattrib: Mark the storage attribute as not user_creatable
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (39 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 40/44] target/s390x: cleanup cpu.h Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 42/44] s390-ccw: Fix alignment for CCW1 Cornelia Huck
                   ` (3 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

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 = {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 42/44] s390-ccw: Fix alignment for CCW1
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (40 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 41/44] s390x/s390-stattrib: Mark the storage attribute as not user_creatable Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 43/44] pc-bios/s390-ccw.img: update image Cornelia Huck
                   ` (2 subsequent siblings)
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Farhan Ali,
	qemu-stable, Cornelia Huck

From: Farhan Ali <alifm@linux.vnet.ibm.com>

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
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 43/44] pc-bios/s390-ccw.img: update image
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (41 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 42/44] s390-ccw: Fix alignment for CCW1 Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-30 16:52 ` [Qemu-devel] [PULL 44/44] s390x/pci: fixup trap_msix() Cornelia Huck
  2017-08-31 12:50 ` [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Peter Maydell
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Cornelia Huck,
	qemu-stable

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
zcmeHwdw5jUx%Zk&k|7CU=RSc5dmv)C#o?l&qRixGf&m5yIw+Og1`-WPOeTudYKl3E
z)JsUE$6AjakaSbDIz-xnH*zY+V!bq?7TS72$F>|}b)rE*G5h<y@7{YdiJ_n0bH49+
zzCW1fnXI+fde^(&`+C<}d*Jq>vSPE@BqAS+$Ut3hh%M3EU0T_El1rDEFUAO$NEQ;F
zWATmA`q8F+MwBLPoG?mZ1DFM0s|IeKKYA&~Y3-4c=%TMNpWZ#PSmV)JjFQOYaYQRV
zjangYA5mJI++coVv(~}m%&7lw#u@T6O6HGvGx*cxXdY3D9BrORX|3`9jcC`$E#Im2
zk1S2kYVAfTXxuWi#cA!|`LBd=%K@#=cP6<Qd>N%MonK#9b$)%#h4b=S8uMoJe1szn
zU&|FsR*LfyUfFnio#obd-u_9`eUJDr{8e%7MGU3son%VLV#iQL?j?Cs8`JUeTSfV|
zc7~o=a{g0Cv%NPSz4gKS#-i_x9~hF(x78K}WP<keaho)~YMp6lPvWX&In8T)vXTYs
z4bO`KLLcVW7J(PT@Hhak<MC+V!rU&__-ZQsm151Bs+N{DE&j@8Kbjh9gs-Z4PGw8A
zsB5aP(xHWDv+LDFtu*FslZUli4E$}np9l@!9Mr+ubi2~qO-{Z2hewCuF~88OJ^%3d
zi1wPk+r#rkP7nHJhw`;5_52OY-P$AJdHvzEup$X+8Mko1RqUWz>IXft5Je$|`&h{m
z!YzlD9v9mFtXwQ?1<PC_f0-PwOb{mJBK51DHX$y1o1wc1Iwa6wRdPk_9cGJ7nFOeI
zu|U};L{A4GUv@WzpY=)|0uYw24E0pnjJsu#oRQ+8wu@C2beu=nOtC4G6~9=mJS|M+
z!Cs-*g_<@&nJ6rZUwxlwoYc#+UeEPcxL!l`DK;LzJR}h%Az4Zk9ZH@sgANZ$6<BY>
z>?V)Ay{$x+Cc5P9?I^QR-szPkJK8sgBx$|qV2Yc|rC#BcJH*|RNbZ`dp3-OyISD&t
z^K8iJY!F*%PVqQsZdadTS{}k&#QQ}wmRcshPJhpNkzhmt)f3a0_6MmhzAAA_4Lsw;
z8s%PBhtTNgDppSs6+}TsTGxfFlV|s*iMb>-9^I%6s4p<K74$szJ)L_=vO@;a_70H)
zh~G1WgGc<1>v;@)i0egM=l02K873GP*Ao_|oo_1xgYS^di1WI;CDA9sLY(^(b2yf3
z=W|bTNHXn%r4dxl;W$$emPPf9p%D*!V~mI!L{u=fq1*UaMm(dP`}-QhPSF0fS^>-G
z#<yD81zTzpVnLU(K~=jR5hnZiF05@{xlPzF>N*coIy_WQ>7Ex9-IIlLvr}X%m&0<}
zMUry4s-leFY6`}{5|WkO(9%!TW3UJTiB1l=`Xyn-ti8e-H$YMt*Uwu0Crjr^U900#
z)+&X<7LtOoVry0gZ1NqlDaiOe^z2kmp!Q}QJ|u$$9<L+`k0kcNim7}yZm{puaFfOt
z<BjY2o2shIlmUc1{)BqNwVK~fboV%gC>&2?l~T;<!DEO0TxGi2`<w%wks~C#L%CF#
z;7R834*WGypFL%Kx^jj3(f$nKU~Ja7!MM1PgjkqC`d;lgoPa1G;`(XAz5`)zl$<lg
zGfdH=ME~l<!wD#$Ptf>*Cn#*-!AdwBY;B3V;Q6LIk}WoBn^*>1C(%Cu===Mg40|*_
z94{GKB#yI5mmG1jeI?GIIphiovDKd1HyJs|SXg=@*Aij(()hIf+2A42YZGlDXD`C*
zew&!GKT%AF{H>xx)0r|sRWVywSkdc<8_?va*$>4($2QDg0tuQ(p4H9DG{Mnud?`m7
zhka8|0PSm`$K)Om<M<tMrId&Q#Jw2zvVeHb?Gdn<L{Pp=xfXpFiNtNDKrGo6<~gqO
zd~Sg|C;*cV8~A%j0@99^;6lk!KTS!-csIpK;4N}*4aD_$FjEI+ke_pR5cWA*WEE3G
z!N3(_B57gpw7n|j8KvF)9CSG&!a*|0G3z6yej(@(pko<p;JP7d245=x)ie|1Z&wf7
zI|+mGkT3z;WRgYI$BgN}7*mXW8t85(Jm*ZJ_JsXhzn<$)QC+^8soKtvjocg0y*s&H
z%k@VXGM^#uVe0(qQ`^h|6XfvZwv~a2@R`T9?G8*rsT@cRm{GE|t?eS|S9OP^Z~&Im
zg!#hCPsPG*n}fvRIOQ23EB}s_hbSzM;&jzEK|ZbaA4m;CC+a`lQV<>*-X(HEa?mCw
z65j^TYnzG6tSia41;^p+T}*dA<IUpw0;*3s#ym`Ct<4u^S_{`+4ePPHu@*izn`}b;
zEo<#O5x=scH&Hn#;+5+WX9m>A3T8J6lpix4h{O^c!~>d2q@Wq)UQmVzVo%vD3mdH7
zmXSiSY_lY&H)!a(YJy>{_RpdyUP@HP|2I*YeVpqdruZ(R_?y?gQea0<g%FFfNs6VX
zJW>U(!i%gNOAzrqQj_pteF_C2YwP~;VmmCfUARMX09MO0-Kb2ok=)mZTmiGNu5yKU
zDeb13@hOOw`}!^wW-->2+9ABDO=3cd2Y<Jk16hE-LAg)F0WwS30;#77dtWlcx+`ey
z7am6kzD@efM2|kZUwwfwPatT6f8WnS4lt5IJlby@lE8%5nCn`Wz&%{AVhO~u1U!9=
z#f^CmoG%j>`!vqH$sGb%{OXVOxNmSW1)NL)h0~EAp!80G_NJc{<C!y-jic`wqRcy?
zL%^$T%0ac7W}I+0&pw4Ixq$2EP<`TmG9?KF4?9?_Y(b7gk{iz7j41w0QT$y;n8uuB
ztl3=ujIsWNu%14q+y^W3tNXZrA@_gag;kLa*=NIwY<D|hQ>h_WI4IKkW(%hn8<OD>
z8GUn6Poxo<FGbBam2vbizFAy<n&$%@m~U4I9KlYkA|-@;M6^Moar-k7MX2}vE@V7I
z{&@P&A!h(q1c}EBtG!^tlxq;-LQdV%<{@uF?}RDi3&;*U6#WL&6*Sv~-|);oI54Rx
z8{Cx|R#5X`NUpGJR*>01`V%%~vxrsp<2#^UKx4=Mm(jvFu4R0;bA2V%&pE}k76ASn
z#AZ-NT2(8R@o_5TmB8>nBH!aNmjZ4T)|Xt)2@v7Gy{=4bRlfdIgk&JMx}E);k7fRz
zs54c+W$Cr`lihKI8Gke5Oy)VdxX$yP^CZ#q^{H*5--=Q5+){X-7PnA)9krmyaX0nL
zA*m@7x$H#bvVL)xR^|y$g=Dz4H56z<o_9De{JI26!g?N7A>0+=Pcfe2Xd9sSQhvGa
zpA_@ge5Pc%MCWd&pv*zZR8NOIunW@dg^)MmrU%;T+as(ZQPcHdDGVe93E`f6m`*`5
zO37*Bb?{P9bcK4H@xDlWWnRJBd4}hv9Gqxmy7rp|McfLCqHBT&QeE-jC6i*SJLr<I
z4odE2L9uPOht|Te`Yz)nkF`P<I|&LjUK4V<Y}jX%A}gW!GSRj}IiGX8G{n@Q`K;nf
zea@--Wl;)y`aSTpkq)vTcWezysXo4+>jhNL{s-%0_NaLL>bq{K$)!w_j=Lv^?fV_V
zflScpZfc6wPrEt?dZPTFHJ`PSv1?XvnCnSAQ#Z}@)oExE`r}zISH4ab@Yg1`I44;g
z)4GagppkL?Oz$ta-p5$(XDojPU+lSAyt{~d2T}_XR*X5qaNlRR{{kHQO4j+@_Y&i)
z<N6B>w~pcVAnSjYp0g%!->(^tqfFeB42SFw)c*(I?uFkYPp3R9`vm1#(8nh3eS|c#
zQl?0$$->TAb=-Z7&Ci%OGq#xwe-qj0b&ryDhC0adF@AsN?x4WB&vuIET(Y$5c+ZuQ
zG8Db+zh`Wfj9KGH^M92wmty2}Wd>r@WLP!DL1ePr6C@hhdi*+#oSDY)`aiymv0g}6
zC;WxsbM}uRnh>#m2AY1Wo+ivp(-j1pekh8jAMof*rimkJoaX<(CQPSP_HN1xE<#T4
zz<wFNZMunk`?}e*c3)Kt2xKtY&LO-LRKrU{ZL)4JUoFSnowU9eU#w)w@aQI?d_N+o
zX+%{qBnzs3z%glFPY^9rFlq+#GKa?Np7Ses$PI{we+dPGG1{Is?Y68Ph85d02~X@E
z;w9@{u0O_7S<1Zpv?LHTmj`;SUBA%0GGjxz+$*}KV(uOAk>?3E^8}B(pK*N3^}87d
zWCMBJ9C8NZL<c-}F8u#;jthaHgzU%WUL+wdxF{~n)3Pn~B+04hIdE_uG~(#oEeXAc
zG{U?WJwbD%siYAttIgcYvo2u@?&Nw2)yIF#6kG`JXmVptx65fFEcni692b!MumcGa
zg>)`Kt*M`MFBdcR+r=ipJ&i9*_0(OcX;Ss8SF;AKpbQa$bcsF(R_UF}cw`wULz0ZR
zu4}(tm9VQzG-RInJ(?xvOQv=a*ERp&M%13fK0mxuAmWjyBg2XjW3?4H<dEmX_pt{%
zl@4uUmqcUJza)*MPge@nOOY*GA(M-!J>|#5n_3W||2)*#2QsE2!a;lL1(1t_sK`uX
zDxRRaowXUWi{%GD0YyI{`7s<v=9q^V?s*>b0K-9=fZIgT#jt9Oxl7-#{XATv#gXxU
zMjY`F9oTcz-hEx?!tl<{yl_`%eE1igBCKe8ag&{Ac#G_M^<6wq1-Ec+7;_Ewh)bcb
zT$~>{Fv5kLbSBErfbmQ0F0H`Y)ipsl^C3x`=j?QMgn1_ra~WZocRkr)$b+ht)~wZD
z*kWvGHmV&3b3Gz|Hln};_}h8vm!L_L3bHfk>>SWOjcZI{h9-j)?D1om*4c!Ab)LfO
zFtSrbCR&HdV^>eXEG)m&9c*>?DNoSJmq<fKA%abyeGIY^89M(t?X|Tv!rnr&S>KPq
z@OqQ6fLs5>GT~jEwU_Eyh`p-%<@4K2LBC;b8Jz!Fc@?o&@Ho!@vN-?yau;l-6;y0M
zc@xSCjJ-KB7O@nw@8EgXaQ$JP$Hnt(f#3W<izzAPS>48{bUs(H-o>L9^Qa&4sB?J~
z?=G)B%Jp~X@9EdR&3F3CJkCesG64lD)-VnWk6R4us_L8re;ZIa_GUf@+xv(h(m6U<
z+5a<7^GM$R+5gTXofy%<a1U|cJf49gpEZx_cC6))VK(44bk3$329N1>e1F)b*>Tn_
zuwyTe{Guly#I+Z|F1FzNG~<ld^dF3@Z>0ZgN&g&QQZ)TP4V_xsR!5|^oW@!{W~|4!
z{&%Kl3(@n%o1u=jI!)Hek7RX5MzOD3UguG7@u-)1R3netzfH7NL935b+qG$ksGtzs
zIY4V?=k9<|9)pEqwId3zISdNTgd=4cTj&qS>e?c?ZaPzM`5DjkA<wmq=en5Zx`Uw+
zf3)>B?IVWZQ-{p=xPBW$PiE+Ps?X8Rm)R5D!Ek`Q@tPlx^hU^W$Qyq_<1+rp_^tvM
zh|Q4NGHOlxlIvHZ6+VjWdk5?aYii&9bdIC>Q`*lN=3;`+<Q&K{m+MEEDhIUASwY&5
z817u|Tg~-JTz`S##saQ|p3`pTKFtO>7qD>tpZO%goj3)!Lin>D|Lm2poB6cDW&Yss
z)bMtkr-FLvH}({q?y1PA(s1&(7?OA)Bzj@;*i|Njn`M35#X=Fk|4!k;Q;zZspQ%3-
z>Htg|bXtn<w7x=N7V*e~@E6aE`sSfF7UyOK=rN%-Mx<eNLQD*rP@it6EX%L<Vn1>K
z>%ktZ<`U}9lT6W17Lw8_lMN#SM+`$8-QE)rV$}ikJcKXXy7__8Y<<<Qj98aElPzg3
zY=dqC+C>p?KRwd&R&6sZFFB3jFQWT|RT8h6r6_F}=>ZIT|LMPwYzHrecCjAz{k&f?
zw42I1Jo6&bOa|u!=0dLHBn8@-qf_Bm4={%D&<@AK)CWipX7>LK&ce;PJnj`9ml2`H
zuRa4R;0K6W|E{;%AjQ2J{b;=>LM7HMoY)*6P9;T>q4U#BAMAl+vbh!#?LIKcQ2}rL
zim9pA*Fp=eEUS1YG4Q^92gw_-Gdgz<UtheRV`j~snpuWRz-=P*M>{j(?o!}0<7qZZ
z&`jr$I0@gN<k4A>DSJp}rrp$&giH=n=JUUd7qwGZ$~^`+&&xoRMV<4!jNeA}w(;1N
zOaaybNS!@2sSGXc>QPAiRhlW~uLNgm<yqMeO}s8-q%z*`>9qS*ZGO&AOxK~+h789q
zeu#Y>v`#q1qZGTmSoy%s37+@P2<N<7rtrSpw2<dIpXX)&Pv_NV;5?>yz&$xA?APGj
zK`7TCCeDW}CE)d7ZI|AP>lG47@;>DfoP1fuo~#S-Gzqmdw@Z@XKRGx9{Un7lTy4%9
zc%B%VGhL;+P`Umn@%Q;ZNrP1T@(?64hk5>Y?*BLL=M~RX#TMXKO(A(thtMp*j`ipi
zL$b|^H@S|?5i`8T^=7UUUY2MIum6JA|8&m(;JHK<um7L#0vzABrKIpUUMbQ+1@LjK
zO<%+mJ)lV((0Ime)Z?gO1Z)83DT5)B30i*0_RaSWv~SFy`^gGq{!d}2m`qt0MfjV$
z0DWn}G8wmyE-kj>*3pa8C!*`-`@3b4(yia|&<vmLC27HrpmFUULOZeP@qmi~XeygD
zb#sf$2^}FKcx8`3Jsx$J$BElNr<90q8om;6J0iGY&7a+g`;*AMO#1739Htu>((V-d
zJZL<L@fX<3d4_95Y^RXSE{|mE952PAo&d;s+I<Y)kZe+>sp`=E%r*f}Z5LAkl|pt!
zHsqEh(>AgxzxtJZg}neam!vEbv55F{dA3C07d($^XdcGC0{0BDiWl$~1J{81(NH`|
z$GH{aiBpK1KE`a_khn}-bP@%6E{gnIc1cbFd0QckR7fMRIe^==-RdAoyZ@V&fnEW9
z@d*ygcnN9kravOS*rK!KU}Rm^b;CC`+B%zeFm90e$m_vL(Ol8N_f+BV2INm3Xsru$
z3OCLTkE{vfoErCf7dYu&Pr`X!HlN;|+$O@mgg2$~?ieSI7`AD@MNGyDM{6P7>xKI_
zAo33?xqL2vQj-H&8L->2i^3V1VpCPGB#R>n;a%ZfSXuYl1Nt2zbN!RH@c!;Oe5V-1
zWkfb0j^~3e<!N=F#}(d*{$F{5;b3Q5_z9OMyu<Ev<Fvect}Aj2$v$uM$}(avZpS+8
zb3oe^NW=?keUerv<9sp7&ZdD%3pBGlB+I!XBjohV$BqxyDy(<p#NfOSHQaFYf@jT+
znCnE6BG!+`=>APvW}<zwJrtyKgHQmjlYxDaS!`9t;N<--$OtFKeG;wxB|?sMnSwZz
zkP)%4r=+uzpbUQs%?=986y5Hmc8}X>v!{1u4yqx3w!5QYTyAHg*C|^=E`kNWsTxk#
zY*$h=9O^i)#w~af**v@_3A(Uqdt{W$5NG`&0WtswC6a8W9v4dHknc8`-}j7r)3mM7
zthYNR9N_ayI)4m6%9HUf1>N8+?|YA81o9*|o^sHhA|NwRA@eCH-XD-4pH-4f`NRYd
zm3F!@0VhN$z2iU;1otPB4RsSvOf~){gLYsdt^F&F-GNJ8!a>%F`{2m=S=z->bmNS3
zB;9mAHfx4KH)yZaXb;I9xI@Bo^MOen<dX}OUxLET`0m3jIH3ZB4XgQM*aJVU<t6Hm
z#&22`1azU=PxPd0hKzG)1?!Np0>8u38zDE$Ts$N(tY*zv%?^<Su=?4UtASzn>ChLr
zJF3~X?ss0MXm8)6A{M8-h(kEfMGgzg1chFg%jT7WiNH739mMI6*Mxfm*q+tv3UW`z
zGDxiu-<8A{`O@HhxX~Yn2>IXaS=V~yKrYq3c{h2o7IC)7Vv?47u*8k~;mG=v`fo%B
z<xewjrKmV_t49vbRI*Hntj@?Oxw6W{>(b0kh^Qa-z>#KtpXd1tXA^O6nS!%96CG>l
zcKBKZuS106o1+{xj3|lINC`_M`)^w$W`TD##P%Gqi`2_N-~3K%_zCd512F`rdWa#k
zKWsN0(QI>jp+^ejx|;$sl~pX^^XP;el+I-u@m@;+v-1r?yXhU2ux-<;+DWyE@2gUg
zJ*n!aPhrg<%UtPpZFge)WXy@&2l8A?e3~Y?JGMVecI9phKSgur2gAR`S=LjSHwLgJ
z7?TniL;0NF^gXXL{1oNE`zMJ4d>v_N^!|!HB`tNtNZQ9}vz^Z)%W=+XC7V^Ar}I(u
zr2~@!uyE5@>_MKSn~ghugd1YEb1jm)E5iF=J#8gYc#lg8zex9CI8#3;w&MP2AN%(-
z+)KgM;Lorv_;ZfOCC|s`7sb}TWfb$gu5ge00w?v_5kYZZhZtFo*o7FWT&t??WT!|i
z#GWY~?S=c>5R)l(@JTJLnRtTbQ-nY~Fl%uIPZZgx4^hVG)8h)!Vx<)cy@=?r;F-`D
zB7kR_lnc4iy+<+RnrcYrbbzFTo7uKrTw_2+?ANP;kj+kUyJD9Rt-?K_Ho6a@Ib6Z;
zL42PiiQu~jI1!a8DgrB=1GCIew*qUsT0^!y7I{DR#`~zAQq1*ks!LZ<{gVK!)C0`8
ztHzv|0VTXu#FEvJ^#E_ga!%8G7VU$7qw$HKF|K>4p3ENm^_`5DefbkVvP3?mNPO4e
zisAhPlVaz31H*Gx`N?Wc0?c`#`ftPucr#)3eF7BBCiv6wG`p5>CqBg(7W3?1bNvdc
zkL#oQCl|nD=X1<DNimCh5+7oyc{~DpKFEakf8!4G2%P^6{+QwJ<UX0<0$d+Y^>NQL
zoDFb%CYIRDeTfXWitDiqx0~w!8~|Jv<Y|E{b9C8~j3u;Rgmx3!9m8ZkFgSyvMI66R
zl01{**G7|)B~jcTk<nQNStqc}MrlTAMj6|^MmVE#D!-6I(mbqxd=E&uRC1rg$fY7#
z)Yr%_ent5O<?qRLJpp05@(Eb*T+I4(rwB&Qv|!N|+$JU?kdE!Ln}k=$R=d0z>lMzU
zZ3-~Mj`O?Hh1w_6`#)IG>{z9LNcYSE<Q(=K@{5#0tZMNEZl}n12U7W*XDZ$UabniX
z&|g22*G|<Lk8c9@6f2?oB$R7W#se;+Q+Nd5UE;KYc|ZoyHAA?xIE?voaSDR@Vd48o
zt~eKRX?#lGC|?hTu`0u>dL-~Y7g3{!PxW_T^)M~^l6_bN6L98EwsQ(Mr$-TGq;N0t
z3@2hsV!_<-Q5rklmG6}39hF1y(2K=5L=h+T;eCvwA_skAuwKODZeXjDEdCQQG>tTy
z)Qu>13?sZa(_RMb3SsZHi#FWKDg-foT)yPA0qQtpSG3the%>pgA8&l3Cr-JJclWph
zrf3rmi<|?Kpe?_c74ih}z9i8m(e3R?kyGyJrLT-Jbng6p?!*0bKlGxF@3(<_Gvcpb
zd|%nhZ&>~Ze5egRbbr5xd`PF!Nw~2ixjn4_?{VR6F7T=lzG(`0jkTBe6_Ip6t3cm8
z(CU<8w6TYUlo(d<mY5xH6gY!Pu%>o~Wjq+6W7D89Zfrpz#=E3+Kxg5sesfsqE1(fN
zM4OaWkOPd&V?N&h)G3;RQL=PSgk!&YH*<XHs2sPW7dnpLLVkOSq_7(@N^y6D_rc1h
zBYNRf96g!Hy#&@By8ZU6U(lGbd#R^yu%IIt&r)kw*D<ad>?`=h`{ZdIA4UG@xc_8a
zC;M@qqv6^OTpXXq-ls{L_I!PBkp+zV6Jo_DM0xyWu;Fo9en}Y)aM2$5QG6+nqtocl
zkf)z)MBd}Y--`Y+kwLT#rlD^UzB6E(IO|2!o5Cv&-8~@J1<qd5E+D39b((*0J^M=}
zZy87D-}WOh;qGvEXG*v`A6Y=YE4&wPO3|J0%C1SOiq+`Xh(vQ~y`uPr@*v83l)We|
zDBna$??iow_Y~k8o{I3XPzBwl;W@ybXew=jHpwgDg{AXCLGmilmao(aExNw%_Jq6L
z$N-2J^%k5`z_+%+Q(?Jj$_(towVfF48WZ(M&`77kaRc@YNbw2E=`@((y@(IYFJ?<Y
zbU3O-2e0g?^~m942hLBPkCLQ*2fh!$LY`v?E6(s9#N1DU?qifcP#l5IOr;5^gG=N$
zpP&XlP&<hzYbrT}XT%YD%O^FN<N+I@=ynIS*t_^0r90A>L9!P6c6;lDjo?0>PGMqx
ziu~)?kul*<80S%Fnr$C{dtjM~!VYX<dn)cT$3q_{AaCdcZ?CXE@Ma3@qhCV*bkr@7
z`yu2eQhyp+rg-Fj8Lj5dTww2|h!E<4<nWiY1E?HiN!`#1Y0O1A7@`xbhb%tnLAJI%
z+e9yEA{J#lII?ly{nYnO0d82gxPOM+F-=^Zax-=uchU(abnzhBA?=^z2E2jrUT;(Q
zLul$QWdq{TfO-db-kUxfZ)wp@Vv1Kveh^&lMNbJ?si8MozmjGtUw_k!-Ib|iZK%WH
z)gn4H)CO8+c_qhYWUJN^+0pKTFPBK$?{rBWX2n5oU|Al0E_M47CCBpHw=5mj?H<(V
z4&PLA9@*j*h7Ozhg<I-(LgGQh&H+;{!=&Tg9^sbzos<uv588%x0D^jpC$bbi!ioUf
z2sM#?gOgt}-roTlRsv{P1m(eFUa<cdy*Ii#0%qu)^NXbHBMJSYUtlaW!T6#1ekUlP
zoKT|7&5Yc$KNioV@%bp>f&B|m!UOwDP{ITI%b;=SO^5cP75>=2x-$S9$uiqI&Hc!7
zS-(L<6VQs-Pr8P6LDxa(nl$-5Ry3@Puv4sN@IBIWX<wE=X2AIY-ZrAO4Y}Jf)L<cy
z%)G<t{m7aTg=`_gwj;Ud?Ig<6>Fp%M{==|Tyq&bNU*vmayq$znl1<8$!i2LdGk&RX
zoJZ!6G{-(hlzg$6rOZ@)!TI0Vd#U~OSiE<JGdS~HoG)3ly^%T0ew9Hx<0hPko8JZ=
zQ;~-?#@0+{77E^{W!uiNXVK{d@Pl{z){yL2BDT^VBs~R|IG1&4WnHrUk6lOe9>@KU
zm;`EVGz(4}+SMb_CEcF*wGps=I^jAB9pH`&(z0ORm<)!tl4Sxelejy#UwM$vi<%)n
zSj&+Z(*EH|{Z4ST3SLo)`)kBNXhq%*zk!|bY1G%}fOcq!Vm)wiCVp~;9v$J6tSL{Z
zjn?o`1+BoGGqjuXQ+`U`THe;1jdwngBbZha9dV5H#6v7`K0iM30M+B?Gq;<Rhg6((
z<5YVZoi<{|P5d-@ze8+-lzyR~Bzy@C;O2WU{I6s>csD%yDovtF9d_s*Xy++?@5^T&
zg!}Y9+5?z=3Mx!RJGGn?ZvfaagBk6-MvP&aPAnu!6JMoKC;0q-44?m>m<wsijNPwe
zC(2n?r|)L$&De>W;ESfBYUncoRR4@Dp$)lo7QHDp&7IX|*%pK~`_<2ZZ2@CDAJ~GB
z{1CP(-mmPU7*HhR_XF_I?GKK?wp0D<fl1pRg!FfM(Th_Bx)XeaAfbCiXFX>@qy%pG
zInGgnSh;gBujKZG!=Qap-xSLK5EZ|IN0a~4IT!hVB1-aqJ4*8ZY%O;6%M>|G*z5J@
zqK9GtpORok#P-fd!eN5zl*0XJLBzov7qK)~k~F`5euPDFlux{#`o8kGrR_D!lY<>(
zPa#A^w$UcwFyls`UBr43oxoj9$n{x(;{In96!!^x%u9q}pqlClZ*cv4R3F3lZ~wRw
z+0YYA1>XvOH39ZgUS0v+H{g8SKln@Z?^o=&-NL&9una^O`sD#EBL?$M+_p@Xpf3yZ
zT@%i?O@;STj+Ib`HE3LD8LAz2{6YY4gPT0i>)@xnH#tws&G5n`QI?@eb$bQPLOfu`
zzmAA|$2smDhur?3#JvQ*>Hhrnp}6<?%m2!&PQR-Re8X>eC0t58oN5EjnuM3~^9DR`
zA*tGGXgw<2NGlojeExH4jpw`9&wolbT(|>VVP#`zyoUgod!yIFZ}`0tn~Qtecr@>`
zKi|kB_#EPMe+gDxUTF`W=H0uE&-gyCW%!4AY!$=Da(%VF8Xr7O@A3W$miUksBeZx*
z(Hk7nn*k4jI>c2yGQ-=j^QE;G`AvrvFe{>euLIhZkaiZY<-wm)Hmsf8kAV9zY$<Z$
z1{<amH)J?iLtz6B*fHnP`gqOHWO$VsXO4~%Kon|L<ER}DiM%E1_d}p(&6(yQTRZbS
zw&;1l>nQU?&eP+6&F7<}xm==7qfE}_QPEsp!Cd0ZymOo*A9+(D;u76yorBmkRhej}
zeIjL$v-2fKfzH=^$QU6(eMAj$&ZGS5KLF|YHl+TmgvrW8MACMV3Mj1jBk|E07~v#*
zfJht-LZpAYb)<YhLxvuu$84QLKI7Fmz}h^yPuC;zeqFQCts%)#V*FMK5QQ4_-7?N-
z=mx+zkB*!(#G4>*dXJX&3_I|}9WL%5ug7^LS=8mcgP(?y?k7^&19*S<;ahaa1*&q9
z)e}|sYj21F17TZ*?<Iuk)Gw)5gNuSmp*;?EE4xruqkKFRlqB2(Jwqq;sN>9(Myt*I
zPDr6xyhRdY@cXRo@SPx52AsQLEtA~N@Gi{6_tu~F@Q78|Crrbf`DmYyb9B1X()xpV
zGGmkpqm)Q1ZsK8UH+khCdwKsUUJ=KEE)!0TSZc$mFTf9ls0Y6Oxia2FzrUdzz{EG9
zSLyjazh9&8gJ}=kiSMtOzA=4x<3%K5m2MXad@HMY=g)`U2#UG5Z?}*|V%IMaIq=It
z8rM%e(U*4094A#7CtBDQh_Tc^_zvxuuz%?$&Oj5ti8sbgeIcUpQ{IO}{A|n^!_WHt
zZ{e*B#DjL++?~<>bS)wR;YN$Sh$Iwcm3nK}Ihap!xbOxm{1LyQ@~a;(efM6CGdO87
z-DcxNZW1Uu3j2@Ti`e*gd(7!faL~<TT0ogCNR&<AW)9Mu46)nB?a9aUNT1-}0>%x5
zq&)?&+B_?H>jLafv$S_f@O!sBcrZnTTtPQJsUxV@$18apH!{(S_wqr1o6g}T;n42+
zY5$IMJM7#^B5?zNBunT+nU3-wC><#IR%N7rs|9RZM0>R4bbls})s4nI63IyOU2PuS
zt|I!g(fwTojR`+6Ol#Bh=$`@E3D&BN`N&gAcl^6YO@mxd)HpbEZ-MN{KXY$igq}Eh
zA77)V>^so2@XR<tE$z6^KrQGoqWLJiX!aDLB+js;Z<gqB<PwS_IFUhYgItsK_m3v=
z`$z1Lk+}_va_(uuZUwomMiXwabxQ#5DX=)_9_PR6*CWJ>y8a@+Q;n-6D(!gth3>&T
z0XbszpDoaC@1RHQ7sQpiJ}-wpt$Pa5l15QjwDZV`RFC@}*ZKWl%d=GfAeOYhrz8Ts
zo+08Gx}57Ks#`evz5gk<bLRZX35p-u4JJjjFT1#J*-*>-N4W*RUBoTMyY%;)BW%}W
zbgdchT%c!Ad!z4!JGjS*tkw~IT0eyG>z|DQL;A-;Wm#Q|e^yOhv#;9ktC34RWpYEK
zUv6n_YHDnzmRo#&N4$u4$YM#Od{bSszphcP@!eEc?UUCww&LGQ5KDain;V;NkgFOo
zQ17bo`59q6kE*P%(@>A-#qSm>>*_IyzfrDltgMlju8`L@H?Eg!E1PTNn!1)7;zij~
zccI6<eDP)1uF*f=i$^BvU{afX{?_J(78w){VQTgPQ|XGO@=cBPt?PXtsinHPuF2on
z96cXH71hh-jm>qKo{6u<KL}CZxNan_y7iUod~ypIYHXIB#8FFYoxifG-lq-oHTauv
z(WD_aHqg|wF23+Wr@Y=*Q&$PnM&cvdnwo(XqoRl_WF<7B(ckRDeE#OvYOv>n)Enz7
zA@_z+F=@KPF#ICam^so0{7wE^xxQ|FonQ8CsP_44d^MnmNMM$A-s(1D8eenW+B)hU
zt+%?dwZ4XJqbeG7ByU4V9k2{o4C_8xx|*OMmV(L#GBs92Ep+CCelTJq*&rldS1s2y
z$a+UURH{{F|1C{E!9Z*>ExvW@p#XU;Tapl0H#at{lQorK@>U<=Eb<l=Xl>d^4VcW1
zXV3R6Um;ieW#@)#Mtp>D&Ym-O-USz4H2>nts_GiwS|MoKrpo5^#9OORUI!F@U$gA5
zt!x0@8|v1#u9q8H*H@vfaqW<W)cIQE%KG}on|<(^Xx<m+FDDxF$$b`AHVx}D8s!yi
z!Z-^9rA)KIZxtj{UEA6K|Eq7TzCmt*Dv>!8Ty<lEzpkN`O=sAk>c$$MK4=)Ol?^vE
zG~V1GYyP4Ok>x!!OHsj<g>q$0O|vLiyh4-}mI*SP7Fee&u3B2QqG<VL*AC}TqsvLs
zUe{b%rQ2P@+QvK~S{v#st9%p!fGLlo1*^8DZXIc#*e?a7u2t^RXT!@a?iGb{T?^af
zT6iYxW>_0hN)`p%K(D_Rpq0(lwSsJENLDnBHYNO<xPZ?5wLW=v3z=qhV{=WOC@3t0
z&qV7CbIsAa$#67uvxn@Lf(0Q1@+i=}?=bf;a8TbcizTi{PEy8b6b~O2P3cuy5G*4x
z50N@Yls0Itsd*Zh)}tlsLt|)Em=>5dvpY;4hK|89sb!SDIbvl?9Xyk{X{oODAu{Ji
zsbM;Orp=T&w(AUlD@|_{khDlOB5vsO>bO@FtSE)?5^mTM)`+X!%a@ccx#ALFHEbK+
zCf8Tq(%9-Z>~^MH+0xRwo`^FnS<|Gaxe*4tUM{ClkKd&=H^Yv|VF+}1=eOdPr(6`R
zZ}Q(V0#1{`x>jFH3v8Y(c%83ty$=hBMzKLAu^z2+@Et#06Gk=SOoI=kVwr4e@-@iQ
zVVuTioL*7KsYa9W@3Ppa!Gtfb`+Dy<vVFZyBWV0Y0@B;Z{q0Y0^izGU_F4DFTmR^P
z;mr^FUpn$ezcAhTh(4AI6T#uy*j|ARC(2qXUHS+9Q|NTg7DZ)p`O@X3<xAxio}z-%
z;?e?ldFj$6G=BK!Cj9n|J{$B>qn%nz!YoXA|HF?QHGV<vj9aHho*g;Ur(K#i>-<Q=
z%yZXVzA*Asamf_dd6!Mj)0TsEwRL*W^*7Y7Z)j|~vDtuZ@weV|^M+eC8qXt2cYZ-(
zQSlWerF#3KE6WxyS?XD~+<;qAzVfQ8y{oR#o`=>U?U@9DPa<|Q{3)35?xrKZnfF(%
z8PXp1Y>Gv@ZT=jix6P=SJVoRiL;2pY6px}_WZhrqGXkA%m{?!d)~#!8)^n5LkZZ9j
zB6(?%tLpqMQCM1l<xG9wn&GNtw1`Dbq6Y>-g1$Oh8lrIDj8u*iC(PVJ%S~-#i{D^W
zFK<V=FsjY?ci0TSF?=HlFys#ePan91O3x!dG;R_^OYKy@{Sr{6MOGmikSY2aT9AU$
zzce-zX=5|u$U<=mqDV_qBlQT1C%Lno*!5_VpVd;`Qg;cpu32B%aEn-0w0NalP&jM(
z(#0};2y4TvjlSkatl-F?5Y?M~HzJ@QSr-ETj2VPDMXs$|SBu<!<r2Nx?4xvEu5WE<
z5ga8EM6~3K+X2`@)KaOfmW(Gl79+VpnxpRkm`Ec&QHC2$JCxJfbP1Mac}3BZ6-65J
zqd?R(+}K)&v{lR4N|!8KS-O1HkYuoEudnovGA?4PYnqUkw~PY8s{-e|Ei7NTy0WRV
zy3T*gD6r_$C4m^M$wrs9v4=rm9%USBD1!GA<c@lTj1)#xwvuhoN4Fn!q4tOfITVX8
zL!H7deMXit+A6S`Ez#0d-grc<4<!H6^OwrJKIto=u8*qv8;JS>_MuC3W26jGUSHP&
z=^`64`U(p3Id>fD(blRc&1x$YsEC@p@+RcnOcBU1O|V=F^7nz>3srRw?9p7Ks(W+L
z_9n^?@tlV8G|HK(`s-|zWhmjJ=6g`ygK{TIf&=_-Fy3NS)o1Z<C|b~e;1!gwsOrHq
zA*_k2`r_Lt%T@IydPe`tn8%9#*Q~fbLjP;^C>NmIixO~u1YC?Cr5`2WdkOAYl!+)Y
zUoYs1`55J`_)UD8s=kir*g}+`BX+f_9xg|DE6N8@g3dQEE*9h87(jViRo`sK`M^w7
zeJckg;QtKxxQ9_5M7dX0|MED>w^j8W&}GX(3HoiI=iOIO9#qw17(d2}dt<<jDMa}u
z${JPu?*%9yK)Dko;68d7ehK>e(omME>c=%GccS#8d=_sTCZZfb3AltDoE+SWvK}So
zNdP^cu15JL%8#*pB;r)-9+aR}03S59ak(&UNHR@G92d|HaRHjMRkgbW<+Gyr&ZN7>
zZce;AVN3jv#@u7OH}1aJ`(p}|dd%kL_&>h(>MJk*;iW^re=#Xw%1<DC_z>RJ7=H*Q
zPW2<7Y}EXE`*=}o;ED9pxCiw9t3>g=aponjQfCgnkE`kvCt)X-i{funvnZ*9;y8^5
zpWVmwItu>G#NUtgcCRQN!9@u(0s3`lybunlfd8i`$Zr(I(R?o=zH2nLBSWA^QyJjB
zu#4rR%WF~6QM38F;qod@FmL`=%ZDRdES4=Jo6K(xlY4}2=#Bhte=ht+Iujj%DHijR
zc+g%pghbaI#*@E3136ps&out1*<xuMPEnbz_(F^?$2$Qa$oxA|JltXyCH0yurm4nA
zwiojk@h|=1<yT&P?T`FuFftG0VYk0)Lpfg*kF>o-Nr!;x2?Nui$XKEu{2!!oiQk_8
zI7XElqqO;V4o#2AG2R0HU-V%7+oR}xcYK7{;smdb35bey{$V#3@P8-_Ts6^l##XcZ
zTXqI}wX`FiL0_U6U*nUFcJTia>`7e5eo!3$YH`9Mb_TT3xM$J-AnFzP8XuY;{J(Sz
z4IQJ<f7=MV1s<zaRsY}uJlVSOp?28+ADn2QyvX>#53TdiPV`oYGKvBLi@7*{xc1n8
ztg8W60l0_6qG<mqOxkQQZyAM-djOA10Z~Z&-lTB~Iam?rUPiO{NaM%+!OMT3NB$5!
z2hmUCTr`d%3Ry=5CV*aaFp`%Q{{QlEG;A;$Q9|D_;Qy5p)c<}adp~48le<xzh$+N)
z()X6(d@i9lQ9puDg7>THs~*5V{4M*?qeH}+HTuB+t39B9`kCm1Ra=@2s~#SR!FSAu
zSkHo(uK{1<1G&YV#=1s2|8U4o%m?Esnn%JobRlAM0Cx!f&@-AJ1}zrT%*fnKxy4i)
z-N3F<20ZmxCtaAYesn%~J@G_F>g&lOO@R9PVvsKgAMF3F3bcGOI=)3@XU~tsxBA83
z9~$QI8cNtfT%xM}2~VbOv1s)5?httOk3={$zD!k*z_x6;XQHP!#uC##`gquR+&!xL
zUIozQ46TdaKfb0JG3+MparD=sf9+5|X`N+W%kfjAh5i!!+kg+C{$1c9PaF7u?<nBE
z81f@n@alLYHrGaKHN*tZTM=n1*T68IKJ$PN{(r0u_2yCNEsxg&{#C;XFUPnCFs=uB
z@Qh|}SVK!9B4iS(;-eIrpJ0A=_%jH=2Yz7tSXJNOhq{rZQ#<IS{Of)4j|WDs7i5tQ
z#$-Gf4dD;uJ7xiHf+RfM7cH-i5z&-KL<1Q3(U^L`H=+KQk$!)hHV4meTl~;sSQV*z
z^yP*0I%Y5KfXQzc4av0v7<jmMxHy?V_<txD@K_Iw_}F8<Ri~~b;VPYC)P__Dxx{B<
zT-*QQIPe)?j&Wp14@L9I-i>vFvPGu!nh0~n3DI>7#0Pc||FEil=!6~EhvJhK-C>oF
zXqf&0RK*Ep(GP5!h+#a*+7aPbLw@$}SqYq#z*z~LmB3jEoRz>?37nO{SqYq#z*z~L
zmB3jEoRz@;UlM3k2Ty1end$6=KH57X_&J;Qh~G5u$Gl5_HqLjZ>d(g6iCuqA*Gr?&
z-v_X4&>QG%g+3ixf&WcU`|$Wi{QQj`4In(9())Ef^r!!8#qDRnr2l_pB!<W_cT~+B
z96rwEG@iBh9frmj?PtsHBmus||DQ`w`~TkNVoD8{`Gp$P>+v-&U*TDDnb#{{S+t6Z
zf~AE;R4ywkUXD_T73J>ol`E)v)e3oe(FzZ@3UNh2!6kAo{)fM5@`ZVG@@C6(oU<=<
zUOf9kId?f;JuAUmi`+hIPM$Nbu4+AAK*?*V#Y@L{v03ERHQ<%jCXt7CM0|Pc8d~$J
zTI=d-X4TaQeyXi(sTFxOw=}fevR*6w%_6VaS6@kuBG2#J;Ky?#zxR^ot6j4e@6q|z
z)Z(qt$P<sNTwhlWl#PJaVDX>viM;B@_4H2fchbOj03x3^bi@jSSm$fwj56~7RvPFG
zczRC7*LY9J7+<0Rn)Q<Jq_rmPuQlpnD&oQy`m-^<NqdgOF`_4Wj1f`@jGWboTgLcZ
z)B!&9Qcy{;Q16d~B#KjnTl4cszY#BuQW)_Op!|vE--Q-~HXXkaAB~dZqX9z*4EkyQ
zMfe){^tfo%`;F4&0!;MB7*A~;e2ww?{DmbNuu&$h)}AAOqsM!{J^oDpPiJI&G%stv
zJ-)m`gEY$caAc%biJqTyZL9~n9*j7S*Vp*N?CEP6HyGn3JmJm$2><%{HU<)cQ1d6(
zsOY6Jp32+sHRNZE*WsJ=(rmyRXriCn(P%vD<2!V?W+zw7zuRmK)Jh^d^0^x|V}1=j
i(xs2bKL#FY(kcc#mGsr;9RVeptMr!65k1Cu@xK5OeJYXw

-- 
2.13.5

^ permalink raw reply	[flat|nested] 46+ messages in thread

* [Qemu-devel] [PULL 44/44] s390x/pci: fixup trap_msix()
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (42 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 43/44] pc-bios/s390-ccw.img: update image Cornelia Huck
@ 2017-08-30 16:52 ` Cornelia Huck
  2017-08-31 12:50 ` [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Peter Maydell
  44 siblings, 0 replies; 46+ messages in thread
From: Cornelia Huck @ 2017-08-30 16:52 UTC (permalink / raw)
  To: peter.maydell
  Cc: qemu-devel, rth, agraf, thuth, borntraeger, david, Yi Min Zhao,
	qemu-stable, Cornelia Huck

From: Yi Min Zhao <zyimin@linux.vnet.ibm.com>

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;
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* Re: [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11
  2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
                   ` (43 preceding siblings ...)
  2017-08-30 16:52 ` [Qemu-devel] [PULL 44/44] s390x/pci: fixup trap_msix() Cornelia Huck
@ 2017-08-31 12:50 ` Peter Maydell
  44 siblings, 0 replies; 46+ messages in thread
From: Peter Maydell @ 2017-08-31 12:50 UTC (permalink / raw)
  To: Cornelia Huck
  Cc: QEMU Developers, Richard Henderson, Alexander Graf, Thomas Huth,
	Christian Borntraeger, David Hildenbrand

On 30 August 2017 at 17:52, Cornelia Huck <cohuck@redhat.com> wrote:
> The following changes since commit 1ab5eb4efb91a3d4569b0df6e824cc08ab4bd8ec:
>
>   Update version for v2.10.0 release (2017-08-30 17:02:54 +0100)
>
> are available in the git repository at:
>
>   git://github.com/cohuck/qemu tags/s390x-20170830
>
> for you to fetch changes up to 2f21b8d431030bcb7478ee9521bdfd3d0ef3901d:
>
>   s390x/pci: fixup trap_msix() (2017-08-30 18:23:26 +0200)
>
> ----------------------------------------------------------------
> First batch of s390x patches:
> - 2.11 compat machine
> - support the new --s390-pgste linker option, making it possible to
>   avoid enabling the global vm.allocate_pgste systl if all pieces
>   are in place
> - correctly identify some devices as not hotpluggable
> - clean up some tests and enable them for s390x
> - wire up the diag288 watchdog in tcg
> - clean up dependencies on CONFIG_PCI, making it possible to disable
>   it by hand
> - lots of cleanup in target/s390x/
> - fix alignment of the ccw1 structure in the s390-ccw bios
> - and some more bugfixes
>
> ----------------------------------------------------------------

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 46+ messages in thread

end of thread, other threads:[~2017-08-31 12:51 UTC | newest]

Thread overview: 46+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-30 16:52 [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 01/44] s390x/css: use macro for event-information pending error recover code Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 02/44] s390x/css: generate solicited crw for rchp completion signaling Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 03/44] s390x: introduce 2.11 compat machine Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 04/44] s390x/ipl: The s390-ipl device is not hot-pluggable Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 05/44] tests/boot-sector: Do not overwrite the x86 buffer on other architectures Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 06/44] tests/pxe: Check virtio-net-ccw on s390x Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 07/44] tests: Run filter-redirector and -mirror test only on POSIX systems Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 08/44] tests: Add network filter tests to the check-qtest-s390x list Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 09/44] s390x/tcg: specification exception for unknown diag Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 10/44] watchdog/wdt_diag288: Mark diag288 watchdog as non-hotpluggable Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 11/44] s390x: wire up diag288 in tcg Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 12/44] configure: enable --s390-pgste linker option Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 13/44] 9pfs: fix dependencies Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 14/44] kvm: remove hard dependency on pci Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 15/44] s390x/pci: add stubs Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 16/44] s390x: chsc nt2 events are pci-only Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 17/44] s390x/pci: do not advertise pci on non-pci builds Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 18/44] s390x/ccw: create s390 phb conditionally Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 19/44] s390x/sclp: properly guard pci-specific functions Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 20/44] s390x/pci: fence off instructions for non-pci Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 21/44] s390x: refine pci dependencies Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 22/44] s390x/s390-skeys: Mark the storage key devices with user_creatable = false Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 23/44] s390x/kvm: drop KVMState parameter from s390_get_memslot_count() Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 24/44] s390x/kvm: drop KVMState parameter from kvm_s390_set_mem_limit() Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 25/44] target/s390x: simplify ri_allowed() Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 26/44] target/s390x: simplify gs_allowed() Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 27/44] target/s390x: no need to pass kvm_state to savevm_gtod handlers Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 28/44] s390x/cpumodel: factor out determination of default model name Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 29/44] s390x: drop inclusion of sysemu/kvm.h from some files Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 30/44] target/s390x: move gtod_*() declarations to s390-virtio.h Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 31/44] target/s390x: move cc_name() to helper.c Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 32/44] target/s390x: move cpu_mmu_idx_to_asc() to excp_helper.c Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 33/44] target/s390x: move psw_key_valid() to mem_helper.c Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 34/44] target/s390x: move s390_do_cpu_reset() to diag.c Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 35/44] target/s390x: move get_per_in_range() to misc_helper.c Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 36/44] target/s390x: introduce internal.h Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 37/44] target/s390x: move a couple of functions to cpu.c Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 38/44] s390x: avoid calling kvm_ functions outside of target/s390x/ Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 39/44] s390x/kvm: move KVM declarations and stubs to separate files Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 40/44] target/s390x: cleanup cpu.h Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 41/44] s390x/s390-stattrib: Mark the storage attribute as not user_creatable Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 42/44] s390-ccw: Fix alignment for CCW1 Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 43/44] pc-bios/s390-ccw.img: update image Cornelia Huck
2017-08-30 16:52 ` [Qemu-devel] [PULL 44/44] s390x/pci: fixup trap_msix() Cornelia Huck
2017-08-31 12:50 ` [Qemu-devel] [PULL 00/44] first batch of s390x patches for 2.11 Peter Maydell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.