All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 00/15] first s390x update for 2.13
@ 2018-05-04  7:24 Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 01/15] s390x: introduce 2.13 compat machine Cornelia Huck
                   ` (15 more replies)
  0 siblings, 16 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:24 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Cornelia Huck

The following changes since commit 6f0c4706b35dead265509115ddbd2a8d1af516c1:

  Merge remote-tracking branch 'remotes/kraxel/tags/usb-20180427-pull-request' into staging (2018-04-27 12:27:59 +0100)

are available in the Git repository at:

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

for you to fetch changes up to 532cd4b067d37b96496dbacbfab6c990c063d33d:

  Merge tag 'tags/s390x-2018-05-02' into staging (2018-05-03 16:33:01 +0200)

----------------------------------------------------------------
First s390x pull request for 2.13.
- new machine type
- extend SCLP event masks
- support configuration of consoles via -serial
- firmware improvements: non-sequential entries in boot menu, support
  for indirect loading via .INS files in s390-netboot
- bugfixes and cleanups

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

Claudio Imbrenda (1):
  s390x/sclp: extend SCLP event masks to 64 bits

Collin Walling (4):
  pc-bios/s390-ccw: rename MAX_TABLE_ENTRIES to MAX_BOOT_ENTRIES
  pc-bios/s390-ccw: fix loadparm initialization and int conversion
  pc-bios/s390-ccw: fix non-sequential boot entries (eckd)
  pc-bios/s390-ccw: fix non-sequential boot entries (enum)

Cornelia Huck (2):
  s390x: introduce 2.13 compat machine
  s390-ccw: force diag 308 subcode to unsigned long

David Hildenbrand (1):
  s390x/kvm: cleanup calls to cpu_synchronize_state()

Greg Kurz (1):
  vfio-ccw: introduce vfio_ccw_get_device()

Thomas Huth (6):
  hw/s390x: Allow to configure the consoles with the "-serial" parameter
  pc-bios/s390-ccw: size_t should be unsigned
  pc-bios/s390-ccw/net: Split up net_load() into init, load and release
    parts
  pc-bios/s390-ccw/net: Use diag308 to reset machine before jumping to
    the OS
  pc-bios/s390-ccw/net: Add support for .INS config files
  pc-bios/s390: Update firmware images

 hw/s390x/event-facility.c         |  64 +++++++++++++--
 hw/s390x/ipl.c                    |   4 +
 hw/s390x/s390-pci-inst.c          |   8 --
 hw/s390x/s390-virtio-ccw.c        |  36 +++++++-
 hw/vfio/ccw.c                     |  56 ++++++++-----
 include/hw/boards.h               |   1 -
 include/hw/s390x/event-facility.h |   4 +-
 pc-bios/s390-ccw.img              | Bin 30520 -> 34568 bytes
 pc-bios/s390-ccw/Makefile         |   4 +-
 pc-bios/s390-ccw/bootmap.c        |  79 +++---------------
 pc-bios/s390-ccw/bootmap.h        |   6 --
 pc-bios/s390-ccw/iplb.h           |   3 +-
 pc-bios/s390-ccw/jump2ipl.c       |  91 +++++++++++++++++++++
 pc-bios/s390-ccw/libc.c           |   2 +-
 pc-bios/s390-ccw/libc.h           |   2 +-
 pc-bios/s390-ccw/main.c           |  14 ++--
 pc-bios/s390-ccw/menu.c           |  58 +++++++++----
 pc-bios/s390-ccw/netboot.mak      |   3 +-
 pc-bios/s390-ccw/netmain.c        | 168 +++++++++++++++++++++++++++++++-------
 pc-bios/s390-ccw/s390-ccw.h       |   8 +-
 pc-bios/s390-netboot.img          | Bin 83856 -> 87872 bytes
 target/s390x/kvm.c                |  20 +----
 tests/boot-serial-test.c          |   3 +-
 vl.c                              |  50 ------------
 24 files changed, 436 insertions(+), 248 deletions(-)
 create mode 100644 pc-bios/s390-ccw/jump2ipl.c

-- 
2.14.3

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

* [Qemu-devel] [PULL 01/15] s390x: introduce 2.13 compat machine
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 02/15] s390x/sclp: extend SCLP event masks to 64 bits Cornelia Huck
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Cornelia Huck

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>
---
 hw/s390x/s390-virtio-ccw.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 435f7c99e7..c84098dd17 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -671,6 +671,9 @@ bool css_migration_enabled(void)
     }                                                                         \
     type_init(ccw_machine_register_##suffix)
 
+#define CCW_COMPAT_2_12 \
+        HW_COMPAT_2_12
+
 #define CCW_COMPAT_2_11 \
         HW_COMPAT_2_11 \
         {\
@@ -756,14 +759,26 @@ bool css_migration_enabled(void)
             .value    = "0",\
         },
 
+static void ccw_machine_2_13_instance_options(MachineState *machine)
+{
+}
+
+static void ccw_machine_2_13_class_options(MachineClass *mc)
+{
+}
+DEFINE_CCW_MACHINE(2_13, "2.13", true);
+
 static void ccw_machine_2_12_instance_options(MachineState *machine)
 {
+    ccw_machine_2_13_instance_options(machine);
 }
 
 static void ccw_machine_2_12_class_options(MachineClass *mc)
 {
+    ccw_machine_2_13_class_options(mc);
+    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_12);
 }
-DEFINE_CCW_MACHINE(2_12, "2.12", true);
+DEFINE_CCW_MACHINE(2_12, "2.12", false);
 
 static void ccw_machine_2_11_instance_options(MachineState *machine)
 {
-- 
2.14.3

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

* [Qemu-devel] [PULL 02/15] s390x/sclp: extend SCLP event masks to 64 bits
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 01/15] s390x: introduce 2.13 compat machine Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 03/15] vfio-ccw: introduce vfio_ccw_get_device() Cornelia Huck
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Claudio Imbrenda, Cornelia Huck

From: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>

Extend the SCLP event masks to 64 bits.

Notice that using any of the new bits results in a state that cannot be
migrated to an older version.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
Message-Id: <1520507069-22179-1-git-send-email-imbrenda@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/event-facility.c         | 50 ++++++++++++++++++++++++++++++++-------
 include/hw/s390x/event-facility.h |  2 +-
 2 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 9c24bc6f7c..0dea6cccae 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -26,11 +26,23 @@ typedef struct SCLPEventsBus {
     BusState qbus;
 } SCLPEventsBus;
 
+/* we need to save 32 bit chunks for compatibility */
+#ifdef HOST_WORDS_BIGENDIAN
+#define RECV_MASK_LOWER 1
+#define RECV_MASK_UPPER 0
+#else /* little endian host */
+#define RECV_MASK_LOWER 0
+#define RECV_MASK_UPPER 1
+#endif
+
 struct SCLPEventFacility {
     SysBusDevice parent_obj;
     SCLPEventsBus sbus;
     /* guest's receive mask */
-    sccb_mask_t receive_mask;
+    union {
+        uint32_t receive_mask_pieces[2];
+        sccb_mask_t receive_mask;
+    };
     /*
      * when false, we keep the same broken, backwards compatible behaviour as
      * before, allowing only masks of size exactly 4; when true, we implement
@@ -262,7 +274,7 @@ static void read_event_data(SCLPEventFacility *ef, SCCB *sccb)
     case SCLP_SELECTIVE_READ:
         copy_mask((uint8_t *)&sclp_active_selection_mask, (uint8_t *)&red->mask,
                   sizeof(sclp_active_selection_mask), ef->mask_length);
-        sclp_active_selection_mask = be32_to_cpu(sclp_active_selection_mask);
+        sclp_active_selection_mask = be64_to_cpu(sclp_active_selection_mask);
         if (!sclp_cp_receive_mask ||
             (sclp_active_selection_mask & ~sclp_cp_receive_mask)) {
             sccb->h.response_code =
@@ -294,21 +306,22 @@ static void write_event_mask(SCLPEventFacility *ef, SCCB *sccb)
     }
 
     /*
-     * Note: We currently only support masks up to 4 byte length;
-     *       the remainder is filled up with zeroes. Linux uses
-     *       a 4 byte mask length.
+     * Note: We currently only support masks up to 8 byte length;
+     *       the remainder is filled up with zeroes. Older Linux
+     *       kernels use a 4 byte mask length, newer ones can use both
+     *       8 or 4 depending on what is available on the host.
      */
 
     /* keep track of the guest's capability masks */
     copy_mask((uint8_t *)&tmp_mask, WEM_CP_RECEIVE_MASK(we_mask, mask_length),
               sizeof(tmp_mask), mask_length);
-    ef->receive_mask = be32_to_cpu(tmp_mask);
+    ef->receive_mask = be64_to_cpu(tmp_mask);
 
     /* return the SCLP's capability masks to the guest */
-    tmp_mask = cpu_to_be32(get_host_receive_mask(ef));
+    tmp_mask = cpu_to_be64(get_host_receive_mask(ef));
     copy_mask(WEM_RECEIVE_MASK(we_mask, mask_length), (uint8_t *)&tmp_mask,
               mask_length, sizeof(tmp_mask));
-    tmp_mask = cpu_to_be32(get_host_send_mask(ef));
+    tmp_mask = cpu_to_be64(get_host_send_mask(ef));
     copy_mask(WEM_SEND_MASK(we_mask, mask_length), (uint8_t *)&tmp_mask,
               mask_length, sizeof(tmp_mask));
 
@@ -369,6 +382,13 @@ static void command_handler(SCLPEventFacility *ef, SCCB *sccb, uint64_t code)
     }
 }
 
+static bool vmstate_event_facility_mask64_needed(void *opaque)
+{
+    SCLPEventFacility *ef = opaque;
+
+    return (ef->receive_mask & 0xFFFFFFFF) != 0;
+}
+
 static bool vmstate_event_facility_mask_length_needed(void *opaque)
 {
     SCLPEventFacility *ef = opaque;
@@ -376,6 +396,17 @@ static bool vmstate_event_facility_mask_length_needed(void *opaque)
     return ef->allow_all_mask_sizes;
 }
 
+static const VMStateDescription vmstate_event_facility_mask64 = {
+    .name = "vmstate-event-facility/mask64",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .needed = vmstate_event_facility_mask64_needed,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(receive_mask_pieces[RECV_MASK_LOWER], SCLPEventFacility),
+        VMSTATE_END_OF_LIST()
+     }
+};
+
 static const VMStateDescription vmstate_event_facility_mask_length = {
     .name = "vmstate-event-facility/mask_length",
     .version_id = 0,
@@ -392,10 +423,11 @@ static const VMStateDescription vmstate_event_facility = {
     .version_id = 0,
     .minimum_version_id = 0,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT32(receive_mask, SCLPEventFacility),
+        VMSTATE_UINT32(receive_mask_pieces[RECV_MASK_UPPER], SCLPEventFacility),
         VMSTATE_END_OF_LIST()
      },
     .subsections = (const VMStateDescription * []) {
+        &vmstate_event_facility_mask64,
         &vmstate_event_facility_mask_length,
         NULL
      }
diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h
index 5698e5e96c..8b39a80bb9 100644
--- a/include/hw/s390x/event-facility.h
+++ b/include/hw/s390x/event-facility.h
@@ -73,7 +73,7 @@ typedef struct WriteEventMask {
 #define WEM_RECEIVE_MASK(wem, mask_len) ((wem)->masks + 2 * (mask_len))
 #define WEM_SEND_MASK(wem, mask_len) ((wem)->masks + 3 * (mask_len))
 
-typedef uint32_t sccb_mask_t;
+typedef uint64_t sccb_mask_t;
 
 typedef struct EventBufferHeader {
     uint16_t length;
-- 
2.14.3

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

* [Qemu-devel] [PULL 03/15] vfio-ccw: introduce vfio_ccw_get_device()
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 01/15] s390x: introduce 2.13 compat machine Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 02/15] s390x/sclp: extend SCLP event masks to 64 bits Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 04/15] s390x/kvm: cleanup calls to cpu_synchronize_state() Cornelia Huck
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Greg Kurz, Cornelia Huck

From: Greg Kurz <groug@kaod.org>

A recent patch fixed leaks of the dynamically allocated vcdev->vdev.name
field in vfio_ccw_realize(), but we now have three freeing sites for it.
This is unfortunate and seems to indicate something is wrong with its
life cycle.

The root issue is that vcdev->vdev.name is set before vfio_get_device()
is called, which theoretically prevents to call vfio_put_device() to
do the freeing. Well actually, we could call it anyway  because
vfio_put_base_device() is a nop if the device isn't attached, but this
would be confusing.

This patch hence moves all the logic of attaching the device, including
the "already attached" check, to a separate vfio_ccw_get_device() function,
counterpart of vfio_put_device(). While here, vfio_put_device() is renamed
to vfio_ccw_put_device() for consistency.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <152326891065.266543.9487977590811413472.stgit@bahia.lan>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/vfio/ccw.c | 56 ++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 36 insertions(+), 20 deletions(-)

diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index fe34b50769..e67392c5f9 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -292,12 +292,43 @@ static void vfio_ccw_put_region(VFIOCCWDevice *vcdev)
     g_free(vcdev->io_region);
 }
 
-static void vfio_put_device(VFIOCCWDevice *vcdev)
+static void vfio_ccw_put_device(VFIOCCWDevice *vcdev)
 {
     g_free(vcdev->vdev.name);
     vfio_put_base_device(&vcdev->vdev);
 }
 
+static void vfio_ccw_get_device(VFIOGroup *group, VFIOCCWDevice *vcdev,
+                                Error **errp)
+{
+    char *name = g_strdup_printf("%x.%x.%04x", vcdev->cdev.hostid.cssid,
+                                 vcdev->cdev.hostid.ssid,
+                                 vcdev->cdev.hostid.devid);
+    VFIODevice *vbasedev;
+
+    QLIST_FOREACH(vbasedev, &group->device_list, next) {
+        if (strcmp(vbasedev->name, name) == 0) {
+            error_setg(errp, "vfio: subchannel %s has already been attached",
+                       name);
+            goto out_err;
+        }
+    }
+
+    if (vfio_get_device(group, vcdev->cdev.mdevid, &vcdev->vdev, errp)) {
+        goto out_err;
+    }
+
+    vcdev->vdev.ops = &vfio_ccw_ops;
+    vcdev->vdev.type = VFIO_DEVICE_TYPE_CCW;
+    vcdev->vdev.name = name;
+    vcdev->vdev.dev = &vcdev->cdev.parent_obj.parent_obj;
+
+    return;
+
+out_err:
+    g_free(name);
+}
+
 static VFIOGroup *vfio_ccw_get_group(S390CCWDevice *cdev, Error **errp)
 {
     char *tmp, group_path[PATH_MAX];
@@ -327,7 +358,6 @@ static VFIOGroup *vfio_ccw_get_group(S390CCWDevice *cdev, Error **errp)
 
 static void vfio_ccw_realize(DeviceState *dev, Error **errp)
 {
-    VFIODevice *vbasedev;
     VFIOGroup *group;
     CcwDevice *ccw_dev = DO_UPCAST(CcwDevice, parent_obj, dev);
     S390CCWDevice *cdev = DO_UPCAST(S390CCWDevice, parent_obj, ccw_dev);
@@ -348,22 +378,8 @@ static void vfio_ccw_realize(DeviceState *dev, Error **errp)
         goto out_group_err;
     }
 
-    vcdev->vdev.ops = &vfio_ccw_ops;
-    vcdev->vdev.type = VFIO_DEVICE_TYPE_CCW;
-    vcdev->vdev.name = g_strdup_printf("%x.%x.%04x", cdev->hostid.cssid,
-                                       cdev->hostid.ssid, cdev->hostid.devid);
-    vcdev->vdev.dev = dev;
-    QLIST_FOREACH(vbasedev, &group->device_list, next) {
-        if (strcmp(vbasedev->name, vcdev->vdev.name) == 0) {
-            error_setg(&err, "vfio: subchannel %s has already been attached",
-                       vcdev->vdev.name);
-            g_free(vcdev->vdev.name);
-            goto out_device_err;
-        }
-    }
-
-    if (vfio_get_device(group, cdev->mdevid, &vcdev->vdev, &err)) {
-        g_free(vcdev->vdev.name);
+    vfio_ccw_get_device(group, vcdev, &err);
+    if (err) {
         goto out_device_err;
     }
 
@@ -382,7 +398,7 @@ static void vfio_ccw_realize(DeviceState *dev, Error **errp)
 out_notifier_err:
     vfio_ccw_put_region(vcdev);
 out_region_err:
-    vfio_put_device(vcdev);
+    vfio_ccw_put_device(vcdev);
 out_device_err:
     vfio_put_group(group);
 out_group_err:
@@ -403,7 +419,7 @@ static void vfio_ccw_unrealize(DeviceState *dev, Error **errp)
 
     vfio_ccw_unregister_io_notifier(vcdev);
     vfio_ccw_put_region(vcdev);
-    vfio_put_device(vcdev);
+    vfio_ccw_put_device(vcdev);
     vfio_put_group(group);
 
     if (cdc->unrealize) {
-- 
2.14.3

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

* [Qemu-devel] [PULL 04/15] s390x/kvm: cleanup calls to cpu_synchronize_state()
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (2 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 03/15] vfio-ccw: introduce vfio_ccw_get_device() Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 05/15] hw/s390x: Allow to configure the consoles with the "-serial" parameter Cornelia Huck
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Cornelia Huck

From: David Hildenbrand <david@redhat.com>

We have a call to cpu_synchronize_state() on every kvm_arch_handle_exit().

Let's remove the ones that are no longer needed.

Remaining places (for s390x) are in
- target/s390x/sigp.c, on the target CPU
- target/s390x/cpu.c:s390_cpu_get_crash_info()

While at it, use kvm_cpu_synchronize_state() instead of
cpu_synchronize_state() in KVM code. (suggested by Thomas Huth)

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20180412093521.2469-1-david@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/s390-pci-inst.c |  8 --------
 target/s390x/kvm.c       | 20 +-------------------
 2 files changed, 1 insertion(+), 27 deletions(-)

diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index 3fcc330fe3..02a815fd31 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -155,8 +155,6 @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra)
     S390pciState *s = s390_get_phb();
     int i;
 
-    cpu_synchronize_state(CPU(cpu));
-
     if (env->psw.mask & PSW_MASK_PSTATE) {
         s390_program_interrupt(env, PGM_PRIVILEGED, 4, ra);
         return 0;
@@ -389,8 +387,6 @@ int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra)
     uint32_t fh;
     uint8_t pcias;
 
-    cpu_synchronize_state(CPU(cpu));
-
     if (env->psw.mask & PSW_MASK_PSTATE) {
         s390_program_interrupt(env, PGM_PRIVILEGED, 4, ra);
         return 0;
@@ -487,8 +483,6 @@ int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra)
     uint32_t fh;
     uint8_t pcias;
 
-    cpu_synchronize_state(CPU(cpu));
-
     if (env->psw.mask & PSW_MASK_PSTATE) {
         s390_program_interrupt(env, PGM_PRIVILEGED, 4, ra);
         return 0;
@@ -620,8 +614,6 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra)
     S390IOTLBEntry entry;
     hwaddr start, end;
 
-    cpu_synchronize_state(CPU(cpu));
-
     if (env->psw.mask & PSW_MASK_PSTATE) {
         s390_program_interrupt(env, PGM_PRIVILEGED, 4, ra);
         return 0;
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index fb59d92def..12b90cf5c5 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -1081,7 +1081,6 @@ static int kvm_sclp_service_call(S390CPU *cpu, struct kvm_run *run,
     uint32_t code;
     int r = 0;
 
-    cpu_synchronize_state(CPU(cpu));
     sccb = env->regs[ipbh0 & 0xf];
     code = env->regs[(ipbh0 & 0xf0) >> 4];
 
@@ -1101,8 +1100,6 @@ static int handle_b2(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
     int rc = 0;
     uint16_t ipbh0 = (run->s390_sieic.ipb & 0xffff0000) >> 16;
 
-    cpu_synchronize_state(CPU(cpu));
-
     switch (ipa1) {
     case PRIV_B2_XSCH:
         ioinst_handle_xsch(cpu, env->regs[1], RA_IGNORED);
@@ -1248,7 +1245,6 @@ static int kvm_stpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
     uint8_t 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, RA_IGNORED);
@@ -1266,7 +1262,6 @@ static int kvm_sic_service_call(S390CPU *cpu, struct kvm_run *run)
     uint16_t mode;
     int r;
 
-    cpu_synchronize_state(CPU(cpu));
     mode = env->regs[r1] & 0xffff;
     isc = (env->regs[r3] >> 27) & 0x7;
     r = css_do_sic(env, isc, mode);
@@ -1297,7 +1292,6 @@ static int kvm_pcistb_service_call(S390CPU *cpu, struct kvm_run *run)
     uint8_t 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, RA_IGNORED);
@@ -1313,7 +1307,6 @@ static int kvm_mpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
     uint8_t 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, RA_IGNORED);
@@ -1401,7 +1394,6 @@ static int handle_hypercall(S390CPU *cpu, struct kvm_run *run)
     CPUS390XState *env = &cpu->env;
     int ret;
 
-    cpu_synchronize_state(CPU(cpu));
     ret = s390_virtio_hypercall(env);
     if (ret == -EINVAL) {
         kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION);
@@ -1416,7 +1408,6 @@ static void kvm_handle_diag_288(S390CPU *cpu, struct kvm_run *run)
     uint64_t r1, r3;
     int rc;
 
-    cpu_synchronize_state(CPU(cpu));
     r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
     r3 = run->s390_sieic.ipa & 0x000f;
     rc = handle_diag_288(&cpu->env, r1, r3);
@@ -1429,7 +1420,6 @@ static void kvm_handle_diag_308(S390CPU *cpu, struct kvm_run *run)
 {
     uint64_t r1, r3;
 
-    cpu_synchronize_state(CPU(cpu));
     r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
     r3 = run->s390_sieic.ipa & 0x000f;
     handle_diag_308(&cpu->env, r1, r3, RA_IGNORED);
@@ -1440,8 +1430,6 @@ static int handle_sw_breakpoint(S390CPU *cpu, struct kvm_run *run)
     CPUS390XState *env = &cpu->env;
     unsigned long pc;
 
-    cpu_synchronize_state(CPU(cpu));
-
     pc = env->psw.addr - sw_bp_ilen;
     if (kvm_find_sw_breakpoint(CPU(cpu), pc)) {
         env->psw.addr = pc;
@@ -1493,8 +1481,6 @@ static int kvm_s390_handle_sigp(S390CPU *cpu, uint8_t ipa1, uint32_t ipb)
     int ret;
     uint8_t order;
 
-    cpu_synchronize_state(CPU(cpu));
-
     /* get order code */
     order = decode_basedisp_rs(env, ipb, NULL) & SIGP_ORDER_MASK;
 
@@ -1556,7 +1542,6 @@ static int handle_oper_loop(S390CPU *cpu, struct kvm_run *run)
     CPUState *cs = CPU(cpu);
     PSW oldpsw, newpsw;
 
-    cpu_synchronize_state(cs);
     newpsw.mask = ldq_phys(cs->as, cpu->env.psa +
                            offsetof(LowCore, program_new_psw));
     newpsw.addr = ldq_phys(cs->as, cpu->env.psa +
@@ -1609,7 +1594,6 @@ static int handle_intercept(S390CPU *cpu)
             break;
         case ICPT_WAITPSW:
             /* disabled wait, since enabled wait is handled in kernel */
-            cpu_synchronize_state(cs);
             s390_handle_wait(cpu);
             r = EXCP_HALTED;
             break;
@@ -1651,8 +1635,6 @@ static int handle_tsch(S390CPU *cpu)
     struct kvm_run *run = cs->kvm_run;
     int ret;
 
-    cpu_synchronize_state(cs);
-
     ret = ioinst_handle_tsch(cpu, cpu->env.regs[1], run->s390_tsch.ipb,
                              RA_IGNORED);
     if (ret < 0) {
@@ -1778,7 +1760,7 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
 
     qemu_mutex_lock_iothread();
 
-    cpu_synchronize_state(cs);
+    kvm_cpu_synchronize_state(cs);
 
     switch (run->exit_reason) {
         case KVM_EXIT_S390_SIEIC:
-- 
2.14.3

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

* [Qemu-devel] [PULL 05/15] hw/s390x: Allow to configure the consoles with the "-serial" parameter
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (3 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 04/15] s390x/kvm: cleanup calls to cpu_synchronize_state() Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 06/15] pc-bios/s390-ccw: size_t should be unsigned Cornelia Huck
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Cornelia Huck

From: Thomas Huth <thuth@redhat.com>

The consoles ("sclpconsole" and "sclplmconsole") can only be configured
with "-device" and "-chardev" so far. Other machines use the convenience
option "-serial" to configure the default consoles, even for virtual
consoles like spapr-vty on the pseries machine. So let's support this
option on s390x, too. This way we can easily enable the serial console
here again with "-nodefaults", for example:

qemu-system-s390x -no-shutdown -nographic -nodefaults -serial mon:stdio

... which is way shorter than typing:

qemu-system-s390x -no-shutdown -nographic -nodefaults \
  -chardev stdio,id=c1,mux=on -device sclpconsole,chardev=c1 \
  -mon chardev=c1

The -serial parameter can also be used if you only want to see the QEMU
monitor on stdio without using -nodefaults, but not the console output.
That's something that is pretty impossible with the current code today:

qemu-system-s390x -no-shutdown -nographic -serial none

While we're at it, this patch also maps the second -serial option to the
"sclplmconsole", so that there is now an easy way to configure this second
console on s390x, too, for example:

qemu-system-s390x -no-shutdown -nographic -serial null -serial mon:stdio

Additionally, the new code is also smaller than the old one and we have
less s390x-specific code in vl.c :-)

I've also checked that migration still works as expected by migrating
a guest with console output back and forth between a qemu-system-s390x
that has this patch and an instance without this patch.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1524754794-28005-1-git-send-email-thuth@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 hw/s390x/event-facility.c         | 14 +++++++++++
 hw/s390x/s390-virtio-ccw.c        | 19 +++++++++++++--
 include/hw/boards.h               |  1 -
 include/hw/s390x/event-facility.h |  2 ++
 tests/boot-serial-test.c          |  3 +--
 vl.c                              | 50 ---------------------------------------
 6 files changed, 34 insertions(+), 55 deletions(-)

diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 0dea6cccae..ee5b83448b 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -543,3 +543,17 @@ static void register_types(void)
 }
 
 type_init(register_types)
+
+BusState *sclp_get_event_facility_bus(void)
+{
+    Object *busobj;
+    SCLPEventsBus *sbus;
+
+    busobj = object_resolve_path_type("", TYPE_SCLP_EVENTS_BUS, NULL);
+    sbus = OBJECT_CHECK(SCLPEventsBus, busobj, TYPE_SCLP_EVENTS_BUS);
+    if (!sbus) {
+        return NULL;
+    }
+
+    return &sbus->qbus;
+}
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index c84098dd17..100dfdc96d 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -288,6 +288,15 @@ static void s390_create_virtio_net(BusState *bus, const char *name)
     }
 }
 
+static void s390_create_sclpconsole(const char *type, Chardev *chardev)
+{
+    DeviceState *dev;
+
+    dev = qdev_create(sclp_get_event_facility_bus(), type);
+    qdev_prop_set_chr(dev, "chardev", chardev);
+    qdev_init_nofail(dev);
+}
+
 static void ccw_init(MachineState *machine)
 {
     int ret;
@@ -346,6 +355,14 @@ static void ccw_init(MachineState *machine)
     /* Create VirtIO network adapters */
     s390_create_virtio_net(BUS(css_bus), "virtio-net-ccw");
 
+    /* init consoles */
+    if (serial_hd(0)) {
+        s390_create_sclpconsole("sclpconsole", serial_hd(0));
+    }
+    if (serial_hd(1)) {
+        s390_create_sclpconsole("sclplmconsole", serial_hd(1));
+    }
+
     /* Register savevm handler for guest TOD clock */
     register_savevm_live(NULL, "todclock", 0, 1, &savevm_gtod, NULL);
 }
@@ -470,10 +487,8 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
     mc->block_default_type = IF_VIRTIO;
     mc->no_cdrom = 1;
     mc->no_floppy = 1;
-    mc->no_serial = 1;
     mc->no_parallel = 1;
     mc->no_sdcard = 1;
-    mc->use_sclp = 1;
     mc->max_cpus = S390_MAX_CPUS;
     mc->has_hotpluggable_cpus = true;
     mc->get_hotplug_handler = s390_get_hotplug_handler;
diff --git a/include/hw/boards.h b/include/hw/boards.h
index a609239112..5c5eee55e6 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -180,7 +180,6 @@ struct MachineClass {
     unsigned int no_serial:1,
         no_parallel:1,
         use_virtcon:1,
-        use_sclp:1,
         no_floppy:1,
         no_cdrom:1,
         no_sdcard:1,
diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h
index 8b39a80bb9..6cf71cec38 100644
--- a/include/hw/s390x/event-facility.h
+++ b/include/hw/s390x/event-facility.h
@@ -210,4 +210,6 @@ typedef struct SCLPEventFacilityClass {
     bool (*event_pending)(SCLPEventFacility *ef);
 } SCLPEventFacilityClass;
 
+BusState *sclp_get_event_facility_bus(void);
+
 #endif
diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c
index 011525d8cf..4d6815c3e0 100644
--- a/tests/boot-serial-test.c
+++ b/tests/boot-serial-test.c
@@ -96,8 +96,7 @@ static testdef_t tests[] = {
     { "sparc", "SS-4", "", "MB86904" },
     { "sparc", "SS-600MP", "", "TMS390Z55" },
     { "sparc64", "sun4u", "", "UltraSPARC" },
-    { "s390x", "s390-ccw-virtio",
-      "-nodefaults -device sclpconsole,chardev=serial0", "virtio device" },
+    { "s390x", "s390-ccw-virtio", "", "virtio device" },
     { "m68k", "mcf5208evb", "", "TT", sizeof(kernel_mcf5208), kernel_mcf5208 },
     { "microblaze", "petalogix-s3adsp1800", "", "TT",
       sizeof(kernel_pls3adsp1800), kernel_pls3adsp1800 },
diff --git a/vl.c b/vl.c
index 7487535dca..806eec2ef6 100644
--- a/vl.c
+++ b/vl.c
@@ -133,7 +133,6 @@ int main(int argc, char **argv)
 #include "sysemu/iothread.h"
 
 #define MAX_VIRTIO_CONSOLES 1
-#define MAX_SCLP_CONSOLES 1
 
 static const char *data_dir[16];
 static int data_dir_idx;
@@ -158,7 +157,6 @@ static int num_serial_hds = 0;
 static Chardev **serial_hds = NULL;
 Chardev *parallel_hds[MAX_PARALLEL_PORTS];
 Chardev *virtcon_hds[MAX_VIRTIO_CONSOLES];
-Chardev *sclp_hds[MAX_SCLP_CONSOLES];
 int win2k_install_hack = 0;
 int singlestep = 0;
 int smp_cpus;
@@ -210,7 +208,6 @@ static int has_defaults = 1;
 static int default_serial = 1;
 static int default_parallel = 1;
 static int default_virtcon = 1;
-static int default_sclp = 1;
 static int default_monitor = 1;
 static int default_floppy = 1;
 static int default_cdrom = 1;
@@ -2588,39 +2585,6 @@ static int virtcon_parse(const char *devname)
     return 0;
 }
 
-static int sclp_parse(const char *devname)
-{
-    QemuOptsList *device = qemu_find_opts("device");
-    static int index = 0;
-    char label[32];
-    QemuOpts *dev_opts;
-
-    if (strcmp(devname, "none") == 0) {
-        return 0;
-    }
-    if (index == MAX_SCLP_CONSOLES) {
-        error_report("too many sclp consoles");
-        exit(1);
-    }
-
-    assert(arch_type == QEMU_ARCH_S390X);
-
-    dev_opts = qemu_opts_create(device, NULL, 0, NULL);
-    qemu_opt_set(dev_opts, "driver", "sclpconsole", &error_abort);
-
-    snprintf(label, sizeof(label), "sclpcon%d", index);
-    sclp_hds[index] = qemu_chr_new(label, devname);
-    if (!sclp_hds[index]) {
-        error_report("could not connect sclp console"
-                     " to character backend '%s'", devname);
-        return -1;
-    }
-    qemu_opt_set(dev_opts, "chardev", label, &error_abort);
-
-    index++;
-    return 0;
-}
-
 static int debugcon_parse(const char *devname)
 {
     QemuOpts *opts;
@@ -4254,9 +4218,6 @@ int main(int argc, char **argv, char **envp)
     if (!has_defaults || !machine_class->use_virtcon) {
         default_virtcon = 0;
     }
-    if (!has_defaults || !machine_class->use_sclp) {
-        default_sclp = 0;
-    }
     if (!has_defaults || machine_class->no_floppy) {
         default_floppy = 0;
     }
@@ -4303,16 +4264,11 @@ int main(int argc, char **argv, char **envp)
             add_device_config(DEV_SERIAL, "mon:stdio");
         } else if (default_virtcon && default_monitor) {
             add_device_config(DEV_VIRTCON, "mon:stdio");
-        } else if (default_sclp && default_monitor) {
-            add_device_config(DEV_SCLP, "mon:stdio");
         } else {
             if (default_serial)
                 add_device_config(DEV_SERIAL, "stdio");
             if (default_virtcon)
                 add_device_config(DEV_VIRTCON, "stdio");
-            if (default_sclp) {
-                add_device_config(DEV_SCLP, "stdio");
-            }
             if (default_monitor)
                 monitor_parse("stdio", "readline", false);
         }
@@ -4325,9 +4281,6 @@ int main(int argc, char **argv, char **envp)
             monitor_parse("vc:80Cx24C", "readline", false);
         if (default_virtcon)
             add_device_config(DEV_VIRTCON, "vc:80Cx24C");
-        if (default_sclp) {
-            add_device_config(DEV_SCLP, "vc:80Cx24C");
-        }
     }
 
 #if defined(CONFIG_VNC)
@@ -4577,9 +4530,6 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     if (foreach_device_config(DEV_VIRTCON, virtcon_parse) < 0)
         exit(1);
-    if (foreach_device_config(DEV_SCLP, sclp_parse) < 0) {
-        exit(1);
-    }
     if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0)
         exit(1);
 
-- 
2.14.3

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

* [Qemu-devel] [PULL 06/15] pc-bios/s390-ccw: size_t should be unsigned
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (4 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 05/15] hw/s390x: Allow to configure the consoles with the "-serial" parameter Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 07/15] pc-bios/s390-ccw: rename MAX_TABLE_ENTRIES to MAX_BOOT_ENTRIES Cornelia Huck
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel

From: Thomas Huth <thuth@redhat.com>

"size_t" should be an unsigned type according to the C standard.
Thus we should also use this convention in the s390-ccw firmware to avoid
confusion. I checked the sources, and apart from one spot in libc.c, the
code should all be fine with this change.

Buglink: https://bugs.launchpad.net/qemu/+bug/1753437
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/libc.c | 2 +-
 pc-bios/s390-ccw/libc.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pc-bios/s390-ccw/libc.c b/pc-bios/s390-ccw/libc.c
index 38ea77d7aa..a786566c4c 100644
--- a/pc-bios/s390-ccw/libc.c
+++ b/pc-bios/s390-ccw/libc.c
@@ -63,7 +63,7 @@ uint64_t atoui(const char *str)
  */
 char *uitoa(uint64_t num, char *str, size_t len)
 {
-    size_t num_idx = 1; /* account for NUL */
+    long num_idx = 1; /* account for NUL */
     uint64_t tmp = num;
 
     IPL_assert(str != NULL, "uitoa: no space allocated to store string");
diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h
index 63ece70c6b..818517ff5d 100644
--- a/pc-bios/s390-ccw/libc.h
+++ b/pc-bios/s390-ccw/libc.h
@@ -12,7 +12,7 @@
 #ifndef S390_CCW_LIBC_H
 #define S390_CCW_LIBC_H
 
-typedef long               size_t;
+typedef unsigned long      size_t;
 typedef int                bool;
 typedef unsigned char      uint8_t;
 typedef unsigned short     uint16_t;
-- 
2.14.3

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

* [Qemu-devel] [PULL 07/15] pc-bios/s390-ccw: rename MAX_TABLE_ENTRIES to MAX_BOOT_ENTRIES
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (5 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 06/15] pc-bios/s390-ccw: size_t should be unsigned Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion Cornelia Huck
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Collin Walling

From: Collin Walling <walling@linux.ibm.com>

The MAX_TABLE_ENTRIES constant has a name that is too generic. As we
want to declare a limit for boot menu entries, let's rename it to a more
fitting MAX_BOOT_ENTRIES and set its value to 31 (30 boot entries and
1 default entry). Also we move it from bootmap.h to s390-ccw.h to make
it available for menu.c in a later patch.

Signed-off-by: Collin Walling <walling@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/bootmap.c  | 6 +++---
 pc-bios/s390-ccw/bootmap.h  | 2 --
 pc-bios/s390-ccw/s390-ccw.h | 2 ++
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 9287b7a70f..b767fa2afc 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -297,7 +297,7 @@ static void run_eckd_boot_script(block_number_t bmt_block_nr,
     }
 
     debug_print_int("loadparm", loadparm);
-    IPL_assert(loadparm <= MAX_TABLE_ENTRIES, "loadparm value greater than"
+    IPL_assert(loadparm < MAX_BOOT_ENTRIES, "loadparm value greater than"
                " maximum number of boot entries allowed");
 
     memset(sec, FREE_SPACE_FILLER, sizeof(sec));
@@ -585,7 +585,7 @@ static void ipl_scsi(void)
     read_block(mbr->pt.blockno, sec, "Error reading Program Table");
     IPL_assert(magic_match(sec, ZIPL_MAGIC), "No zIPL magic in PT");
 
-    while (program_table_entries <= MAX_TABLE_ENTRIES) {
+    while (program_table_entries < MAX_BOOT_ENTRIES) {
         if (!prog_table->entry[program_table_entries].scsi.blockno) {
             break;
         }
@@ -600,7 +600,7 @@ static void ipl_scsi(void)
     }
 
     debug_print_int("loadparm", loadparm);
-    IPL_assert(loadparm <= MAX_TABLE_ENTRIES, "loadparm value greater than"
+    IPL_assert(loadparm < MAX_BOOT_ENTRIES, "loadparm value greater than"
                " maximum number of boot entries allowed");
 
     zipl_run(&prog_table->entry[loadparm].scsi); /* no return */
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index 07eb600b00..732c1112ce 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -57,8 +57,6 @@ typedef union BootMapPointer {
     ExtEckdBlockPtr xeckd;
 } __attribute__ ((packed)) BootMapPointer;
 
-#define MAX_TABLE_ENTRIES  30
-
 /* aka Program Table */
 typedef struct BootMapTable {
     uint8_t magic[4];
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index fd18da22c6..2c9e6017b7 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -94,6 +94,8 @@ bool menu_is_enabled_zipl(void);
 int menu_get_enum_boot_index(int entries);
 bool menu_is_enabled_enum(void);
 
+#define MAX_BOOT_ENTRIES  31
+
 static inline void fill_hex(char *out, unsigned char val)
 {
     const char hex[] = "0123456789abcdef";
-- 
2.14.3

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

* [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (6 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 07/15] pc-bios/s390-ccw: rename MAX_TABLE_ENTRIES to MAX_BOOT_ENTRIES Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-15  8:45   ` Laszlo Ersek
  2018-05-04  7:25 ` [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd) Cornelia Huck
                   ` (7 subsequent siblings)
  15 siblings, 1 reply; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Collin Walling

From: Collin Walling <walling@linux.ibm.com>

Rename the loadparm char array in main.c to loadparm_str and
increased the size by one byte to account for a null termination
when converting the loadparm string to an int  via atoui. We
also allow the boot menu to be enabled when loadparm is set to
an empty string or a series of spaces.

Signed-off-by: Collin Walling <walling@linux.ibm.com>
Reported-by: Vasily Gorbik <gor@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 hw/s390x/ipl.c          |  4 ++++
 pc-bios/s390-ccw/main.c | 14 +++++++-------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index fb554ab156..150f6c0582 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -373,6 +373,10 @@ int s390_ipl_set_loadparm(uint8_t *loadparm)
             loadparm[i] = ascii2ebcdic[(uint8_t) lp[i]];
         }
 
+        if (i < 8) {
+            memset(loadparm + i, 0x40, 8 - i); /* fill with EBCDIC spaces */
+        }
+
         g_free(lp);
         return 0;
     }
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 9d9f8cf4d3..26f9adf84a 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -15,11 +15,11 @@
 char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
 static SubChannelId blk_schid = { .one = 1 };
 IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
-static char loadparm[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+static char loadparm_str[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 QemuIplParameters qipl;
 
 #define LOADPARM_PROMPT "PROMPT  "
-#define LOADPARM_EMPTY  "........"
+#define LOADPARM_EMPTY  "        "
 #define BOOT_MENU_FLAG_MASK (QIPL_FLAG_BM_OPTS_CMD | QIPL_FLAG_BM_OPTS_ZIPL)
 
 /*
@@ -45,7 +45,7 @@ void panic(const char *string)
 
 unsigned int get_loadparm_index(void)
 {
-    return atoui(loadparm);
+    return atoui(loadparm_str);
 }
 
 static bool find_dev(Schib *schib, int dev_no)
@@ -80,13 +80,13 @@ static bool find_dev(Schib *schib, int dev_no)
 
 static void menu_setup(void)
 {
-    if (memcmp(loadparm, LOADPARM_PROMPT, 8) == 0) {
+    if (memcmp(loadparm_str, LOADPARM_PROMPT, 8) == 0) {
         menu_set_parms(QIPL_FLAG_BM_OPTS_CMD, 0);
         return;
     }
 
     /* If loadparm was set to any other value, then do not enable menu */
-    if (memcmp(loadparm, LOADPARM_EMPTY, 8) != 0) {
+    if (memcmp(loadparm_str, LOADPARM_EMPTY, 8) != 0) {
         return;
     }
 
@@ -116,8 +116,8 @@ static void virtio_setup(void)
      */
     enable_mss_facility();
 
-    sclp_get_loadparm_ascii(loadparm);
-    memcpy(ldp + 10, loadparm, 8);
+    sclp_get_loadparm_ascii(loadparm_str);
+    memcpy(ldp + 10, loadparm_str, 8);
     sclp_print(ldp);
 
     memcpy(&qipl, early_qipl, sizeof(QemuIplParameters));
-- 
2.14.3

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

* [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd)
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (7 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-15  8:46   ` Laszlo Ersek
  2018-05-04  7:25 ` [Qemu-devel] [PULL 10/15] pc-bios/s390-ccw: fix non-sequential boot entries (enum) Cornelia Huck
                   ` (6 subsequent siblings)
  15 siblings, 1 reply; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Collin Walling

From: Collin Walling <walling@linux.ibm.com>

zIPL boot menu entries can be non-sequential. Let's account
for this issue for the s390 zIPL boot menu. Since this boot
menu is actually an imitation and is not completely capable
of everything the real zIPL menu can do, let's also print a
different banner to the user.

Signed-off-by: Collin Walling <walling@linux.ibm.com>
Reported-by: Vasily Gorbik <gor@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/menu.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index 96eec81e84..aaf5d61ae6 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -158,7 +158,7 @@ static void boot_menu_prompt(bool retry)
     }
 }
 
-static int get_boot_index(int entries)
+static int get_boot_index(bool *valid_entries)
 {
     int boot_index;
     bool retry = false;
@@ -168,7 +168,8 @@ static int get_boot_index(int entries)
         boot_menu_prompt(retry);
         boot_index = get_index();
         retry = true;
-    } while (boot_index < 0 || boot_index >= entries);
+    } while (boot_index < 0 || boot_index >= MAX_BOOT_ENTRIES ||
+             !valid_entries[boot_index]);
 
     sclp_print("\nBooting entry #");
     sclp_print(uitoa(boot_index, tmp, sizeof(tmp)));
@@ -176,7 +177,8 @@ static int get_boot_index(int entries)
     return boot_index;
 }
 
-static void zipl_println(const char *data, size_t len)
+/* Returns the entry number that was printed */
+static int zipl_print_entry(const char *data, size_t len)
 {
     char buf[len + 2];
 
@@ -185,12 +187,15 @@ static void zipl_println(const char *data, size_t len)
     buf[len + 1] = '\0';
 
     sclp_print(buf);
+
+    return buf[0] == ' ' ? atoui(buf + 1) : atoui(buf);
 }
 
 int menu_get_zipl_boot_index(const char *menu_data)
 {
     size_t len;
-    int entries;
+    int entry;
+    bool valid_entries[MAX_BOOT_ENTRIES] = {false};
     uint16_t zipl_flag = *(uint16_t *)(menu_data - ZIPL_FLAG_OFFSET);
     uint16_t zipl_timeout = *(uint16_t *)(menu_data - ZIPL_TIMEOUT_OFFSET);
 
@@ -202,19 +207,25 @@ int menu_get_zipl_boot_index(const char *menu_data)
         timeout = zipl_timeout * 1000;
     }
 
-    /* Print and count all menu items, including the banner */
-    for (entries = 0; *menu_data; entries++) {
+    /* Print banner */
+    sclp_print("s390-ccw zIPL Boot Menu\n\n");
+    menu_data += strlen(menu_data) + 1;
+
+    /* Print entries */
+    while (*menu_data) {
         len = strlen(menu_data);
-        zipl_println(menu_data, len);
+        entry = zipl_print_entry(menu_data, len);
         menu_data += len + 1;
 
-        if (entries < 2) {
+        valid_entries[entry] = true;
+
+        if (entry == 0) {
             sclp_print("\n");
         }
     }
 
     sclp_print("\n");
-    return get_boot_index(entries - 1); /* subtract 1 to exclude banner */
+    return get_boot_index(valid_entries);
 }
 
 
-- 
2.14.3

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

* [Qemu-devel] [PULL 10/15] pc-bios/s390-ccw: fix non-sequential boot entries (enum)
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (8 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd) Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 11/15] pc-bios/s390-ccw/net: Split up net_load() into init, load and release parts Cornelia Huck
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Collin Walling

From: Collin Walling <walling@linux.ibm.com>

zIPL boot menu entries can be non-sequential. Let's account
for this issue for the s390 enumerated boot menu. Since we
can no longer print a range of available entries to the
user, we have to present a list of each available entry.

An example of this menu:

  s390-ccw Enumerated Boot Menu.

   [0] default

   [1]
   [2]
   [7]
   [8]
   [9]
  [11]
  [12]

  Please choose:

Signed-off-by: Collin Walling <walling@linux.ibm.com>
Reported-by: Vasily Gorbik <gor@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/bootmap.c  | 12 +++++++-----
 pc-bios/s390-ccw/menu.c     | 29 ++++++++++++++++++++---------
 pc-bios/s390-ccw/s390-ccw.h |  2 +-
 3 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index b767fa2afc..e41e715624 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -565,6 +565,8 @@ static void ipl_scsi(void)
     int program_table_entries = 0;
     BootMapTable *prog_table = (void *)sec;
     unsigned int loadparm = get_loadparm_index();
+    bool valid_entries[MAX_BOOT_ENTRIES] = {false};
+    size_t i;
 
     /* Grab the MBR */
     memset(sec, FREE_SPACE_FILLER, sizeof(sec));
@@ -585,18 +587,18 @@ static void ipl_scsi(void)
     read_block(mbr->pt.blockno, sec, "Error reading Program Table");
     IPL_assert(magic_match(sec, ZIPL_MAGIC), "No zIPL magic in PT");
 
-    while (program_table_entries < MAX_BOOT_ENTRIES) {
-        if (!prog_table->entry[program_table_entries].scsi.blockno) {
-            break;
+    for (i = 0; i < MAX_BOOT_ENTRIES; i++) {
+        if (prog_table->entry[i].scsi.blockno) {
+            valid_entries[i] = true;
+            program_table_entries++;
         }
-        program_table_entries++;
     }
 
     debug_print_int("program table entries", program_table_entries);
     IPL_assert(program_table_entries != 0, "Empty Program Table");
 
     if (menu_is_enabled_enum()) {
-        loadparm = menu_get_enum_boot_index(program_table_entries);
+        loadparm = menu_get_enum_boot_index(valid_entries);
     }
 
     debug_print_int("loadparm", loadparm);
diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index aaf5d61ae6..82a4ae6315 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -228,19 +228,30 @@ int menu_get_zipl_boot_index(const char *menu_data)
     return get_boot_index(valid_entries);
 }
 
-
-int menu_get_enum_boot_index(int entries)
+int menu_get_enum_boot_index(bool *valid_entries)
 {
-    char tmp[4];
+    char tmp[3];
+    int i;
 
-    sclp_print("s390x Enumerated Boot Menu.\n\n");
+    sclp_print("s390-ccw Enumerated Boot Menu.\n\n");
 
-    sclp_print(uitoa(entries, tmp, sizeof(tmp)));
-    sclp_print(" entries detected. Select from boot index 0 to ");
-    sclp_print(uitoa(entries - 1, tmp, sizeof(tmp)));
-    sclp_print(".\n\n");
+    for (i = 0; i < MAX_BOOT_ENTRIES; i++) {
+        if (valid_entries[i]) {
+            if (i < 10) {
+                sclp_print(" ");
+            }
+            sclp_print("[");
+            sclp_print(uitoa(i, tmp, sizeof(tmp)));
+            sclp_print("]");
+            if (i == 0) {
+                sclp_print(" default\n");
+            }
+            sclp_print("\n");
+        }
+    }
 
-    return get_boot_index(entries);
+    sclp_print("\n");
+    return get_boot_index(valid_entries);
 }
 
 void menu_set_parms(uint8_t boot_menu_flag, uint32_t boot_menu_timeout)
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index 2c9e6017b7..a1bdb4cc2a 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -91,7 +91,7 @@ void zipl_load(void);
 void menu_set_parms(uint8_t boot_menu_flag, uint32_t boot_menu_timeout);
 int menu_get_zipl_boot_index(const char *menu_data);
 bool menu_is_enabled_zipl(void);
-int menu_get_enum_boot_index(int entries);
+int menu_get_enum_boot_index(bool *valid_entries);
 bool menu_is_enabled_enum(void);
 
 #define MAX_BOOT_ENTRIES  31
-- 
2.14.3

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

* [Qemu-devel] [PULL 11/15] pc-bios/s390-ccw/net: Split up net_load() into init, load and release parts
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (9 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 10/15] pc-bios/s390-ccw: fix non-sequential boot entries (enum) Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 12/15] pc-bios/s390-ccw/net: Use diag308 to reset machine before jumping to the OS Cornelia Huck
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel

From: Thomas Huth <thuth@redhat.com>

When we want to support pxelinux-style network booting later, we've got
to do several TFTP transfers - and we do not want to apply for a new IP
address via DHCP each time. So split up net_load into three parts:

1. net_init(), which initializes virtio-net, gets an IP address via DHCP
   and prints out the related information.

2. The tftp_load call is now moved directly into the main() function

3. A new net_release() function which should tear down the network stack
   before we are done in the firmware.

This will make it easier to extend the code in the next patches.

Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/netmain.c | 63 +++++++++++++++++++++++++++-------------------
 1 file changed, 37 insertions(+), 26 deletions(-)

diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index d86d46b03f..8fa9e6c945 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -128,13 +128,13 @@ static void seed_rng(uint8_t mac[])
     srand(seed);
 }
 
-static int tftp_load(filename_ip_t *fnip, void *buffer, int len,
-                     unsigned int retries, int ip_vers)
+static int tftp_load(filename_ip_t *fnip, void *buffer, int len)
 {
     tftp_err_t tftp_err;
     int rc;
 
-    rc = tftp(fnip, buffer, len, retries, &tftp_err, 1, 1428, ip_vers);
+    rc = tftp(fnip, buffer, len, DEFAULT_TFTP_RETRIES, &tftp_err, 1, 1428,
+              ip_version);
 
     if (rc > 0) {
         printf("  TFTP: Received %s (%d KBytes)\n", fnip->filename,
@@ -199,20 +199,19 @@ static int tftp_load(filename_ip_t *fnip, void *buffer, int len,
     return rc;
 }
 
-static int net_load(char *buffer, int len)
+static int net_init(filename_ip_t *fn_ip)
 {
-    filename_ip_t fn_ip;
     uint8_t mac[6];
     int rc;
 
-    memset(&fn_ip, 0, sizeof(filename_ip_t));
+    memset(fn_ip, 0, sizeof(filename_ip_t));
 
     rc = virtio_net_init(mac);
     if (rc < 0) {
         puts("Could not initialize network device");
         return -101;
     }
-    fn_ip.fd = rc;
+    fn_ip->fd = rc;
 
     printf("  Using MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
            mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
@@ -220,10 +219,10 @@ static int net_load(char *buffer, int len)
     set_mac_address(mac);    /* init ethernet layer */
     seed_rng(mac);
 
-    rc = dhcp(&fn_ip, DEFAULT_BOOT_RETRIES);
+    rc = dhcp(fn_ip, DEFAULT_BOOT_RETRIES);
     if (rc >= 0) {
         if (ip_version == 4) {
-            set_ipv4_address(fn_ip.own_ip);
+            set_ipv4_address(fn_ip->own_ip);
         }
     } else {
         puts("Could not get IP address");
@@ -232,18 +231,18 @@ static int net_load(char *buffer, int len)
 
     if (ip_version == 4) {
         printf("  Using IPv4 address: %d.%d.%d.%d\n",
-              (fn_ip.own_ip >> 24) & 0xFF, (fn_ip.own_ip >> 16) & 0xFF,
-              (fn_ip.own_ip >>  8) & 0xFF, fn_ip.own_ip & 0xFF);
+              (fn_ip->own_ip >> 24) & 0xFF, (fn_ip->own_ip >> 16) & 0xFF,
+              (fn_ip->own_ip >>  8) & 0xFF, fn_ip->own_ip & 0xFF);
     } else if (ip_version == 6) {
         char ip6_str[40];
-        ipv6_to_str(fn_ip.own_ip6.addr, ip6_str);
+        ipv6_to_str(fn_ip->own_ip6.addr, ip6_str);
         printf("  Using IPv6 address: %s\n", ip6_str);
     }
 
     if (rc == -2) {
         printf("ARP request to TFTP server (%d.%d.%d.%d) failed\n",
-               (fn_ip.server_ip >> 24) & 0xFF, (fn_ip.server_ip >> 16) & 0xFF,
-               (fn_ip.server_ip >>  8) & 0xFF, fn_ip.server_ip & 0xFF);
+               (fn_ip->server_ip >> 24) & 0xFF, (fn_ip->server_ip >> 16) & 0xFF,
+               (fn_ip->server_ip >>  8) & 0xFF, fn_ip->server_ip & 0xFF);
         return -102;
     }
     if (rc == -4 || rc == -3) {
@@ -251,28 +250,31 @@ static int net_load(char *buffer, int len)
         return -107;
     }
 
+    printf("  Using TFTP server: ");
     if (ip_version == 4) {
-        printf("  Requesting file \"%s\" via TFTP from %d.%d.%d.%d\n",
-               fn_ip.filename,
-               (fn_ip.server_ip >> 24) & 0xFF, (fn_ip.server_ip >> 16) & 0xFF,
-               (fn_ip.server_ip >>  8) & 0xFF, fn_ip.server_ip & 0xFF);
+        printf("%d.%d.%d.%d\n",
+               (fn_ip->server_ip >> 24) & 0xFF, (fn_ip->server_ip >> 16) & 0xFF,
+               (fn_ip->server_ip >>  8) & 0xFF, fn_ip->server_ip & 0xFF);
     } else if (ip_version == 6) {
         char ip6_str[40];
-        printf("  Requesting file \"%s\" via TFTP from ", fn_ip.filename);
-        ipv6_to_str(fn_ip.server_ip6.addr, ip6_str);
+        ipv6_to_str(fn_ip->server_ip6.addr, ip6_str);
         printf("%s\n", ip6_str);
     }
 
-    /* Do the TFTP load and print error message if necessary */
-    rc = tftp_load(&fn_ip, buffer, len, DEFAULT_TFTP_RETRIES, ip_version);
-
-    if (ip_version == 4) {
-        dhcp_send_release(fn_ip.fd);
+    if (strlen((char *)fn_ip->filename) > 0) {
+        printf("  Bootfile name: '%s'\n", fn_ip->filename);
     }
 
     return rc;
 }
 
+static void net_release(filename_ip_t *fn_ip)
+{
+    if (ip_version == 4) {
+        dhcp_send_release(fn_ip->fd);
+    }
+}
+
 void panic(const char *string)
 {
     sclp_print(string);
@@ -344,6 +346,7 @@ static void virtio_setup(void)
 
 void main(void)
 {
+    filename_ip_t fn_ip;
     int rc;
 
     sclp_setup();
@@ -351,7 +354,15 @@ void main(void)
 
     virtio_setup();
 
-    rc = net_load(NULL, (long)_start);
+    rc = net_init(&fn_ip);
+    if (rc) {
+        panic("Network initialization failed. Halting.\n");
+    }
+
+    rc = tftp_load(&fn_ip, NULL, (long)_start);
+
+    net_release(&fn_ip);
+
     if (rc > 0) {
         sclp_print("Network loading done, starting kernel...\n");
         asm volatile (" lpsw 0(%0) " : : "r"(0) : "memory");
-- 
2.14.3

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

* [Qemu-devel] [PULL 12/15] pc-bios/s390-ccw/net: Use diag308 to reset machine before jumping to the OS
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (10 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 11/15] pc-bios/s390-ccw/net: Split up net_load() into init, load and release parts Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 13/15] pc-bios/s390-ccw/net: Add support for .INS config files Cornelia Huck
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel

From: Thomas Huth <thuth@redhat.com>

The netboot firmware so far simply jumped directly into the OS kernel
after the download has been completed. This, however, bears the risk
that the virtio-net device still might be active in the background and
incoming packets are still placed into the buffers - which could destroy
memory of the now-running Linux kernel in case it did not take over the
device fast enough. Also the SCLP console is not put into a well-defined
state here. We should hand over the system in a clean state when jumping
into the kernel, so let's use the same mechanism as it's done in the
main s390-ccw firmware and reset the machine with diag308 into a clean
state before jumping into the OS kernel code. To be able to share the
code with the main s390-ccw firmware, the related functions are now
extracted from bootmap.c into a new file called jump2ipl.c.

Since we now also set the boot device schid at address 184 for the network
boot device, this patch also slightly changes the way how we detect the
entry points for non-ELF binary images: The code now looks for the "S390EP"
magic first and then jumps to 0x10000 in case it has been found. This is
necessary for booting from network devices, since the normal kernel code
(where the PSW at ddress 0 points to) tries to do a block load from the
boot device. This of course fails for a virtio-net device and causes the
kernel to abort with a panic-PSW silently.

Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/Makefile    |  4 +-
 pc-bios/s390-ccw/bootmap.c   | 63 +-----------------------------
 pc-bios/s390-ccw/bootmap.h   |  4 --
 pc-bios/s390-ccw/jump2ipl.c  | 91 ++++++++++++++++++++++++++++++++++++++++++++
 pc-bios/s390-ccw/netboot.mak |  3 +-
 pc-bios/s390-ccw/netmain.c   | 11 +++++-
 pc-bios/s390-ccw/s390-ccw.h  |  4 ++
 7 files changed, 111 insertions(+), 69 deletions(-)
 create mode 100644 pc-bios/s390-ccw/jump2ipl.c

diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index 1712c2d95d..439e3cc9c9 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -9,7 +9,9 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw)
 
 .PHONY : all clean build-all
 
-OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o menu.o
+OBJECTS = start.o main.o bootmap.o jump2ipl.o sclp.o menu.o \
+	  virtio.o virtio-scsi.o virtio-blkdev.o libc.o
+
 QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS))
 QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float
 QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index e41e715624..7aef65ab67 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -29,14 +29,6 @@
 /* Scratch space */
 static uint8_t sec[MAX_SECTOR_SIZE*4] __attribute__((__aligned__(PAGE_SIZE)));
 
-typedef struct ResetInfo {
-    uint32_t ipl_mask;
-    uint32_t ipl_addr;
-    uint32_t ipl_continue;
-} ResetInfo;
-
-static ResetInfo save;
-
 const uint8_t el_torito_magic[] = "EL TORITO SPECIFICATION"
                                   "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
 
@@ -57,53 +49,6 @@ static inline bool is_iso_vd_valid(IsoVolDesc *vd)
            vd->type <= VOL_DESC_TYPE_PARTITION;
 }
 
-static void jump_to_IPL_2(void)
-{
-    ResetInfo *current = 0;
-
-    void (*ipl)(void) = (void *) (uint64_t) current->ipl_continue;
-    *current = save;
-    ipl(); /* should not return */
-}
-
-static void jump_to_IPL_code(uint64_t address)
-{
-    /* store the subsystem information _after_ the bootmap was loaded */
-    write_subsystem_identification();
-
-    /* prevent unknown IPL types in the guest */
-    if (iplb.pbt == S390_IPL_TYPE_QEMU_SCSI) {
-        iplb.pbt = S390_IPL_TYPE_CCW;
-        set_iplb(&iplb);
-    }
-
-    /*
-     * The IPL PSW is at address 0. We also must not overwrite the
-     * content of non-BIOS memory after we loaded the guest, so we
-     * save the original content and restore it in jump_to_IPL_2.
-     */
-    ResetInfo *current = 0;
-
-    save = *current;
-    current->ipl_addr = (uint32_t) (uint64_t) &jump_to_IPL_2;
-    current->ipl_continue = address & 0x7fffffff;
-
-    debug_print_int("set IPL addr to", current->ipl_continue);
-
-    /* Ensure the guest output starts fresh */
-    sclp_print("\n");
-
-    /*
-     * HACK ALERT.
-     * We use the load normal reset to keep r15 unchanged. jump_to_IPL_2
-     * can then use r15 as its stack pointer.
-     */
-    asm volatile("lghi 1,1\n\t"
-                 "diag 1,1,0x308\n\t"
-                 : : : "1", "memory");
-    panic("\n! IPL returns !\n");
-}
-
 /***********************************************************************
  * IPL an ECKD DASD (CDL or LDL/CMS format)
  */
@@ -729,13 +674,7 @@ static void load_iso_bc_entry(IsoBcSection *load)
                         (void *)((uint64_t)bswap16(s.load_segment)),
                         blks_to_load);
 
-    /* Trying to get PSW at zero address */
-    if (*((uint64_t *)0) & IPL_PSW_MASK) {
-        jump_to_IPL_code((*((uint64_t *)0)) & 0x7fffffff);
-    }
-
-    /* Try default linux start address */
-    jump_to_IPL_code(KERN_IMAGE_START);
+    jump_to_low_kernel();
 }
 
 static uint32_t find_iso_bc(void)
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index 732c1112ce..a085212077 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -353,10 +353,6 @@ static inline uint32_t iso_733_to_u32(uint64_t x)
 #define ISO_SECTOR_SIZE 2048
 /* El Torito specifies boot image size in 512 byte blocks */
 #define ET_SECTOR_SHIFT 2
-#define KERN_IMAGE_START 0x010000UL
-#define PSW_MASK_64 0x0000000100000000ULL
-#define PSW_MASK_32 0x0000000080000000ULL
-#define IPL_PSW_MASK (PSW_MASK_32 | PSW_MASK_64)
 
 #define ISO_PRIMARY_VD_SECTOR 16
 
diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
new file mode 100644
index 0000000000..266f1502b9
--- /dev/null
+++ b/pc-bios/s390-ccw/jump2ipl.c
@@ -0,0 +1,91 @@
+/*
+ * QEMU s390-ccw firmware - jump to IPL code
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+
+#include "libc.h"
+#include "s390-ccw.h"
+
+#define KERN_IMAGE_START 0x010000UL
+#define PSW_MASK_64 0x0000000100000000ULL
+#define PSW_MASK_32 0x0000000080000000ULL
+#define IPL_PSW_MASK (PSW_MASK_32 | PSW_MASK_64)
+
+typedef struct ResetInfo {
+    uint32_t ipl_mask;
+    uint32_t ipl_addr;
+    uint32_t ipl_continue;
+} ResetInfo;
+
+static ResetInfo save;
+
+static void jump_to_IPL_2(void)
+{
+    ResetInfo *current = 0;
+
+    void (*ipl)(void) = (void *) (uint64_t) current->ipl_continue;
+    *current = save;
+    ipl(); /* should not return */
+}
+
+void jump_to_IPL_code(uint64_t address)
+{
+    /* store the subsystem information _after_ the bootmap was loaded */
+    write_subsystem_identification();
+
+    /* prevent unknown IPL types in the guest */
+    if (iplb.pbt == S390_IPL_TYPE_QEMU_SCSI) {
+        iplb.pbt = S390_IPL_TYPE_CCW;
+        set_iplb(&iplb);
+    }
+
+    /*
+     * The IPL PSW is at address 0. We also must not overwrite the
+     * content of non-BIOS memory after we loaded the guest, so we
+     * save the original content and restore it in jump_to_IPL_2.
+     */
+    ResetInfo *current = 0;
+
+    save = *current;
+    current->ipl_addr = (uint32_t) (uint64_t) &jump_to_IPL_2;
+    current->ipl_continue = address & 0x7fffffff;
+
+    debug_print_int("set IPL addr to", current->ipl_continue);
+
+    /* Ensure the guest output starts fresh */
+    sclp_print("\n");
+
+    /*
+     * HACK ALERT.
+     * We use the load normal reset to keep r15 unchanged. jump_to_IPL_2
+     * can then use r15 as its stack pointer.
+     */
+    asm volatile("lghi 1,1\n\t"
+                 "diag 1,1,0x308\n\t"
+                 : : : "1", "memory");
+    panic("\n! IPL returns !\n");
+}
+
+void jump_to_low_kernel(void)
+{
+    /*
+     * If it looks like a Linux binary, i.e. there is the "S390EP" magic from
+     * arch/s390/kernel/head.S here, then let's jump to the well-known Linux
+     * kernel start address (when jumping to the PSW-at-zero address instead,
+     * the kernel startup code fails when we booted from a network device).
+     */
+    if (!memcmp((char *)0x10008, "S390EP", 6)) {
+        jump_to_IPL_code(KERN_IMAGE_START);
+    }
+
+    /* Trying to get PSW at zero address */
+    if (*((uint64_t *)0) & IPL_PSW_MASK) {
+        jump_to_IPL_code((*((uint64_t *)0)) & 0x7fffffff);
+    }
+
+    /* No other option left, so use the Linux kernel start address */
+    jump_to_IPL_code(KERN_IMAGE_START);
+}
diff --git a/pc-bios/s390-ccw/netboot.mak b/pc-bios/s390-ccw/netboot.mak
index a25d238144..4f64128c6c 100644
--- a/pc-bios/s390-ccw/netboot.mak
+++ b/pc-bios/s390-ccw/netboot.mak
@@ -1,7 +1,8 @@
 
 SLOF_DIR := $(SRC_PATH)/roms/SLOF
 
-NETOBJS := start.o sclp.o virtio.o virtio-net.o netmain.o libnet.a libc.a
+NETOBJS := start.o sclp.o virtio.o virtio-net.o jump2ipl.o netmain.o \
+	   libnet.a libc.a
 
 LIBC_INC := -nostdinc -I$(SLOF_DIR)/lib/libc/include
 LIBNET_INC := -I$(SLOF_DIR)/lib/libnet
diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index 8fa9e6c945..69a82c0d56 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -283,6 +283,15 @@ void panic(const char *string)
     }
 }
 
+void write_subsystem_identification(void)
+{
+    SubChannelId *schid = (SubChannelId *) 184;
+    uint32_t *zeroes = (uint32_t *) 188;
+
+    *schid = net_schid;
+    *zeroes = 0;
+}
+
 static bool find_net_dev(Schib *schib, int dev_no)
 {
     int i, r;
@@ -365,7 +374,7 @@ void main(void)
 
     if (rc > 0) {
         sclp_print("Network loading done, starting kernel...\n");
-        asm volatile (" lpsw 0(%0) " : : "r"(0) : "memory");
+        jump_to_low_kernel();
     }
 
     panic("Failed to load OS from network\n");
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index a1bdb4cc2a..9828aa233d 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -87,6 +87,10 @@ ulong get_second(void);
 /* bootmap.c */
 void zipl_load(void);
 
+/* jump2ipl.c */
+void jump_to_IPL_code(uint64_t address);
+void jump_to_low_kernel(void);
+
 /* menu.c */
 void menu_set_parms(uint8_t boot_menu_flag, uint32_t boot_menu_timeout);
 int menu_get_zipl_boot_index(const char *menu_data);
-- 
2.14.3

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

* [Qemu-devel] [PULL 13/15] pc-bios/s390-ccw/net: Add support for .INS config files
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (11 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 12/15] pc-bios/s390-ccw/net: Use diag308 to reset machine before jumping to the OS Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 14/15] s390-ccw: force diag 308 subcode to unsigned long Cornelia Huck
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel

From: Thomas Huth <thuth@redhat.com>

The .INS config files can normally be found on CD-ROM ISO images,
so by supporting these files, it is now possible to boot directly
when the TFTP server is set up with the contents of such an CD-ROM
image.

Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/netmain.c | 100 ++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 95 insertions(+), 5 deletions(-)

diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index 69a82c0d56..600024155b 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -39,8 +39,12 @@
 
 extern char _start[];
 
+#define KERNEL_ADDR             ((void *)0L)
+#define KERNEL_MAX_SIZE         ((long)_start)
+
 char stack[PAGE_SIZE * 8] __attribute__((aligned(PAGE_SIZE)));
 IplParameterBlock iplb __attribute__((aligned(PAGE_SIZE)));
+static char cfgbuf[2048];
 
 static SubChannelId net_schid = { .one = 1 };
 static int ip_version = 4;
@@ -136,9 +140,15 @@ static int tftp_load(filename_ip_t *fnip, void *buffer, int len)
     rc = tftp(fnip, buffer, len, DEFAULT_TFTP_RETRIES, &tftp_err, 1, 1428,
               ip_version);
 
-    if (rc > 0) {
-        printf("  TFTP: Received %s (%d KBytes)\n", fnip->filename,
-               rc / 1024);
+    if (rc < 0) {
+        /* Make sure that error messages are put into a new line */
+        printf("\n  ");
+    }
+
+    if (rc > 1024) {
+        printf("  TFTP: Received %s (%d KBytes)\n", fnip->filename, rc / 1024);
+    } else if (rc > 0) {
+        printf("  TFTP: Received %s (%d Bytes)\n", fnip->filename, rc);
     } else if (rc == -1) {
         puts("unknown TFTP error");
     } else if (rc == -2) {
@@ -275,6 +285,83 @@ static void net_release(filename_ip_t *fn_ip)
     }
 }
 
+/**
+ * Load via information from a .INS file (which can be found on CD-ROMs
+ * for example)
+ */
+static int handle_ins_cfg(filename_ip_t *fn_ip, char *cfg, int cfgsize)
+{
+    char *ptr;
+    int rc = -1, llen;
+    void *destaddr;
+    char *insbuf = cfg;
+
+    ptr = strchr(insbuf, '\n');
+    if (!ptr) {
+        puts("Does not seem to be a valid .INS file");
+        return -1;
+    }
+
+    *ptr = 0;
+    printf("\nParsing .INS file:\n %s\n", &insbuf[2]);
+
+    insbuf = ptr + 1;
+    while (*insbuf && insbuf < cfg + cfgsize) {
+        ptr = strchr(insbuf, '\n');
+        if (ptr) {
+            *ptr = 0;
+        }
+        llen = strlen(insbuf);
+        if (!llen) {
+            insbuf = ptr + 1;
+            continue;
+        }
+        ptr = strchr(insbuf, ' ');
+        if (!ptr) {
+            puts("Missing space separator in .INS file");
+            return -1;
+        }
+        *ptr = 0;
+        strncpy((char *)fn_ip->filename, insbuf, sizeof(fn_ip->filename));
+        destaddr = (char *)atol(ptr + 1);
+        rc = tftp_load(fn_ip, destaddr, (long)_start - (long)destaddr);
+        if (rc <= 0) {
+            break;
+        }
+        insbuf += llen + 1;
+    }
+
+    return rc;
+}
+
+static int net_try_direct_tftp_load(filename_ip_t *fn_ip)
+{
+    int rc;
+    void *loadaddr = (void *)0x2000;  /* Load right after the low-core */
+
+    rc = tftp_load(fn_ip, loadaddr, KERNEL_MAX_SIZE - (long)loadaddr);
+    if (rc < 0) {
+        return rc;
+    } else if (rc < 8) {
+        printf("'%s' is too small (%i bytes only).\n", fn_ip->filename, rc);
+        return -1;
+    }
+
+    /* Check whether it is a configuration file instead of a kernel */
+    if (rc < sizeof(cfgbuf) - 1) {
+        memcpy(cfgbuf, loadaddr, rc);
+        cfgbuf[rc] = 0;    /* Make sure that it is NUL-terminated */
+        if (!strncmp("* ", cfgbuf, 2)) {
+            return handle_ins_cfg(fn_ip, cfgbuf, rc);
+        }
+    }
+
+    /* Move kernel to right location */
+    memmove(KERNEL_ADDR, loadaddr, rc);
+
+    return rc;
+}
+
 void panic(const char *string)
 {
     sclp_print(string);
@@ -356,7 +443,7 @@ static void virtio_setup(void)
 void main(void)
 {
     filename_ip_t fn_ip;
-    int rc;
+    int rc, fnlen;
 
     sclp_setup();
     sclp_print("Network boot starting...\n");
@@ -368,7 +455,10 @@ void main(void)
         panic("Network initialization failed. Halting.\n");
     }
 
-    rc = tftp_load(&fn_ip, NULL, (long)_start);
+    fnlen = strlen((char *)fn_ip.filename);
+    if (fnlen > 0 && fn_ip.filename[fnlen - 1] != '/') {
+        rc = net_try_direct_tftp_load(&fn_ip);
+    }
 
     net_release(&fn_ip);
 
-- 
2.14.3

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

* [Qemu-devel] [PULL 14/15] s390-ccw: force diag 308 subcode to unsigned long
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (12 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 13/15] pc-bios/s390-ccw/net: Add support for .INS config files Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04  7:25 ` [Qemu-devel] [PULL 15/15] pc-bios/s390: Update firmware images Cornelia Huck
  2018-05-04 12:48 ` [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Peter Maydell
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel,
	Cornelia Huck, qemu-stable

We currently pass an integer as the subcode parameter. However,
the upper bits of the register containing the subcode need to
be 0, which is not guaranteed unless we explicitly specify the
subcode to be an unsigned long value.

Fixes: d046c51dad3 ("pc-bios/s390-ccw: Get device address via diag 308/6")
Cc: qemu-stable@nongnu.org
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Tested-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/iplb.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
index 5357a36d51..ded20c834e 100644
--- a/pc-bios/s390-ccw/iplb.h
+++ b/pc-bios/s390-ccw/iplb.h
@@ -101,10 +101,11 @@ static inline bool manage_iplb(IplParameterBlock *iplb, bool store)
 {
     register unsigned long addr asm("0") = (unsigned long) iplb;
     register unsigned long rc asm("1") = 0;
+    unsigned long subcode = store ? 6 : 5;
 
     asm volatile ("diag %0,%2,0x308\n"
                   : "+d" (addr), "+d" (rc)
-                  : "d" (store ? 6 : 5)
+                  : "d" (subcode)
                   : "memory", "cc");
     return rc == 0x01;
 }
-- 
2.14.3

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

* [Qemu-devel] [PULL 15/15] pc-bios/s390: Update firmware images
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (13 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 14/15] s390-ccw: force diag 308 subcode to unsigned long Cornelia Huck
@ 2018-05-04  7:25 ` Cornelia Huck
  2018-05-04 12:48 ` [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Peter Maydell
  15 siblings, 0 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-04  7:25 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, qemu-devel

From: Thomas Huth <thuth@redhat.com>

s390-ccw.img contains fixes for the boot menu, and s390-netboot.img
contains the support for .INS files and the patch for resetting the
machine with diag308.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw.img     | Bin 30520 -> 34568 bytes
 pc-bios/s390-netboot.img | Bin 83856 -> 87872 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img
index fdd6809c707274be47b21fac102c41942f1379d7..450a076dc0ad9f2babc7f2e3005ea05a1082a808 100644
GIT binary patch
literal 34568
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

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

diff --git a/pc-bios/s390-netboot.img b/pc-bios/s390-netboot.img
index 31f3d141cde6320d696e6945046c75d140488df3..ef561efd2e222e03138705e9cf30d9e125a7970e 100644
GIT binary patch
literal 87872
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

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

-- 
2.14.3

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

* Re: [Qemu-devel] [PULL 00/15] first s390x update for 2.13
  2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
                   ` (14 preceding siblings ...)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 15/15] pc-bios/s390: Update firmware images Cornelia Huck
@ 2018-05-04 12:48 ` Peter Maydell
  15 siblings, 0 replies; 22+ messages in thread
From: Peter Maydell @ 2018-05-04 12:48 UTC (permalink / raw)
  To: Cornelia Huck
  Cc: Christian Borntraeger, Alexander Graf, Richard Henderson,
	David Hildenbrand, Thomas Huth, qemu-s390x, QEMU Developers

On 4 May 2018 at 08:24, Cornelia Huck <cohuck@redhat.com> wrote:
> The following changes since commit 6f0c4706b35dead265509115ddbd2a8d1af516c1:
>
>   Merge remote-tracking branch 'remotes/kraxel/tags/usb-20180427-pull-request' into staging (2018-04-27 12:27:59 +0100)
>
> are available in the Git repository at:
>
>   git://github.com/cohuck/qemu tags/s390x-20180504
>
> for you to fetch changes up to 532cd4b067d37b96496dbacbfab6c990c063d33d:
>
>   Merge tag 'tags/s390x-2018-05-02' into staging (2018-05-03 16:33:01 +0200)
>
> ----------------------------------------------------------------
> First s390x pull request for 2.13.
> - new machine type
> - extend SCLP event masks
> - support configuration of consoles via -serial
> - firmware improvements: non-sequential entries in boot menu, support
>   for indirect loading via .INS files in s390-netboot
> - bugfixes and cleanups
>
> ----------------------------------------------------------------

Applied, thanks.

-- PMM

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

* Re: [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion
  2018-05-04  7:25 ` [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion Cornelia Huck
@ 2018-05-15  8:45   ` Laszlo Ersek
  2018-05-22 12:44     ` Cornelia Huck
  0 siblings, 1 reply; 22+ messages in thread
From: Laszlo Ersek @ 2018-05-15  8:45 UTC (permalink / raw)
  To: Cornelia Huck, Peter Maydell
  Cc: Thomas Huth, David Hildenbrand, Alexander Graf, qemu-devel,
	Christian Borntraeger, qemu-s390x, Collin Walling,
	Richard Henderson

I've come across this patch in downstream review (although I really have
zero background in s390x), and Cornelia suggested I might want to repeat
my comments on the upstream list too:

On 05/04/18 09:25, Cornelia Huck wrote:
> From: Collin Walling <walling@linux.ibm.com>
> 
> Rename the loadparm char array in main.c to loadparm_str and
> increased the size by one byte to account for a null termination
> when converting the loadparm string to an int  via atoui. We
> also allow the boot menu to be enabled when loadparm is set to
> an empty string or a series of spaces.
> 
> Signed-off-by: Collin Walling <walling@linux.ibm.com>
> Reported-by: Vasily Gorbik <gor@linux.ibm.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  hw/s390x/ipl.c          |  4 ++++
>  pc-bios/s390-ccw/main.c | 14 +++++++-------
>  2 files changed, 11 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index fb554ab156..150f6c0582 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -373,6 +373,10 @@ int s390_ipl_set_loadparm(uint8_t *loadparm)
>              loadparm[i] = ascii2ebcdic[(uint8_t) lp[i]];
>          }
>  
> +        if (i < 8) {
> +            memset(loadparm + i, 0x40, 8 - i); /* fill with EBCDIC spaces */
> +        }
> +
>          g_free(lp);
>          return 0;
>      }
> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
> index 9d9f8cf4d3..26f9adf84a 100644
> --- a/pc-bios/s390-ccw/main.c
> +++ b/pc-bios/s390-ccw/main.c
> @@ -15,11 +15,11 @@
>  char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
>  static SubChannelId blk_schid = { .one = 1 };
>  IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
> -static char loadparm[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
> +static char loadparm_str[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
>  QemuIplParameters qipl;
>  
>  #define LOADPARM_PROMPT "PROMPT  "
> -#define LOADPARM_EMPTY  "........"
> +#define LOADPARM_EMPTY  "        "
>  #define BOOT_MENU_FLAG_MASK (QIPL_FLAG_BM_OPTS_CMD | QIPL_FLAG_BM_OPTS_ZIPL)
>  
>  /*
> @@ -45,7 +45,7 @@ void panic(const char *string)
>  
>  unsigned int get_loadparm_index(void)
>  {
> -    return atoui(loadparm);
> +    return atoui(loadparm_str);
>  }
>  
>  static bool find_dev(Schib *schib, int dev_no)
> @@ -80,13 +80,13 @@ static bool find_dev(Schib *schib, int dev_no)
>  
>  static void menu_setup(void)
>  {
> -    if (memcmp(loadparm, LOADPARM_PROMPT, 8) == 0) {
> +    if (memcmp(loadparm_str, LOADPARM_PROMPT, 8) == 0) {
>          menu_set_parms(QIPL_FLAG_BM_OPTS_CMD, 0);
>          return;
>      }
>  
>      /* If loadparm was set to any other value, then do not enable menu */
> -    if (memcmp(loadparm, LOADPARM_EMPTY, 8) != 0) {
> +    if (memcmp(loadparm_str, LOADPARM_EMPTY, 8) != 0) {
>          return;
>      }
>  
> @@ -116,8 +116,8 @@ static void virtio_setup(void)
>       */
>      enable_mss_facility();
>  
> -    sclp_get_loadparm_ascii(loadparm);
> -    memcpy(ldp + 10, loadparm, 8);
> +    sclp_get_loadparm_ascii(loadparm_str);
> +    memcpy(ldp + 10, loadparm_str, 8);
>      sclp_print(ldp);
>  
>      memcpy(&qipl, early_qipl, sizeof(QemuIplParameters));
> 

So here I said, "There are a bunch of naked 8 constants; those should
all be (sizeof loadparm_str - 1), I think. Should be a separate patch,
of course."

Thanks
Laszlo

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

* Re: [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd)
  2018-05-04  7:25 ` [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd) Cornelia Huck
@ 2018-05-15  8:46   ` Laszlo Ersek
  0 siblings, 0 replies; 22+ messages in thread
From: Laszlo Ersek @ 2018-05-15  8:46 UTC (permalink / raw)
  To: Cornelia Huck, Peter Maydell
  Cc: Thomas Huth, David Hildenbrand, Alexander Graf, qemu-devel,
	Christian Borntraeger, qemu-s390x, Collin Walling,
	Richard Henderson

On 05/04/18 09:25, Cornelia Huck wrote:
> From: Collin Walling <walling@linux.ibm.com>
> 
> zIPL boot menu entries can be non-sequential. Let's account
> for this issue for the s390 zIPL boot menu. Since this boot
> menu is actually an imitation and is not completely capable
> of everything the real zIPL menu can do, let's also print a
> different banner to the user.
> 
> Signed-off-by: Collin Walling <walling@linux.ibm.com>
> Reported-by: Vasily Gorbik <gor@linux.ibm.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  pc-bios/s390-ccw/menu.c | 29 ++++++++++++++++++++---------
>  1 file changed, 20 insertions(+), 9 deletions(-)
> 
> diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
> index 96eec81e84..aaf5d61ae6 100644
> --- a/pc-bios/s390-ccw/menu.c
> +++ b/pc-bios/s390-ccw/menu.c
> @@ -158,7 +158,7 @@ static void boot_menu_prompt(bool retry)
>      }
>  }
>  
> -static int get_boot_index(int entries)
> +static int get_boot_index(bool *valid_entries)
>  {
>      int boot_index;
>      bool retry = false;
> @@ -168,7 +168,8 @@ static int get_boot_index(int entries)
>          boot_menu_prompt(retry);
>          boot_index = get_index();
>          retry = true;
> -    } while (boot_index < 0 || boot_index >= entries);
> +    } while (boot_index < 0 || boot_index >= MAX_BOOT_ENTRIES ||
> +             !valid_entries[boot_index]);
>  
>      sclp_print("\nBooting entry #");
>      sclp_print(uitoa(boot_index, tmp, sizeof(tmp)));
> @@ -176,7 +177,8 @@ static int get_boot_index(int entries)
>      return boot_index;
>  }
>  
> -static void zipl_println(const char *data, size_t len)
> +/* Returns the entry number that was printed */
> +static int zipl_print_entry(const char *data, size_t len)
>  {
>      char buf[len + 2];
>  
> @@ -185,12 +187,15 @@ static void zipl_println(const char *data, size_t len)
>      buf[len + 1] = '\0';
>  
>      sclp_print(buf);
> +
> +    return buf[0] == ' ' ? atoui(buf + 1) : atoui(buf);
>  }

The return type of this function should likely be "unsigned int", judged
from the function name atoui(). Same for the "entry" variable in
menu_get_zipl_boot_index() below, consequently.

Thanks
Laszlo

>  
>  int menu_get_zipl_boot_index(const char *menu_data)
>  {
>      size_t len;
> -    int entries;
> +    int entry;
> +    bool valid_entries[MAX_BOOT_ENTRIES] = {false};
>      uint16_t zipl_flag = *(uint16_t *)(menu_data - ZIPL_FLAG_OFFSET);
>      uint16_t zipl_timeout = *(uint16_t *)(menu_data - ZIPL_TIMEOUT_OFFSET);
>  
> @@ -202,19 +207,25 @@ int menu_get_zipl_boot_index(const char *menu_data)
>          timeout = zipl_timeout * 1000;
>      }
>  
> -    /* Print and count all menu items, including the banner */
> -    for (entries = 0; *menu_data; entries++) {
> +    /* Print banner */
> +    sclp_print("s390-ccw zIPL Boot Menu\n\n");
> +    menu_data += strlen(menu_data) + 1;
> +
> +    /* Print entries */
> +    while (*menu_data) {
>          len = strlen(menu_data);
> -        zipl_println(menu_data, len);
> +        entry = zipl_print_entry(menu_data, len);
>          menu_data += len + 1;
>  
> -        if (entries < 2) {
> +        valid_entries[entry] = true;
> +
> +        if (entry == 0) {
>              sclp_print("\n");
>          }
>      }
>  
>      sclp_print("\n");
> -    return get_boot_index(entries - 1); /* subtract 1 to exclude banner */
> +    return get_boot_index(valid_entries);
>  }
>  
>  
> 

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

* Re: [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion
  2018-05-15  8:45   ` Laszlo Ersek
@ 2018-05-22 12:44     ` Cornelia Huck
  2018-05-22 14:09       ` Collin Walling
  2018-05-22 18:40       ` Laszlo Ersek
  0 siblings, 2 replies; 22+ messages in thread
From: Cornelia Huck @ 2018-05-22 12:44 UTC (permalink / raw)
  To: Laszlo Ersek
  Cc: Peter Maydell, Thomas Huth, David Hildenbrand, Alexander Graf,
	qemu-devel, Christian Borntraeger, qemu-s390x, Collin Walling,
	Richard Henderson

On Tue, 15 May 2018 10:45:02 +0200
Laszlo Ersek <lersek@redhat.com> wrote:

> I've come across this patch in downstream review (although I really have
> zero background in s390x), and Cornelia suggested I might want to repeat
> my comments on the upstream list too:
> 
> On 05/04/18 09:25, Cornelia Huck wrote:
> > From: Collin Walling <walling@linux.ibm.com>
> > 
> > Rename the loadparm char array in main.c to loadparm_str and
> > increased the size by one byte to account for a null termination
> > when converting the loadparm string to an int  via atoui. We
> > also allow the boot menu to be enabled when loadparm is set to
> > an empty string or a series of spaces.
> > 
> > Signed-off-by: Collin Walling <walling@linux.ibm.com>
> > Reported-by: Vasily Gorbik <gor@linux.ibm.com>
> > Reviewed-by: Thomas Huth <thuth@redhat.com>
> > Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
> > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > ---
> >  hw/s390x/ipl.c          |  4 ++++
> >  pc-bios/s390-ccw/main.c | 14 +++++++-------
> >  2 files changed, 11 insertions(+), 7 deletions(-)
> > 
> > diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> > index fb554ab156..150f6c0582 100644
> > --- a/hw/s390x/ipl.c
> > +++ b/hw/s390x/ipl.c
> > @@ -373,6 +373,10 @@ int s390_ipl_set_loadparm(uint8_t *loadparm)
> >              loadparm[i] = ascii2ebcdic[(uint8_t) lp[i]];
> >          }
> >  
> > +        if (i < 8) {
> > +            memset(loadparm + i, 0x40, 8 - i); /* fill with EBCDIC spaces */
> > +        }
> > +
> >          g_free(lp);
> >          return 0;
> >      }
> > diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
> > index 9d9f8cf4d3..26f9adf84a 100644
> > --- a/pc-bios/s390-ccw/main.c
> > +++ b/pc-bios/s390-ccw/main.c
> > @@ -15,11 +15,11 @@
> >  char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
> >  static SubChannelId blk_schid = { .one = 1 };
> >  IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
> > -static char loadparm[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
> > +static char loadparm_str[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
> >  QemuIplParameters qipl;
> >  
> >  #define LOADPARM_PROMPT "PROMPT  "
> > -#define LOADPARM_EMPTY  "........"
> > +#define LOADPARM_EMPTY  "        "
> >  #define BOOT_MENU_FLAG_MASK (QIPL_FLAG_BM_OPTS_CMD | QIPL_FLAG_BM_OPTS_ZIPL)
> >  
> >  /*
> > @@ -45,7 +45,7 @@ void panic(const char *string)
> >  
> >  unsigned int get_loadparm_index(void)
> >  {
> > -    return atoui(loadparm);
> > +    return atoui(loadparm_str);
> >  }
> >  
> >  static bool find_dev(Schib *schib, int dev_no)
> > @@ -80,13 +80,13 @@ static bool find_dev(Schib *schib, int dev_no)
> >  
> >  static void menu_setup(void)
> >  {
> > -    if (memcmp(loadparm, LOADPARM_PROMPT, 8) == 0) {
> > +    if (memcmp(loadparm_str, LOADPARM_PROMPT, 8) == 0) {
> >          menu_set_parms(QIPL_FLAG_BM_OPTS_CMD, 0);
> >          return;
> >      }
> >  
> >      /* If loadparm was set to any other value, then do not enable menu */
> > -    if (memcmp(loadparm, LOADPARM_EMPTY, 8) != 0) {
> > +    if (memcmp(loadparm_str, LOADPARM_EMPTY, 8) != 0) {
> >          return;
> >      }
> >  
> > @@ -116,8 +116,8 @@ static void virtio_setup(void)
> >       */
> >      enable_mss_facility();
> >  
> > -    sclp_get_loadparm_ascii(loadparm);
> > -    memcpy(ldp + 10, loadparm, 8);
> > +    sclp_get_loadparm_ascii(loadparm_str);
> > +    memcpy(ldp + 10, loadparm_str, 8);
> >      sclp_print(ldp);
> >  
> >      memcpy(&qipl, early_qipl, sizeof(QemuIplParameters));
> >   
> 
> So here I said, "There are a bunch of naked 8 constants; those should
> all be (sizeof loadparm_str - 1), I think. Should be a separate patch,
> of course."

Alternatively, as loadparm size is architectured IIRC and unlikely to
change, do

#define LOADPARM_LEN 8
char loadparm_str[LOADPARM_LEN + 1];

and compare against LOADPARM_LEN... opinions?

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

* Re: [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion
  2018-05-22 12:44     ` Cornelia Huck
@ 2018-05-22 14:09       ` Collin Walling
  2018-05-22 18:40       ` Laszlo Ersek
  1 sibling, 0 replies; 22+ messages in thread
From: Collin Walling @ 2018-05-22 14:09 UTC (permalink / raw)
  To: Cornelia Huck, Laszlo Ersek
  Cc: Peter Maydell, Thomas Huth, David Hildenbrand, Alexander Graf,
	qemu-devel, Christian Borntraeger, qemu-s390x, Richard Henderson

On 05/22/2018 08:44 AM, Cornelia Huck wrote:
> On Tue, 15 May 2018 10:45:02 +0200
> Laszlo Ersek <lersek@redhat.com> wrote:
> 
>> I've come across this patch in downstream review (although I really have
>> zero background in s390x), and Cornelia suggested I might want to repeat
>> my comments on the upstream list too:
>>
>> On 05/04/18 09:25, Cornelia Huck wrote:
>>> From: Collin Walling <walling@linux.ibm.com>
>>>
>>> Rename the loadparm char array in main.c to loadparm_str and
>>> increased the size by one byte to account for a null termination
>>> when converting the loadparm string to an int  via atoui. We
>>> also allow the boot menu to be enabled when loadparm is set to
>>> an empty string or a series of spaces.
>>>
>>> Signed-off-by: Collin Walling <walling@linux.ibm.com>
>>> Reported-by: Vasily Gorbik <gor@linux.ibm.com>
>>> Reviewed-by: Thomas Huth <thuth@redhat.com>
>>> Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>> ---
>>>  hw/s390x/ipl.c          |  4 ++++
>>>  pc-bios/s390-ccw/main.c | 14 +++++++-------
>>>  2 files changed, 11 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
>>> index fb554ab156..150f6c0582 100644
>>> --- a/hw/s390x/ipl.c
>>> +++ b/hw/s390x/ipl.c
>>> @@ -373,6 +373,10 @@ int s390_ipl_set_loadparm(uint8_t *loadparm)
>>>              loadparm[i] = ascii2ebcdic[(uint8_t) lp[i]];
>>>          }
>>>  
>>> +        if (i < 8) {
>>> +            memset(loadparm + i, 0x40, 8 - i); /* fill with EBCDIC spaces */
>>> +        }
>>> +
>>>          g_free(lp);
>>>          return 0;
>>>      }
>>> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
>>> index 9d9f8cf4d3..26f9adf84a 100644
>>> --- a/pc-bios/s390-ccw/main.c
>>> +++ b/pc-bios/s390-ccw/main.c
>>> @@ -15,11 +15,11 @@
>>>  char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
>>>  static SubChannelId blk_schid = { .one = 1 };
>>>  IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
>>> -static char loadparm[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
>>> +static char loadparm_str[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
>>>  QemuIplParameters qipl;
>>>  
>>>  #define LOADPARM_PROMPT "PROMPT  "
>>> -#define LOADPARM_EMPTY  "........"
>>> +#define LOADPARM_EMPTY  "        "
>>>  #define BOOT_MENU_FLAG_MASK (QIPL_FLAG_BM_OPTS_CMD | QIPL_FLAG_BM_OPTS_ZIPL)
>>>  
>>>  /*
>>> @@ -45,7 +45,7 @@ void panic(const char *string)
>>>  
>>>  unsigned int get_loadparm_index(void)
>>>  {
>>> -    return atoui(loadparm);
>>> +    return atoui(loadparm_str);
>>>  }
>>>  
>>>  static bool find_dev(Schib *schib, int dev_no)
>>> @@ -80,13 +80,13 @@ static bool find_dev(Schib *schib, int dev_no)
>>>  
>>>  static void menu_setup(void)
>>>  {
>>> -    if (memcmp(loadparm, LOADPARM_PROMPT, 8) == 0) {
>>> +    if (memcmp(loadparm_str, LOADPARM_PROMPT, 8) == 0) {
>>>          menu_set_parms(QIPL_FLAG_BM_OPTS_CMD, 0);
>>>          return;
>>>      }
>>>  
>>>      /* If loadparm was set to any other value, then do not enable menu */
>>> -    if (memcmp(loadparm, LOADPARM_EMPTY, 8) != 0) {
>>> +    if (memcmp(loadparm_str, LOADPARM_EMPTY, 8) != 0) {
>>>          return;
>>>      }
>>>  
>>> @@ -116,8 +116,8 @@ static void virtio_setup(void)
>>>       */
>>>      enable_mss_facility();
>>>  
>>> -    sclp_get_loadparm_ascii(loadparm);
>>> -    memcpy(ldp + 10, loadparm, 8);
>>> +    sclp_get_loadparm_ascii(loadparm_str);
>>> +    memcpy(ldp + 10, loadparm_str, 8);
>>>      sclp_print(ldp);
>>>  
>>>      memcpy(&qipl, early_qipl, sizeof(QemuIplParameters));
>>>   
>>
>> So here I said, "There are a bunch of naked 8 constants; those should
>> all be (sizeof loadparm_str - 1), I think. Should be a separate patch,
>> of course."
> 
> Alternatively, as loadparm size is architectured IIRC and unlikely to
> change, do
> 

Correct.

> #define LOADPARM_LEN 8
> char loadparm_str[LOADPARM_LEN + 1];
> 
> and compare against LOADPARM_LEN... opinions?
> 

I have another (unrelated) QEMU patch to throw on the list, so I can get to this today.

-- 
Respectfully,
- Collin Walling

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

* Re: [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion
  2018-05-22 12:44     ` Cornelia Huck
  2018-05-22 14:09       ` Collin Walling
@ 2018-05-22 18:40       ` Laszlo Ersek
  1 sibling, 0 replies; 22+ messages in thread
From: Laszlo Ersek @ 2018-05-22 18:40 UTC (permalink / raw)
  To: Cornelia Huck
  Cc: Peter Maydell, Thomas Huth, David Hildenbrand, Alexander Graf,
	qemu-devel, Christian Borntraeger, qemu-s390x, Collin Walling,
	Richard Henderson

On 05/22/18 14:44, Cornelia Huck wrote:
> On Tue, 15 May 2018 10:45:02 +0200
> Laszlo Ersek <lersek@redhat.com> wrote:
> 
>> I've come across this patch in downstream review (although I really have
>> zero background in s390x), and Cornelia suggested I might want to repeat
>> my comments on the upstream list too:
>>
>> On 05/04/18 09:25, Cornelia Huck wrote:
>>> From: Collin Walling <walling@linux.ibm.com>
>>>
>>> Rename the loadparm char array in main.c to loadparm_str and
>>> increased the size by one byte to account for a null termination
>>> when converting the loadparm string to an int  via atoui. We
>>> also allow the boot menu to be enabled when loadparm is set to
>>> an empty string or a series of spaces.
>>>
>>> Signed-off-by: Collin Walling <walling@linux.ibm.com>
>>> Reported-by: Vasily Gorbik <gor@linux.ibm.com>
>>> Reviewed-by: Thomas Huth <thuth@redhat.com>
>>> Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>> ---
>>>  hw/s390x/ipl.c          |  4 ++++
>>>  pc-bios/s390-ccw/main.c | 14 +++++++-------
>>>  2 files changed, 11 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
>>> index fb554ab156..150f6c0582 100644
>>> --- a/hw/s390x/ipl.c
>>> +++ b/hw/s390x/ipl.c
>>> @@ -373,6 +373,10 @@ int s390_ipl_set_loadparm(uint8_t *loadparm)
>>>              loadparm[i] = ascii2ebcdic[(uint8_t) lp[i]];
>>>          }
>>>  
>>> +        if (i < 8) {
>>> +            memset(loadparm + i, 0x40, 8 - i); /* fill with EBCDIC spaces */
>>> +        }
>>> +
>>>          g_free(lp);
>>>          return 0;
>>>      }
>>> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
>>> index 9d9f8cf4d3..26f9adf84a 100644
>>> --- a/pc-bios/s390-ccw/main.c
>>> +++ b/pc-bios/s390-ccw/main.c
>>> @@ -15,11 +15,11 @@
>>>  char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
>>>  static SubChannelId blk_schid = { .one = 1 };
>>>  IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
>>> -static char loadparm[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
>>> +static char loadparm_str[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
>>>  QemuIplParameters qipl;
>>>  
>>>  #define LOADPARM_PROMPT "PROMPT  "
>>> -#define LOADPARM_EMPTY  "........"
>>> +#define LOADPARM_EMPTY  "        "
>>>  #define BOOT_MENU_FLAG_MASK (QIPL_FLAG_BM_OPTS_CMD | QIPL_FLAG_BM_OPTS_ZIPL)
>>>  
>>>  /*
>>> @@ -45,7 +45,7 @@ void panic(const char *string)
>>>  
>>>  unsigned int get_loadparm_index(void)
>>>  {
>>> -    return atoui(loadparm);
>>> +    return atoui(loadparm_str);
>>>  }
>>>  
>>>  static bool find_dev(Schib *schib, int dev_no)
>>> @@ -80,13 +80,13 @@ static bool find_dev(Schib *schib, int dev_no)
>>>  
>>>  static void menu_setup(void)
>>>  {
>>> -    if (memcmp(loadparm, LOADPARM_PROMPT, 8) == 0) {
>>> +    if (memcmp(loadparm_str, LOADPARM_PROMPT, 8) == 0) {
>>>          menu_set_parms(QIPL_FLAG_BM_OPTS_CMD, 0);
>>>          return;
>>>      }
>>>  
>>>      /* If loadparm was set to any other value, then do not enable menu */
>>> -    if (memcmp(loadparm, LOADPARM_EMPTY, 8) != 0) {
>>> +    if (memcmp(loadparm_str, LOADPARM_EMPTY, 8) != 0) {
>>>          return;
>>>      }
>>>  
>>> @@ -116,8 +116,8 @@ static void virtio_setup(void)
>>>       */
>>>      enable_mss_facility();
>>>  
>>> -    sclp_get_loadparm_ascii(loadparm);
>>> -    memcpy(ldp + 10, loadparm, 8);
>>> +    sclp_get_loadparm_ascii(loadparm_str);
>>> +    memcpy(ldp + 10, loadparm_str, 8);
>>>      sclp_print(ldp);
>>>  
>>>      memcpy(&qipl, early_qipl, sizeof(QemuIplParameters));
>>>   
>>
>> So here I said, "There are a bunch of naked 8 constants; those should
>> all be (sizeof loadparm_str - 1), I think. Should be a separate patch,
>> of course."
> 
> Alternatively, as loadparm size is architectured IIRC and unlikely to
> change, do
> 
> #define LOADPARM_LEN 8
> char loadparm_str[LOADPARM_LEN + 1];
> 
> and compare against LOADPARM_LEN... opinions?
> 

Sure, it works for me.

Thanks
Laszlo

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

end of thread, other threads:[~2018-05-22 18:41 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-04  7:24 [Qemu-devel] [PULL 00/15] first s390x update for 2.13 Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 01/15] s390x: introduce 2.13 compat machine Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 02/15] s390x/sclp: extend SCLP event masks to 64 bits Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 03/15] vfio-ccw: introduce vfio_ccw_get_device() Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 04/15] s390x/kvm: cleanup calls to cpu_synchronize_state() Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 05/15] hw/s390x: Allow to configure the consoles with the "-serial" parameter Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 06/15] pc-bios/s390-ccw: size_t should be unsigned Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 07/15] pc-bios/s390-ccw: rename MAX_TABLE_ENTRIES to MAX_BOOT_ENTRIES Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 08/15] pc-bios/s390-ccw: fix loadparm initialization and int conversion Cornelia Huck
2018-05-15  8:45   ` Laszlo Ersek
2018-05-22 12:44     ` Cornelia Huck
2018-05-22 14:09       ` Collin Walling
2018-05-22 18:40       ` Laszlo Ersek
2018-05-04  7:25 ` [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd) Cornelia Huck
2018-05-15  8:46   ` Laszlo Ersek
2018-05-04  7:25 ` [Qemu-devel] [PULL 10/15] pc-bios/s390-ccw: fix non-sequential boot entries (enum) Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 11/15] pc-bios/s390-ccw/net: Split up net_load() into init, load and release parts Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 12/15] pc-bios/s390-ccw/net: Use diag308 to reset machine before jumping to the OS Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 13/15] pc-bios/s390-ccw/net: Add support for .INS config files Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 14/15] s390-ccw: force diag 308 subcode to unsigned long Cornelia Huck
2018-05-04  7:25 ` [Qemu-devel] [PULL 15/15] pc-bios/s390: Update firmware images Cornelia Huck
2018-05-04 12:48 ` [Qemu-devel] [PULL 00/15] first s390x update for 2.13 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.