All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 00/16] s390-ccw bios update
@ 2020-10-06 18:31 Thomas Huth
  2020-10-06 18:31 ` [PULL 01/16] pc-bios/s390-ccw/Makefile: Compile with -std=gnu99, -fwrapv and -fno-common Thomas Huth
                   ` (17 more replies)
  0 siblings, 18 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

 Hi Peter,

the following changes since commit d7c5b788295426c1ef48a9ffc3432c51220f69ba:

  Merge remote-tracking branch 'remotes/stefanha-gitlab/tags/block-pull-request' into staging (2020-10-06 12:15:59 +0100)

are available in the Git repository at:

  https://gitlab.com/huth/qemu.git tags/pull-request-2020-10-06

for you to fetch changes up to eb32abd8d931994d10327bd965a4fb12d765a0fb:

  tests/qtest/cdrom: Add more s390x-related boot tests (2020-10-06 20:14:48 +0200)

----------------------------------------------------------------
* Don't stop at the first unbootable device, continue scanning
* Fix corner cases in booting from ECKD
* s390x-ccw bios cleanup part 2​
----------------------------------------------------------------

Janosch Frank (4):
      pc-bios: s390x: Fix bootmap.c zipl component entry data handling
      pc-bios: s390x: Save PSW rework
      pc-bios: s390x: Use reset PSW if avaliable
      pc-bios: s390x: Go into disabled wait when encountering a PGM exception

Marc Hartmayer (2):
      pc-bios/s390-ccw: fix off-by-one error
      pc-bios/s390-ccw: break loop if a null block number is reached

Thomas Huth (10):
      pc-bios/s390-ccw/Makefile: Compile with -std=gnu99, -fwrapv and -fno-common
      pc-bios/s390-ccw: Move ipl-related code from main() into a separate function
      pc-bios/s390-ccw: Introduce ENODEV define and remove guards of others
      pc-bios/s390-ccw: Move the inner logic of find_subch() to a separate function
      pc-bios/s390-ccw: Do not bail out early if not finding a SCSI disk
      pc-bios/s390-ccw: Scan through all devices if no boot device specified
      pc-bios/s390-ccw: Allow booting in case the first virtio-blk disk is bad
      pc-bios/s390-ccw/main: Remove superfluous call to enable_subchannel()
      pc-bios/s390: Update the s390-ccw bios binaries
      tests/qtest/cdrom: Add more s390x-related boot tests

 pc-bios/s390-ccw.img             | Bin 42608 -> 42608 bytes
 pc-bios/s390-ccw/Makefile        |   7 +-
 pc-bios/s390-ccw/bootmap.c       |  47 +++++++----
 pc-bios/s390-ccw/bootmap.h       |   7 +-
 pc-bios/s390-ccw/jump2ipl.c      |  45 +++++-----
 pc-bios/s390-ccw/main.c          | 172 ++++++++++++++++++++++++---------------
 pc-bios/s390-ccw/s390-ccw.h      |   9 +-
 pc-bios/s390-ccw/start.S         |   5 +-
 pc-bios/s390-ccw/virtio-blkdev.c |   7 +-
 pc-bios/s390-ccw/virtio-scsi.c   |  28 +++++--
 pc-bios/s390-ccw/virtio-scsi.h   |   2 +-
 pc-bios/s390-netboot.img         | Bin 67232 -> 67232 bytes
 tests/qtest/cdrom-test.c         |  12 +++
 13 files changed, 218 insertions(+), 123 deletions(-)



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

* [PULL 01/16] pc-bios/s390-ccw/Makefile: Compile with -std=gnu99, -fwrapv and -fno-common
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 02/16] pc-bios/s390-ccw: Move ipl-related code from main() into a separate function Thomas Huth
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

The main QEMU code is compiled with -std=gnu99, -fwrapv and -fno-common.
We should use the same flags for the s390-ccw bios, too, to avoid that
we get different behavior with different compiler versions that changed
their default settings in the course of time (it happened at least with
-std=... and -fno-common in the past already).

While we're at it, also group the other flags here in a little bit nicer
fashion: Move the two "-m" flags out of the "-f" area and specify them on
a separate line.

Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Message-Id: <20200806105349.632-2-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/Makefile | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index 3eb785048a..29fd9019b8 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -30,10 +30,11 @@ OBJECTS = start.o main.o bootmap.o jump2ipl.o sclp.o menu.o \
 	  virtio.o virtio-scsi.o virtio-blkdev.o libc.o cio.o dasd-ipl.o
 
 QEMU_CFLAGS := -Wall $(filter -W%, $(QEMU_CFLAGS))
-QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float
-QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing
-QEMU_CFLAGS += -fno-asynchronous-unwind-tables
+QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -fno-common -fPIE
+QEMU_CFLAGS += -fwrapv -fno-strict-aliasing -fno-asynchronous-unwind-tables
 QEMU_CFLAGS += $(call cc-option, $(QEMU_CFLAGS), -fno-stack-protector)
+QEMU_CFLAGS += -msoft-float -march=z900
+QEMU_CFLAGS += -std=gnu99
 LDFLAGS += -Wl,-pie -nostdlib
 
 build-all: s390-ccw.img s390-netboot.img
-- 
2.18.2



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

* [PULL 02/16] pc-bios/s390-ccw: Move ipl-related code from main() into a separate function
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
  2020-10-06 18:31 ` [PULL 01/16] pc-bios/s390-ccw/Makefile: Compile with -std=gnu99, -fwrapv and -fno-common Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 03/16] pc-bios/s390-ccw: Introduce ENODEV define and remove guards of others Thomas Huth
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

Let's move this part of the code into a separate function to be able
to use it from multiple spots later.

Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Message-Id: <20200806105349.632-3-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/main.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 146a50760b..9b64eb0c24 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -223,14 +223,8 @@ static void virtio_setup(void)
     }
 }
 
-int main(void)
+static void ipl_boot_device(void)
 {
-    sclp_setup();
-    css_setup();
-    boot_setup();
-    find_boot_device();
-    enable_subchannel(blk_schid);
-
     switch (cutype) {
     case CU_TYPE_DASD_3990:
     case CU_TYPE_DASD_2107:
@@ -242,8 +236,18 @@ int main(void)
         break;
     default:
         print_int("Attempting to boot from unexpected device type", cutype);
-        panic("");
+        panic("\nBoot failed.\n");
     }
+}
+
+int main(void)
+{
+    sclp_setup();
+    css_setup();
+    boot_setup();
+    find_boot_device();
+    enable_subchannel(blk_schid);
+    ipl_boot_device();
 
     panic("Failed to load OS from hard disk\n");
     return 0; /* make compiler happy */
-- 
2.18.2



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

* [PULL 03/16] pc-bios/s390-ccw: Introduce ENODEV define and remove guards of others
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
  2020-10-06 18:31 ` [PULL 01/16] pc-bios/s390-ccw/Makefile: Compile with -std=gnu99, -fwrapv and -fno-common Thomas Huth
  2020-10-06 18:31 ` [PULL 02/16] pc-bios/s390-ccw: Move ipl-related code from main() into a separate function Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 04/16] pc-bios/s390-ccw: Move the inner logic of find_subch() to a separate function Thomas Huth
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

Remove the "#ifndef E..." guards from the defines here - the header
guard S390_CCW_H at the top of the file should avoid double definition,
and if the error code is defined in a different file already, we're in
trouble anyway, then it's better to see the error at compile time instead
of hunting weird behavior during runtime later.
Also define ENODEV - we will use this in a later patch.

Message-Id: <20200806105349.632-4-thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/s390-ccw.h | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index 36b884cced..dbc4c64851 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -27,12 +27,10 @@ typedef unsigned long long __u64;
 #define false 0
 #define PAGE_SIZE 4096
 
-#ifndef EIO
 #define EIO     1
-#endif
-#ifndef EBUSY
 #define EBUSY   2
-#endif
+#define ENODEV  3
+
 #ifndef NULL
 #define NULL    0
 #endif
-- 
2.18.2



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

* [PULL 04/16] pc-bios/s390-ccw: Move the inner logic of find_subch() to a separate function
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (2 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 03/16] pc-bios/s390-ccw: Introduce ENODEV define and remove guards of others Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 05/16] pc-bios/s390-ccw: Do not bail out early if not finding a SCSI disk Thomas Huth
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

Move the code to a separate function to be able to re-use it from a
different spot later.

Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Message-Id: <20200806105349.632-5-thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/main.c | 99 ++++++++++++++++++++++++-----------------
 1 file changed, 57 insertions(+), 42 deletions(-)

diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 9b64eb0c24..0d2aabbc58 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -51,6 +51,60 @@ unsigned int get_loadparm_index(void)
     return atoui(loadparm_str);
 }
 
+static int is_dev_possibly_bootable(int dev_no, int sch_no)
+{
+    bool is_virtio;
+    Schib schib;
+    int r;
+
+    blk_schid.sch_no = sch_no;
+    r = stsch_err(blk_schid, &schib);
+    if (r == 3 || r == -EIO) {
+        return -ENODEV;
+    }
+    if (!schib.pmcw.dnv) {
+        return false;
+    }
+
+    enable_subchannel(blk_schid);
+    cutype = cu_type(blk_schid);
+
+    /*
+     * Note: we always have to run virtio_is_supported() here to make
+     * sure that the vdev.senseid data gets pre-initialized correctly
+     */
+    is_virtio = virtio_is_supported(blk_schid);
+
+    /* No specific devno given, just return whether the device is possibly bootable */
+    if (dev_no < 0) {
+        switch (cutype) {
+        case CU_TYPE_VIRTIO:
+            if (is_virtio) {
+                /*
+                 * Skip net devices since no IPLB is created and therefore
+                 * no network bootloader has been loaded
+                 */
+                if (virtio_get_device_type() != VIRTIO_ID_NET) {
+                    return true;
+                }
+            }
+            return false;
+        case CU_TYPE_DASD_3990:
+        case CU_TYPE_DASD_2107:
+            return true;
+        default:
+            return false;
+        }
+    }
+
+    /* Caller asked for a specific devno */
+    if (schib.pmcw.dev == dev_no) {
+        return true;
+    }
+
+    return false;
+}
+
 /*
  * Find the subchannel connected to the given device (dev_no) and fill in the
  * subchannel information block (schib) with the connected subchannel's info.
@@ -62,53 +116,14 @@ unsigned int get_loadparm_index(void)
  */
 static bool find_subch(int dev_no)
 {
-    Schib schib;
     int i, r;
-    bool is_virtio;
 
     for (i = 0; i < 0x10000; i++) {
-        blk_schid.sch_no = i;
-        r = stsch_err(blk_schid, &schib);
-        if ((r == 3) || (r == -EIO)) {
+        r = is_dev_possibly_bootable(dev_no, i);
+        if (r < 0) {
             break;
         }
-        if (!schib.pmcw.dnv) {
-            continue;
-        }
-
-        enable_subchannel(blk_schid);
-        cutype = cu_type(blk_schid);
-
-        /*
-         * Note: we always have to run virtio_is_supported() here to make
-         * sure that the vdev.senseid data gets pre-initialized correctly
-         */
-        is_virtio = virtio_is_supported(blk_schid);
-
-        /* No specific devno given, just return 1st possibly bootable device */
-        if (dev_no < 0) {
-            switch (cutype) {
-            case CU_TYPE_VIRTIO:
-                if (is_virtio) {
-                    /*
-                     * Skip net devices since no IPLB is created and therefore
-                     * no network bootloader has been loaded
-                     */
-                    if (virtio_get_device_type() != VIRTIO_ID_NET) {
-                        return true;
-                    }
-                }
-                continue;
-            case CU_TYPE_DASD_3990:
-            case CU_TYPE_DASD_2107:
-                return true;
-            default:
-                continue;
-            }
-        }
-
-        /* Caller asked for a specific devno */
-        if (schib.pmcw.dev == dev_no) {
+        if (r == true) {
             return true;
         }
     }
-- 
2.18.2



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

* [PULL 05/16] pc-bios/s390-ccw: Do not bail out early if not finding a SCSI disk
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (3 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 04/16] pc-bios/s390-ccw: Move the inner logic of find_subch() to a separate function Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 06/16] pc-bios/s390-ccw: Scan through all devices if no boot device specified Thomas Huth
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

In case the user did not specify a boot device, we want to continue
looking for other devices if there are no valid SCSI disks on a virtio-
scsi controller. As a first step, do not panic in this case and let
the control flow carry the error to the upper functions instead.

Message-Id: <20200806105349.632-6-thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/main.c          | 14 ++++++++++----
 pc-bios/s390-ccw/s390-ccw.h      |  2 +-
 pc-bios/s390-ccw/virtio-blkdev.c |  7 +++++--
 pc-bios/s390-ccw/virtio-scsi.c   | 28 ++++++++++++++++++++--------
 pc-bios/s390-ccw/virtio-scsi.h   |  2 +-
 5 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 0d2aabbc58..7bdd12ab2e 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -218,7 +218,7 @@ static void find_boot_device(void)
     IPL_assert(found, "Boot device not found\n");
 }
 
-static void virtio_setup(void)
+static int virtio_setup(void)
 {
     VDev *vdev = virtio_get_device();
     QemuIplParameters *early_qipl = (QemuIplParameters *)QIPL_ADDRESS;
@@ -233,9 +233,14 @@ static void virtio_setup(void)
         sclp_print("Network boot device detected\n");
         vdev->netboot_start_addr = qipl.netboot_start_addr;
     } else {
-        virtio_blk_setup_device(blk_schid);
+        int ret = virtio_blk_setup_device(blk_schid);
+        if (ret) {
+            return ret;
+        }
         IPL_assert(virtio_ipl_disk_is_valid(), "No valid IPL device detected");
     }
+
+    return 0;
 }
 
 static void ipl_boot_device(void)
@@ -246,8 +251,9 @@ static void ipl_boot_device(void)
         dasd_ipl(blk_schid, cutype); /* no return */
         break;
     case CU_TYPE_VIRTIO:
-        virtio_setup();
-        zipl_load(); /* no return */
+        if (virtio_setup() == 0) {
+            zipl_load(); /* no return */
+        }
         break;
     default:
         print_int("Attempting to boot from unexpected device type", cutype);
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index dbc4c64851..9b86c120b4 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -69,7 +69,7 @@ int sclp_read(char *str, size_t count);
 unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
                                  ulong subchan_id, void *load_addr);
 bool virtio_is_supported(SubChannelId schid);
-void virtio_blk_setup_device(SubChannelId schid);
+int virtio_blk_setup_device(SubChannelId schid);
 int virtio_read(ulong sector, void *load_addr);
 
 /* bootmap.c */
diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blkdev.c
index 11c56261ca..7d35050292 100644
--- a/pc-bios/s390-ccw/virtio-blkdev.c
+++ b/pc-bios/s390-ccw/virtio-blkdev.c
@@ -263,9 +263,10 @@ uint64_t virtio_get_blocks(void)
     return 0;
 }
 
-void virtio_blk_setup_device(SubChannelId schid)
+int virtio_blk_setup_device(SubChannelId schid)
 {
     VDev *vdev = virtio_get_device();
+    int ret = 0;
 
     vdev->schid = schid;
     virtio_setup_ccw(vdev);
@@ -288,9 +289,11 @@ void virtio_blk_setup_device(SubChannelId schid)
             "Config: CDB size mismatch");
 
         sclp_print("Using virtio-scsi.\n");
-        virtio_scsi_setup(vdev);
+        ret = virtio_scsi_setup(vdev);
         break;
     default:
         panic("\n! No IPL device available !\n");
     }
+
+    return ret;
 }
diff --git a/pc-bios/s390-ccw/virtio-scsi.c b/pc-bios/s390-ccw/virtio-scsi.c
index eddfb8a7ad..2c8d0f3097 100644
--- a/pc-bios/s390-ccw/virtio-scsi.c
+++ b/pc-bios/s390-ccw/virtio-scsi.c
@@ -194,7 +194,12 @@ static bool scsi_read_capacity(VDev *vdev,
 
 /* virtio-scsi routines */
 
-static void virtio_scsi_locate_device(VDev *vdev)
+/*
+ * Tries to locate a SCSI device and and adds the information for the found
+ * device to the vdev->scsi_device structure.
+ * Returns 0 if SCSI device could be located, or a error code < 0 otherwise
+ */
+static int virtio_scsi_locate_device(VDev *vdev)
 {
     const uint16_t channel = 0; /* again, it's what QEMU does */
     uint16_t target;
@@ -220,7 +225,7 @@ static void virtio_scsi_locate_device(VDev *vdev)
         IPL_check(sdev->channel == 0, "non-zero channel requested");
         IPL_check(sdev->target <= vdev->config.scsi.max_target, "target# high");
         IPL_check(sdev->lun <= vdev->config.scsi.max_lun, "LUN# high");
-        return;
+        return 0;
     }
 
     for (target = 0; target <= vdev->config.scsi.max_target; target++) {
@@ -247,18 +252,20 @@ static void virtio_scsi_locate_device(VDev *vdev)
              */
             sdev->lun = r->lun[0].v16[0]; /* it's returned this way */
             debug_print_int("Have to use LUN", sdev->lun);
-            return; /* we have to use this device */
+            return 0; /* we have to use this device */
         }
         for (i = 0; i < luns; i++) {
             if (r->lun[i].v64) {
                 /* Look for non-zero LUN - we have where to choose from */
                 sdev->lun = r->lun[i].v16[0];
                 debug_print_int("Will use LUN", sdev->lun);
-                return; /* we have found a device */
+                return 0; /* we have found a device */
             }
         }
     }
-    panic("\n! Cannot locate virtio-scsi device !\n");
+
+    sclp_print("Warning: Could not locate a usable virtio-scsi device\n");
+    return -ENODEV;
 }
 
 int virtio_scsi_read_many(VDev *vdev,
@@ -322,17 +329,20 @@ static void scsi_parse_capacity_report(void *data,
     }
 }
 
-void virtio_scsi_setup(VDev *vdev)
+int virtio_scsi_setup(VDev *vdev)
 {
     int retry_test_unit_ready = 3;
     uint8_t data[256];
     uint32_t data_size = sizeof(data);
     ScsiInquiryEvpdPages *evpd = &scsi_inquiry_evpd_pages_response;
     ScsiInquiryEvpdBl *evpd_bl = &scsi_inquiry_evpd_bl_response;
-    int i;
+    int i, ret;
 
     vdev->scsi_device = &default_scsi_device;
-    virtio_scsi_locate_device(vdev);
+    ret = virtio_scsi_locate_device(vdev);
+    if (ret < 0) {
+        return ret;
+    }
 
     /* We have to "ping" the device before it becomes readable */
     while (!scsi_test_unit_ready(vdev)) {
@@ -417,4 +427,6 @@ void virtio_scsi_setup(VDev *vdev)
     }
     scsi_parse_capacity_report(data, &vdev->scsi_last_block,
                                (uint32_t *) &vdev->scsi_block_size);
+
+    return 0;
 }
diff --git a/pc-bios/s390-ccw/virtio-scsi.h b/pc-bios/s390-ccw/virtio-scsi.h
index 4c4f4bbc31..4b14c2c2f9 100644
--- a/pc-bios/s390-ccw/virtio-scsi.h
+++ b/pc-bios/s390-ccw/virtio-scsi.h
@@ -67,7 +67,7 @@ static inline bool virtio_scsi_response_ok(const VirtioScsiCmdResp *r)
         return r->response == VIRTIO_SCSI_S_OK && r->status == CDB_STATUS_GOOD;
 }
 
-void virtio_scsi_setup(VDev *vdev);
+int virtio_scsi_setup(VDev *vdev);
 int virtio_scsi_read_many(VDev *vdev,
                           ulong sector, void *load_addr, int sec_num);
 
-- 
2.18.2



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

* [PULL 06/16] pc-bios/s390-ccw: Scan through all devices if no boot device specified
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (4 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 05/16] pc-bios/s390-ccw: Do not bail out early if not finding a SCSI disk Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 07/16] pc-bios/s390-ccw: Allow booting in case the first virtio-blk disk is bad Thomas Huth
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

If no boot device has been specified (via "bootindex=..."), the s390-ccw
bios scans through all devices to find a bootable device. But so far, it
stops at the very first block device (including virtio-scsi controllers
without attached devices) that it finds, no matter whether it is bootable
or not. That leads to some weird situatation where it is e.g. possible
to boot via:

 qemu-system-s390x -hda /path/to/disk.qcow2

but not if there is e.g. a virtio-scsi controller specified before:

 qemu-system-s390x -device virtio-scsi -hda /path/to/disk.qcow2

While using "bootindex=..." is clearly the preferred way of booting
on s390x, we still can make the life for the users at least a little
bit easier if we look at all available devices to find a bootable one.

Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1846975
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20200806105349.632-7-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/main.c | 46 +++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 7bdd12ab2e..9b581074a1 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -182,20 +182,8 @@ static void boot_setup(void)
 static void find_boot_device(void)
 {
     VDev *vdev = virtio_get_device();
-    int ssid;
     bool found;
 
-    if (!have_iplb) {
-        for (ssid = 0; ssid < 0x3; ssid++) {
-            blk_schid.ssid = ssid;
-            found = find_subch(-1);
-            if (found) {
-                return;
-            }
-        }
-        panic("Could not find a suitable boot device (none specified)\n");
-    }
-
     switch (iplb.pbt) {
     case S390_IPL_TYPE_CCW:
         debug_print_int("device no. ", iplb.ccw.devno);
@@ -261,14 +249,42 @@ static void ipl_boot_device(void)
     }
 }
 
+/*
+ * No boot device has been specified, so we have to scan through the
+ * channels to find one.
+ */
+static void probe_boot_device(void)
+{
+    int ssid, sch_no, ret;
+
+    for (ssid = 0; ssid < 0x3; ssid++) {
+        blk_schid.ssid = ssid;
+        for (sch_no = 0; sch_no < 0x10000; sch_no++) {
+            ret = is_dev_possibly_bootable(-1, sch_no);
+            if (ret < 0) {
+                break;
+            }
+            if (ret == true) {
+                ipl_boot_device();      /* Only returns if unsuccessful */
+            }
+        }
+    }
+
+    sclp_print("Could not find a suitable boot device (none specified)\n");
+}
+
 int main(void)
 {
     sclp_setup();
     css_setup();
     boot_setup();
-    find_boot_device();
-    enable_subchannel(blk_schid);
-    ipl_boot_device();
+    if (have_iplb) {
+        find_boot_device();
+        enable_subchannel(blk_schid);
+        ipl_boot_device();
+    } else {
+        probe_boot_device();
+    }
 
     panic("Failed to load OS from hard disk\n");
     return 0; /* make compiler happy */
-- 
2.18.2



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

* [PULL 07/16] pc-bios/s390-ccw: Allow booting in case the first virtio-blk disk is bad
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (5 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 06/16] pc-bios/s390-ccw: Scan through all devices if no boot device specified Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 08/16] pc-bios/s390-ccw/main: Remove superfluous call to enable_subchannel() Thomas Huth
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

If you try to boot with two virtio-blk disks (without bootindex), and
only the second one is bootable, the s390-ccw bios currently stops at
the first disk and does not continue booting from the second one. This
is annoying - and all other major QEMU firmwares succeed to boot from
the second disk in this case, so we should do the same in the s390-ccw
bios, too.

Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20200806105349.632-8-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/bootmap.c | 34 +++++++++++++++++++++++-----------
 pc-bios/s390-ccw/main.c    |  2 +-
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 97205674e5..0ef6b851f3 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -289,11 +289,18 @@ static void ipl_eckd_cdl(void)
     read_block(1, ipl2, "Cannot read IPL2 record at block 1");
 
     mbr = &ipl2->mbr;
-    IPL_assert(magic_match(mbr, ZIPL_MAGIC), "No zIPL section in IPL2 record.");
-    IPL_assert(block_size_ok(mbr->blockptr.xeckd.bptr.size),
-               "Bad block size in zIPL section of IPL2 record.");
-    IPL_assert(mbr->dev_type == DEV_TYPE_ECKD,
-               "Non-ECKD device type in zIPL section of IPL2 record.");
+    if (!magic_match(mbr, ZIPL_MAGIC)) {
+        sclp_print("No zIPL section in IPL2 record.\n");
+        return;
+    }
+    if (!block_size_ok(mbr->blockptr.xeckd.bptr.size)) {
+        sclp_print("Bad block size in zIPL section of IPL2 record.\n");
+        return;
+    }
+    if (!mbr->dev_type == DEV_TYPE_ECKD) {
+        sclp_print("Non-ECKD device type in zIPL section of IPL2 record.\n");
+        return;
+    }
 
     /* save pointer to Boot Map Table */
     bmt_block_nr = eckd_block_num(&mbr->blockptr.xeckd.bptr.chs);
@@ -303,10 +310,14 @@ static void ipl_eckd_cdl(void)
 
     memset(sec, FREE_SPACE_FILLER, sizeof(sec));
     read_block(2, vlbl, "Cannot read Volume Label at block 2");
-    IPL_assert(magic_match(vlbl->key, VOL1_MAGIC),
-               "Invalid magic of volume label block");
-    IPL_assert(magic_match(vlbl->f.key, VOL1_MAGIC),
-               "Invalid magic of volser block");
+    if (!magic_match(vlbl->key, VOL1_MAGIC)) {
+        sclp_print("Invalid magic of volume label block.\n");
+        return;
+    }
+    if (!magic_match(vlbl->f.key, VOL1_MAGIC)) {
+        sclp_print("Invalid magic of volser block.\n");
+        return;
+    }
     print_volser(vlbl->f.volser);
 
     run_eckd_boot_script(bmt_block_nr, s1b_block_nr);
@@ -398,7 +409,8 @@ static void ipl_eckd(void)
     read_block(0, mbr, "Cannot read block 0 on DASD");
 
     if (magic_match(mbr->magic, IPL1_MAGIC)) {
-        ipl_eckd_cdl(); /* no return */
+        ipl_eckd_cdl();         /* only returns in case of error */
+        return;
     }
 
     /* LDL/CMS? */
@@ -825,5 +837,5 @@ void zipl_load(void)
         panic("\n! Unknown IPL device type !\n");
     }
 
-    panic("\n* this can never happen *\n");
+    sclp_print("zIPL load failed.\n");
 }
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 9b581074a1..fc17e6ab83 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -240,7 +240,7 @@ static void ipl_boot_device(void)
         break;
     case CU_TYPE_VIRTIO:
         if (virtio_setup() == 0) {
-            zipl_load(); /* no return */
+            zipl_load();             /* Only returns in case of errors */
         }
         break;
     default:
-- 
2.18.2



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

* [PULL 08/16] pc-bios/s390-ccw/main: Remove superfluous call to enable_subchannel()
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (6 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 07/16] pc-bios/s390-ccw: Allow booting in case the first virtio-blk disk is bad Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 09/16] pc-bios/s390-ccw: fix off-by-one error Thomas Huth
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

enable_subchannel() is already done during is_dev_possibly_bootable()
(which is called from find_boot_device() -> find_subch()), so there
is no need to do this again in the main() function.

Message-Id: <20200806105349.632-9-thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/main.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index fc17e6ab83..43c792cf95 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -280,7 +280,6 @@ int main(void)
     boot_setup();
     if (have_iplb) {
         find_boot_device();
-        enable_subchannel(blk_schid);
         ipl_boot_device();
     } else {
         probe_boot_device();
-- 
2.18.2



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

* [PULL 09/16] pc-bios/s390-ccw: fix off-by-one error
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (7 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 08/16] pc-bios/s390-ccw/main: Remove superfluous call to enable_subchannel() Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 10/16] pc-bios/s390-ccw: break loop if a null block number is reached Thomas Huth
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

From: Marc Hartmayer <mhartmay@linux.ibm.com>

This error takes effect when the magic value "zIPL" is located at the
end of a block. For example if s2_cur_blk = 0x7fe18000 and the magic
value "zIPL" is located at 0x7fe18ffc - 0x7fe18fff.

Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Message-Id: <20200924085926.21709-2-mhartmay@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
[thuth: Use "<= ... - 4" instead of "< ... - 3"]
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/bootmap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 0ef6b851f3..767bb612db 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -163,7 +163,7 @@ static bool find_zipl_boot_menu_banner(int *offset)
     int i;
 
     /* Menu banner starts with "zIPL" */
-    for (i = 0; i < virtio_get_block_size() - 4; i++) {
+    for (i = 0; i <= virtio_get_block_size() - 4; i++) {
         if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
             *offset = i;
             return true;
-- 
2.18.2



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

* [PULL 10/16] pc-bios/s390-ccw: break loop if a null block number is reached
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (8 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 09/16] pc-bios/s390-ccw: fix off-by-one error Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 11/16] pc-bios: s390x: Fix bootmap.c zipl component entry data handling Thomas Huth
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

From: Marc Hartmayer <mhartmay@linux.ibm.com>

Break the loop if `cur_block_nr` is a null block number because this
means that the end of chunk is reached. In this case we will try to
boot the default entry.

Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Message-Id: <20200924085926.21709-3-mhartmay@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/bootmap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 767bb612db..942fba3fa7 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -192,7 +192,7 @@ static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
     for (i = 0; i < STAGE2_BLK_CNT_MAX; i++) {
         cur_block_nr = eckd_block_num(&s1b->seek[i].chs);
 
-        if (!cur_block_nr) {
+        if (!cur_block_nr || is_null_block_number(cur_block_nr)) {
             break;
         }
 
-- 
2.18.2



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

* [PULL 11/16] pc-bios: s390x: Fix bootmap.c zipl component entry data handling
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (9 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 10/16] pc-bios/s390-ccw: break loop if a null block number is reached Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 12/16] pc-bios: s390x: Save PSW rework Thomas Huth
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

From: Janosch Frank <frankja@linux.ibm.com>

The two main types of zipl component entries are execute and
load/data. The last member of the component entry struct therefore
denotes either a PSW or an address. Let's make this a bit more clear
by introducing a union and cleaning up the code that uses that struct
member.

The execute type component entries written by zipl contain short PSWs,
not addresses. Let's mask them and only pass the address part to
jump_to_IPL_code(uint64_t address) because it expects an address as
visible by the name of the argument.

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

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 942fba3fa7..73471801de 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -10,6 +10,7 @@
 
 #include "libc.h"
 #include "s390-ccw.h"
+#include "s390-arch.h"
 #include "bootmap.h"
 #include "virtio.h"
 #include "bswap.h"
@@ -448,7 +449,7 @@ static void zipl_load_segment(ComponentEntry *entry)
     char *blk_no = &err_msg[30]; /* where to print blockno in (those ZZs) */
 
     blockno = entry->data.blockno;
-    address = entry->load_address;
+    address = entry->compdat.load_addr;
 
     debug_print_int("loading segment at block", blockno);
     debug_print_int("addr", address);
@@ -526,7 +527,7 @@ static void zipl_run(ScsiBlockPtr *pte)
     IPL_assert(entry->component_type == ZIPL_COMP_ENTRY_EXEC, "No EXEC entry");
 
     /* should not return */
-    jump_to_IPL_code(entry->load_address);
+    jump_to_IPL_code(entry->compdat.load_psw & PSW_MASK_SHORT_ADDR);
 }
 
 static void ipl_scsi(void)
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index 12a0166aae..3946aa3f8d 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -64,11 +64,16 @@ typedef struct BootMapTable {
     BootMapPointer entry[];
 } __attribute__ ((packed)) BootMapTable;
 
+typedef union ComponentEntryData {
+    uint64_t load_psw;
+    uint64_t load_addr;
+} ComponentEntryData;
+
 typedef struct ComponentEntry {
     ScsiBlockPtr data;
     uint8_t pad[7];
     uint8_t component_type;
-    uint64_t load_address;
+    ComponentEntryData compdat;
 } __attribute((packed)) ComponentEntry;
 
 typedef struct ComponentHeader {
-- 
2.18.2



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

* [PULL 12/16] pc-bios: s390x: Save PSW rework
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (10 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 11/16] pc-bios: s390x: Fix bootmap.c zipl component entry data handling Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 13/16] pc-bios: s390x: Use reset PSW if avaliable Thomas Huth
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

From: Janosch Frank <frankja@linux.ibm.com>

We don't need to save the ipl_continue variable in lowcore and have it
limited to 32 bits because of the lowcore layout. Let's move it to a
new 64 bit variable and get rid of the reset info struct.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20201006094249.50640-3-frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/jump2ipl.c | 33 +++++++++++++--------------------
 1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
index 767012bf0c..b6aad32def 100644
--- a/pc-bios/s390-ccw/jump2ipl.c
+++ b/pc-bios/s390-ccw/jump2ipl.c
@@ -13,20 +13,17 @@
 #define KERN_IMAGE_START 0x010000UL
 #define RESET_PSW_MASK (PSW_MASK_SHORTPSW | PSW_MASK_64)
 
-typedef struct ResetInfo {
-    uint64_t ipl_psw;
-    uint32_t ipl_continue;
-} ResetInfo;
+static uint64_t *reset_psw = 0, save_psw, ipl_continue;
 
-static ResetInfo save;
-
-static void jump_to_IPL_2(void)
+static void jump_to_IPL_addr(void)
 {
-    ResetInfo *current = 0;
+    __attribute__((noreturn)) void (*ipl)(void) = (void *)ipl_continue;
+
+    /* Restore reset PSW */
+    *reset_psw = save_psw;
 
-    void (*ipl)(void) = (void *) (uint64_t) current->ipl_continue;
-    *current = save;
-    ipl(); /* should not return */
+    ipl();
+    /* should not return */
 }
 
 void jump_to_IPL_code(uint64_t address)
@@ -46,15 +43,11 @@ void jump_to_IPL_code(uint64_t address)
      * 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_psw = (uint64_t) &jump_to_IPL_2;
-    current->ipl_psw |= RESET_PSW_MASK;
-    current->ipl_continue = address & PSW_MASK_SHORT_ADDR;
-
-    debug_print_int("set IPL addr to", current->ipl_continue);
+    save_psw = *reset_psw;
+    *reset_psw = (uint64_t) &jump_to_IPL_addr;
+    *reset_psw |= RESET_PSW_MASK;
+    ipl_continue = address;
+    debug_print_int("set IPL addr to", ipl_continue);
 
     /* Ensure the guest output starts fresh */
     sclp_print("\n");
-- 
2.18.2



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

* [PULL 13/16] pc-bios: s390x: Use reset PSW if avaliable
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (11 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 12/16] pc-bios: s390x: Save PSW rework Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 14/16] pc-bios: s390x: Go into disabled wait when encountering a PGM exception Thomas Huth
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

From: Janosch Frank <frankja@linux.ibm.com>

If a blob provides a reset PSW then we should use it instead of
branching to the PSW address and using our own mask.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20201006094249.50640-4-frankja@linux.ibm.com>
[thuth: Use Elvis operator to shorten long line]
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/bootmap.c  |  6 ++++--
 pc-bios/s390-ccw/jump2ipl.c | 26 +++++++++++++++++++-------
 pc-bios/s390-ccw/s390-ccw.h |  1 +
 3 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 73471801de..44df7d16af 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -273,7 +273,8 @@ static void run_eckd_boot_script(block_number_t bmt_block_nr,
 
     IPL_assert(bms->entry[i].type == BOOT_SCRIPT_EXEC,
                "Unknown script entry type");
-    jump_to_IPL_code(bms->entry[i].address.load_address); /* no return */
+    write_reset_psw(bms->entry[i].address.load_address); /* no return */
+    jump_to_IPL_code(0); /* no return */
 }
 
 static void ipl_eckd_cdl(void)
@@ -527,7 +528,8 @@ static void zipl_run(ScsiBlockPtr *pte)
     IPL_assert(entry->component_type == ZIPL_COMP_ENTRY_EXEC, "No EXEC entry");
 
     /* should not return */
-    jump_to_IPL_code(entry->compdat.load_psw & PSW_MASK_SHORT_ADDR);
+    write_reset_psw(entry->compdat.load_psw);
+    jump_to_IPL_code(0);
 }
 
 static void ipl_scsi(void)
diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
index b6aad32def..fbae45b03c 100644
--- a/pc-bios/s390-ccw/jump2ipl.c
+++ b/pc-bios/s390-ccw/jump2ipl.c
@@ -12,15 +12,21 @@
 
 #define KERN_IMAGE_START 0x010000UL
 #define RESET_PSW_MASK (PSW_MASK_SHORTPSW | PSW_MASK_64)
+#define RESET_PSW ((uint64_t)&jump_to_IPL_addr | RESET_PSW_MASK)
 
 static uint64_t *reset_psw = 0, save_psw, ipl_continue;
 
+void write_reset_psw(uint64_t psw)
+{
+    *reset_psw = psw;
+}
+
 static void jump_to_IPL_addr(void)
 {
     __attribute__((noreturn)) void (*ipl)(void) = (void *)ipl_continue;
 
     /* Restore reset PSW */
-    *reset_psw = save_psw;
+    write_reset_psw(save_psw);
 
     ipl();
     /* should not return */
@@ -43,11 +49,12 @@ void jump_to_IPL_code(uint64_t address)
      * content of non-BIOS memory after we loaded the guest, so we
      * save the original content and restore it in jump_to_IPL_2.
      */
-    save_psw = *reset_psw;
-    *reset_psw = (uint64_t) &jump_to_IPL_addr;
-    *reset_psw |= RESET_PSW_MASK;
-    ipl_continue = address;
-    debug_print_int("set IPL addr to", ipl_continue);
+    if (address) {
+        save_psw = *reset_psw;
+        write_reset_psw(RESET_PSW);
+        ipl_continue = address;
+    }
+    debug_print_int("set IPL addr to", address ?: *reset_psw & PSW_MASK_SHORT_ADDR);
 
     /* Ensure the guest output starts fresh */
     sclp_print("\n");
@@ -77,7 +84,12 @@ void jump_to_low_kernel(void)
 
     /* Trying to get PSW at zero address */
     if (*((uint64_t *)0) & RESET_PSW_MASK) {
-        jump_to_IPL_code((*((uint64_t *)0)) & PSW_MASK_SHORT_ADDR);
+        /*
+         * Surely nobody will try running directly from lowcore, so
+         * let's use 0 as an indication that we want to load the reset
+         * psw at 0x0 and not jump to the entry.
+         */
+        jump_to_IPL_code(0);
     }
 
     /* No other option left, so use the Linux kernel start address */
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index 9b86c120b4..6cd92669e9 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -76,6 +76,7 @@ int virtio_read(ulong sector, void *load_addr);
 void zipl_load(void);
 
 /* jump2ipl.c */
+void write_reset_psw(uint64_t psw);
 void jump_to_IPL_code(uint64_t address);
 void jump_to_low_kernel(void);
 
-- 
2.18.2



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

* [PULL 14/16] pc-bios: s390x: Go into disabled wait when encountering a PGM exception
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (12 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 13/16] pc-bios: s390x: Use reset PSW if avaliable Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 15/16] pc-bios/s390: Update the s390-ccw bios binaries Thomas Huth
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

From: Janosch Frank <frankja@linux.ibm.com>

Let's setup a PGM PSW, so we won't load 0s when a program exception
happens. Instead we'll load a disabled wait PSW.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20201006094249.50640-5-frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 pc-bios/s390-ccw/start.S | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/start.S b/pc-bios/s390-ccw/start.S
index ce519300a1..4d5ad21653 100644
--- a/pc-bios/s390-ccw/start.S
+++ b/pc-bios/s390-ccw/start.S
@@ -34,7 +34,10 @@ remainder:
 	larl	%r2,memsetxc
 	ex	%r3,0(%r2)
 done:
-	j      main		/* And call C */
+        /* set up a pgm exception disabled wait psw */
+        larl	%r2, disabled_wait_psw
+        mvc	0x01d0(16), 0(%r2)
+        j      main		/* And call C */
 
 memsetxc:
 	xc	0(1,%r1),0(%r1)
-- 
2.18.2



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

* [PULL 15/16] pc-bios/s390: Update the s390-ccw bios binaries
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (13 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 14/16] pc-bios: s390x: Go into disabled wait when encountering a PGM exception Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-06 18:31 ` [PULL 16/16] tests/qtest/cdrom: Add more s390x-related boot tests Thomas Huth
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

Make sure that the binaries match the current state of the sources.

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

diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img
index 3074686a8c7448d943aa62f810d88d3e92865ef3..5b57ea2837680ca6f6e98e7703b89818fd8fb316 100644
GIT binary patch
literal 42608
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

literal 42608
zcmeHw3v^V~)&H4fNJ0p3^JGF0?vMxpOqhgMK#`d|G$@bZr9o;TBm;@&WisLAgNRW<
zYYkC+RKGe}=ml(bK-+>ZV(Zu1R$GeoQCllIpww8M02L6({r~np_f94OB!9l|?^^%0
zoV6zB-1FFHzs^4U>~rp9ZPAP?A|fmz^obNH$QuRGL8II$)2IBLIz^s{5l%5s48U^~
zzE)X}GWqF|TH0i>nWDE4k@y<@B4oAbnPLR_F;l{ezI}}Hb0ixHK0aou&;#`&T=Dtw
z>oR?&M;htm^2mlZS<n3lsq^$B(DX4=rjKYd>0>}bMD$2S26q#o)LQO6I0t3XMtN@&
z1^wotu`%Ac=(FTWfMzNzW2-8cj;$)6I6k|fHamxF2}TmWkyp-IAjG(s2i{nJgZ{T0
zo_Q<nMgQW4Yge3>Fj#)X8|EwiSo(?<)u^NLKC{L?_ul#sZ(4H8BR}ka%j0kT-KaZf
z0);T>j@%#CC@NksKT))9vn*#m4?uYwKU)p9%62JT<*IBhBASu0gvukEjB+tV+*Dat
zB|J;Za!VV^L{;s|vf6r&K-p5W38l~OH=g8pq5jVv>Q)}Y@7Z9t@(_N{9`9bR8jpUH
z00Vxg+|0;wi_d7k!*67a_T%=-=N)Z5%FEkpgAS3Qozxv|2Zb1zPJb`{UK_@na<WYo
z;`>qi1_obH#6D~A4~oKV7P|bw7us5cxc<17Dugyl#1!PTi2NLXtd=G$+DQHD-BvM%
z+m3DX39;ZG)Gi>9wW4*@9TAZ+NG-e9iG<xk#A|7~-qr+oe`=2x(?pzGX%f^s(XnT3
zlhC|kRNE3jd0DfG$fQ9wd$F=aY*2+|%OL$kN`ezl+9*IkkBD&z!_oe7Z4L0aO+;#5
z{Zpc1N?)oSaESg|UJ59LNx-4Ri5Bg05rG~p0SA@wI2(#pr6!;_s!^MV5fh6YON7m}
zWs-ivmbk%*ai{5eO49BokxpYX%wrh0*`k!F@;T#6;^6h=#STT-61Tu&YD4pKwPtZ&
z`#9kc{k5T!TR0bovOU^Rdo<D)nd?^v96_JRFu2}_xb9MeK9>@Fr41-fxk8&RVo<xy
zCjt(T*0N6ocl(s~66BlO7l_M5oYq$i1a=N>jIg*C1h=`y1-I=Jif{}3wKxQ%6ro+I
ze@L8}{2_B@ktwkO*HG!S@m%U=+A_c+9X$FN+_1PE_9jp@)akG{BOQYDF5=q!FG?JW
z4Ylh7szRJ2S#^_?<gk=iKy}oJjST%d?WkTxxrE7We!zJFnA8Ux$Xc~a_3_Z0H=rv+
zTrLN&cY+E-$4=}S#=4QmeTQk;ka)9DO$pdnP`O%5auGkIe7{nrcP-`n2k5W(mDzgI
zBw%rv>nC&lTLFbI2q=n`{@&DrIdWA0C+TsU16&(IS|0#TqQy4f<!TWx&vBBbCL7ot
z)h0vcqeK%yi=TnM&k*#yqx5X~o(U)K^x5I)51VidT~%0DheB@6B1#)d^3d-LsDvYP
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
M*2pCE*Bnp$A1vB}761SM

diff --git a/pc-bios/s390-netboot.img b/pc-bios/s390-netboot.img
index d9c319604b1b37660cc085c62915b25b9abd7abd..3dfce693f595a39daa5b22c75823818eb8062303 100644
GIT binary patch
delta 27217
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
Dm+ZK?

delta 25511
zcmbt-30#y__y2u{0mcO#5M<bgMFCM6+}K=Z5EYkna>X4@%hJ?(X<vqvO4ACtnOgn|
zO?ymRMlF>VrSdH+Eiy|pGi}rsS_Z|!jro7id4>tiUitL5&v2i6?>Xn5bMCq4p1V9x
z6_4vH9@m$}Df5?^x3@SX_@DmJvSVHIPQI??8dD=>75oCU@&+fRfhCuxLijD>`o!HS
z(yoLD{|!pst*nUuTd77<u{WmDqDv|0{n4lkJ6`*}gL`7M^RCs~C##pLKGOh%A5tBD
z%+NBuS!az7E<v9DQMuvQZ>D!!QuTYlFD<|5ELZC~%e}fpWxjOl!lti#ubSZig)}-?
zh}M)3T=$;Fx)4@mQ&HZE%O6teDaAiCem$GO@1a8cBQE;=RbC}W`1NT$ZO)vjbLY*N
z`JbtC=Ex;}@qqveEb;7-PQUQrMh>)=OAPa6m0wttmoq>e12FybaVFh<UHsO)w?~@w
zVY+oyGE+ZDu}FtLT$f?mx<;SUs@&MJ;MO(jg$pHBCx!4IU1b(xjz2#ypud5msw_e{
zepDlba0xu>)l?C%Q0He*<AkD?iq7f|A*#xRD0x*5Gj{4>J{FRo7K=>vO;qm`ermDj
zBoUo`jL0QqxGY3uxz5sBE%y7W$_hk>+-QuPRA8~pU7zmp*eXt!RF;TtR-;u^>P06)
zGj9UXQqLDQXKji)SSeJq1=Xcd-2@`9OkGRQv9m)GP#&V@``rnil&LGY=^ZjMIIH!{
zp{PnFu$+(Ol;GGYlON>T|D&Rr7W$h!nEqxz0s1Yu?gg$(Q12Ek)Rm&8Y7%-7$%PJt
z-FW(b#u=)1^>|DR)KVpbah_)!gFGA@Ync5GWoDc$4>3m;Mpx<tbfefp7U6HtMs5m?
zGAE>yZgPmcF~qE!5F;0b4AD*bOdbf?5jvY#RHpPJDpT&SnvdsfS<%kYeoC%7UWB4=
zlquaoh&3_ds65p!))9BA5Ui=OLT|bqOxZ&2Qj?TmX6;s@<99Fp)eV6#0i;Nm`Sjf)
zv{9TMBN_!Hs4RO(0*jVRLaN0LJ1Rp(Cega3k9x1iLoheIsXpDXx>04f4Cu*)P6ist
z&xiSWAwB!`roXz@Xe66U=P<-7wXUJkWv)#T?J3{qCAlXw#c)dkSKcG*L(L(#L~v#%
zAn&a*3h{tlb_z?<#eO91VJVKuH&JcjX4EK?r@4%^29bm|GHmUQLLDr0+*WG2FbaYj
z7fkjfmZ7F4>2PuZ*AM5q_t}6uK|R7&RGS1n8$oG^nr#q(QYLq^8*7sY^13O2+}+U4
zWvP{ahK1>3zn5*=M>`5<H|ifvq%&bQE8T2Dim8GCKZ0P6&0JeRB|S4KM{u{^N%`r!
z)VfOtybx@bJv%l++<Y@byb6e|h3Gf*2J5IpEvUXpbs5vLAQf@k4Gl1QVLKvza|)v_
z1L{(5XDO2^scg(R7$)pjRFd{4y;d$t1nG@5GwCJ9eF7Ra36^^LeAzO*W9*pDKnl?m
z4OBg;7L9TvV;+&i!;?CVX$26NpcsWQOO;vWVm_rj2*=!SGtXD3{lal_b$FyMX1UxE
zp5&M`M7>7{aQPj#+=sdDjQl~$&tmJEo&<4+_|#n75J1XM?}mxidHOP*f$@yM3qy-}
z__4js+C$~j4xqdR!QE6x`B*#C{uIwqV%i^S-Ng%mfmLo1GI0-8+<zRZ2$|ef-fQX^
z7MO1_gS`uD4?<!n38pBnlhvlwpo0B@iql(?BLgBj1a(J=+glPZvm#RTf%qqjB64)o
zPRi903zf;z963oh?QZ#CWcQ#@szt+ga5zcsjO?kLk#&(%bkoA*=%{`XFQ^+m4KPb3
zY>m2Ggp*4q(4ybv%TaxGMf>D0QT>%M(h@zrThXPelOB&}AjF1iz>|&Sm^q1`bLnqG
ztH8jT=iLS9)M|LBF>-hGt;(;mTTHh$MHLM8IEhyDrfd_Npex!cpN<)>E4o9Tis`5;
znxhrY)C!~Jg4mppsXsH><BbyBFj{^Z`?Br^McyA*=$N{iYsXM+%{;e7B&ioJt~A{a
z221f<PP2&1;;s-$2dCB=Y7Mpu{EFN(PzK{S0lzF$GSe8r{x%PG)saT3|459#U{MBJ
z>ke}?iZV<;F_@iNtEK+=YOv4&(h-ljNT(*DV!SYe*g$SfuaWdD;MuCq^9h3&dur4S
zMhjr9-Ja8=y{Ut!`Ahk5{(d##B3QJ>G!;@+f|^K|(Oo5yz;KnVtai@+wzacL#D4$U
zyGv*wV)PnBL{$X<gXOE{;eDqD5~Yh5FrCdpJ@?SXI#W0(dlngmiRfw+|4vCn5Q!dB
zK421W_|To}<2)W9hW~Fw$CSqyvDk+=4+s@P|93RF5ySqr?)??$m?9y{_6zs-6~>xE
zJeSmr5xt?{2+<ZzW~j4;VheNc-!IBAB5dvWNrB^i7FrzS;ekA56t{bQmapONq}1sn
zxVTH9v9`4-L(TEjSGE`3@#6_=N}d)jxQsAGJ-W;(lECN&@<dQz$Z}CTOO|9rIJ!GU
z<8YYLRV@%^nxWM?q3@q(SJX6wA~u2P%X7XmUc@6h_@sZlUF0Q##VFL(d42@#A4M5v
zpjoh=3{heVQHzaXc(SU+ZJ$MIM*1;QBhsEo4M>ZS>eb>l4Guggc=*I+cK-wd@uCFi
zqmcr=&BI86-ex#bptp%a3iO~KkpeyFC8Ro}cOnIqp#EUyXN?U|(SbIo1Sv>CrS+#s
zL8Y}s3hdTJuvzKXIiur+*-%XlgfO~yh$QMcvO)LvY=fy#dkpocEK45JYbuZM3l<c1
zBu!pO1JW<eLq!bX@tk)zqMok->aWd1&0$oh4|Nkze`_8pkC^lGeW)bs@6AG;a)4X)
z$$Fk-b+f@=OHEVO5b8OftmjD9`sSg|WmKQ6=OAmX(maOQKcDl-dJeMI>cld%eNBcj
z>w#gPtmhzWt-e{UPX3Zm>wU7;L)KdV=Ak0?2C7fidXhDuIjD}w^BC19Ydy&tcsVNi
zJVvu)ge~Ne;7MKPGR-4Z!y^^oxuhnaJ<@pgNFCsL6k9&Lae}*QKYWr^;ID#tI|?H$
zQ}alZ`&JDmzPmLVRecw=06sJnKE`_HkkHr6JF`;g1M3Q`wJp7#!DbcY8FX){HV`ZJ
z3sY_IA;r4y%RBdUoGphtVmD;PvLsW@YT|~vSv5D5(bNrzmi^<cA}=1!%j<>;%xKEO
zPAJ|WOzqIbUNv4%O|4Snb(D5d;}vT1JiJ8-@)M9+F%8BW@L*Pp^{0rJ6_@c6cMV=b
zFf;z07mH79cpMU2e;a%bJeR(g=6m#hNa4Bs_8^7l@>>pH<RJ}6L+36ITT>p!pZzyH
zK<${&8#MyA42=XjHHib(XaWaZKnjl-kc$-D1tuVcXAB9Ljt8(8@HSGg=YO%hbC3K#
zj$X#r*Z+ns>FyGm6BrA!r1=F%p?Lp6NWq7HC{ohW*GR#K{zar<Lq8iS*wANzjjn&(
z2TN})+H0fQR_5Met9F0&zr1$Nc&tV}o<Djc%-G*(vw!pi0cW#Z()b$*{p|Th)U#)S
zx}iC!Gsbse)Hi*oZvYiRgBqJ%hUluL8XF&oGypMJuv&cSzQ*8+f-RfX{Uc%j$?K|1
zw=OHGr9QclX8-X~O!o<%$DbP*;mF5Oz|2iy?fCZGGcYEe$1^aG(;#U&fRfHV(mw?A
zcqqmq&GDGW!9fCA70lH{3QL?~IUE4Z{kAb)>hKri9tQP^WU3nVGNx{BLLQq4Vpji<
zGLaYd7kN21FUHn{$#GLJC-XNZiAtX<nUoE-nDI@S>3lgAjhQQW3AvJ&{ziD4x{Eu!
z>D%7)b)wFqW@{TW<6;pI{Uxf+OZ~5as2zCB?%$3iwFos=QzTKjj(GG^8T&&ssPwy%
z3M{^a`6|7*kthysO7Z<`P|U!-#n)F-^h!C8s5zQayYm{<t|}!h8vdubG)mw1YSb-F
zqDms)<{y}C;bmI6(tO6=czMVF&3xkFn6s~DKG!!fpRty!G1r7QqSEFc%qPgpo4?O&
zX#8P>j5*T`s^IO40n*qlja1%l29<x{?ZWdKZx>cHcT|rlq1G(EVf}Yor}6lArZK9o
zZ!)UK*qYHTVES^`<7GBOOV9s63gvF{+Rzx~8mb@@YI$`NI`8yS-EgG|jd`&dy#BKZ
zHS#w58oXgF{*!rMxWy~^be{<|QcZ0J)vJ1*rg|Iwdo!r~!_Yf_(W|$*D|s9JYBQ)_
zo40Fuo&TY?^G|qrd*pAt^}IH3%D5{n<x0yK<+`?IC|Orp@s+%cdZrn?D1YMxw%>FP
z8g<vTsfZ7*Nu@dV^!zocn47^%$+f7A{IVHT249Uz(^+fe)@D%YcqJ9hZtAyc={cP@
z|ExFly3P6(-n@EwxuafQbJ`oM%>g5yxZH&P7MR$0ehQ^Iz$(<Cz8LI(O{!CAL!PIY
zk>SlC-=_Z+<h|0AdeayRBuB2JK=SuaYTdcjWWmuiJyI(cAz*tcP2!(;i#%>^Hx#o#
zsO2)YdF^tKH*~xYp<{TH(D5$N8xML|*^TOZIX$bKHXw9DoBq&1UbtPTh&m|})z~|e
z=S_2(OMc{~tB@a(eI@y3lY93n<l_H<+tUX$Zcp#MQi&t)xSWhviL?H#5=ZvFyz8OF
zL7_wX{A(%oS0Oh&<Vtd0=`7wf#haR&tIX?nU8R{Jv#xBW+2j^ojoh4nO>X2>$c-Fu
zB{@y#+9l2AGW05BQ~$w&YDas?7c{0<T9SSDRW0d*e``thCoiYR!*R&RS4!PnY3(Df
zMo#_L<T_oAT=BmpH{#G$$c?=2N^+X+-9wry^oT82A?x^uE_S!`lK1nbfm-^z$D5wv
zaJ?Cxbi~9fn$?#0@!B4loI4=!-;b>kl~>RvFa7Tw%!qzh83dXC;9!2A;?=}zZ+Zs~
zy}onL5`5NXA1`|h?(6t<CZ98hxU8pfs{jWFFNtL}-<>uJ>^RbtHtZ*w(rVVyvmG}w
zJf5F_p}#-9&1Y!4+=X<8<|)FS%oc`U#xRGG=L4mmzhq1|mwv{W&o^PiPuTB~b%RHD
z{pGyNinCpP&3D*pYizre;5{$#SsvP-Q6Jbqr-3u-w%$1;OsDjeONVtFcEguwE2$<y
zgoxHIbA?$LkY9k`ZM)(sgt}YwRx2@`t`wpsO$3M_z!(JYP<zVMw}cW|UTCZk5m9QA
zr?&jMaOGQRx-M1OBlE87=m4j$x$U6-0%KN~f$5d@b+wSr3NaJw3(ZzTq0!nJdpNDs
zLItHxE_I^R*}DDp*vrksZwz?CJrW#xI_dayH0sd4F$8;6o>MGoVWGJqg&{@-Cp=~r
z>2XjB)IsO#V8l&|(T*+Yv~>6b#7Y&~x*>%kj2rsM9>dKcH+05k$qCZ>4Q+|mr33QD
z;g34D6q?PQ%k}OTxus?3^-@LB?E<@TbH3f^Oi^!!mJnP}zyb>1`y9akkIU%nj)S0B
zY#)}2c1R7t%|?owH%cnCbR8}gcsxJyDbA@sNIFmy8g-`;nu>Rj0;ma_b+ZNJ>4FR!
z$fbPT?I_1hlu@>d&8uxC?oEW|WyT*+1%M7AXuHw9DX+}^8Vi+5W~=low754>_f^J;
z#L#&B4GwK*H&>7#jkv*#>i{w%1~Fo)x(WM+&yfVUezFp2o#%sHao~Bk*hu>h_hzUs
zf!X<P6)d5@jL?&N2eU=&jprLUgTNZ?+o!q8+&B}oR=D4`8r?gQsz_g=_AY+O<LkAc
znjA7A04KW4PWh<)jlNC;nU1qF$_ng>#uN~1N5mLyI-^~`KCVPm8gNBqlTctxA|euI
zdILep`PYXz1~Jr7Sc!!W3N#CW{&ZKUKL8gMzDK#Ax18#!Tj&DASJZ(8&rz$VexT=J
zGx_;AKVRhMZ|LvIO$@o1OZL;VV;FDdp4!WxKXAnd4Ei*eOrz%uU(@r@^Zfh;m+Sd?
zA3wL_=MVXr_hB!*%btZV1$f6=Il){Eh5&SEzQt~gU+to?7|4VgGUU>c5sn!+ytk^U
z{`GW~qF)BQe>Ze)6uL^M4)(7HA`iZcz13}=-+Z|UZG_QwFYY1yNF$6`DF~t_PmN`^
zaM=UTd^uwn8~UjsRB|$sY6qb`)Y^J8sE#wa{5+PQ8Tq6?$pmlmq}$5=(hdd|;>Qby
z3(v};QBlfI^8Qf~*@sZdr_)G>sN)sf6oL--(f;s4A@WhG8Axw*eW|A&2E-oY!hHGZ
zsA$7boSz9X@OF86REMB`E+>?vuc{D=HA5zi-lYtXCq@raYGvm!iGk?^IiO089g{QA
zWfTU{9$YK^?x{(HRQj4kAw*JOt(R~1^W=1fM)<rv&~+n;h;oL!^3>7tw=pRWCNiLA
z0MPYSM!4_yYX*QI4$Oi5P-VDy%kC5gG>9@%(~!d?;E5gBEmIZ-`x&@w50|}4e_ap$
zHD?XkM~!0&90h75nbqU@csu$o;GGO3HrKK3FV~MXrajd^!z#F_)N{s#MliEc^Lo0{
z0ImHBHgI7H%sJ$-v5~r|ugHsI`<hN&5C5y_yOgvmLJ8*Fn{wp1$x66%j_VLOkmSvu
zCXbBk&>@bWy@QYXrEvhV2yM8wx9nJ$IPFE8L~KCow9Q+p-6<Fn!u2uQ(7g=XBE;aY
z;g5d%%heCX-AJBeUjSseb{m0O8T=<v>3?2sEbI`NNtZw-ACO-a4pNLVcKk%g_rB?)
zBWP7O8uwt#(ZE`$&f=R&zt{Y27SDf|Ro}AF+FbtJnwd(!$8|f8=lEx^j0UfD@El1~
z(2z^uvv7;QyTWC4SIGMDvARC9rD;M!>mgrL4eUheGg=OuFkCnJn0$J|Y}*i*aXueN
zR|pYV*+N92$zJ#kwZ)gAD{%KO+XeqF+Ebm&O0YJ|e4Veh)7HF+vlXRSzB=inFb@zr
zVgAw+FOzN|^vnTr>130xpHsd#`HR5ms8IS1k|k3TgYIz|%W!(jCFxt8Q_>V=vph1j
zi}HbNSu|c*C1(_Uh!CUmv|Vv6yxLz&bSGH21sW@1)ItxyPtVi!og;@&KX2-L7kX})
zt?Y&N<^7$$TV@#tWzh{WN^AMx4ROj2JV)!g|0>_UA<hwoORoiBdkZe7(M%_xXr<3H
zM7aAddhWfHm9|XHQWQ+#!fG)_mj@VQ?PepoLx^^Vz)k=tbYsj_jJd^D;jT~z>rF(F
zl)|MeRFk4m&T6dvzFax|dbuJe%t&g}XEId>*K<Qd<<c3Z=ss2|GJOQ-G~$f3)TbAf
zg?=HcX2gZHLd_P+_X=3-6h=br9W3i+qz`_MxxO3I<+{R(&31yZd_#&GvW#kSYq(@T
zVdNe}RIt%iVkBQM9|}E;saMIZh9N7tpUXKjGnELrZf2IQ_gZ;$rYS#{4cD@WBl}`8
zgIj%cS31UisaR|`yVr5a0=wC1Dm2oR?G!e%(@Naup5b;U$ebIe4D4-PE}T}o(F{b-
z2Ac&S#M&DS63x%-9xWZYsZvh`B7t=fIg{(+39fU2JbGhn`&=IA{^N1RL|1!$V-EB(
z<fg2U++Q1&)QuIC^R1k8Q%payP+x~>>gdK!I`>1w8Wj}IfN|U~_H`dTJg!uJk5Es^
z-70t7)TwvwCMq%xblGWaxQd+k3$np#Hu{Q0VNHccf`Qb={>y!oaM~rw*jdrK{y)jy
zvyw9wFV`XFDHacs`g2Bp>F3nXr~I9^GUqQEvNoE=o?;%}l~2vG>iWjXuV!^J<g!$`
zt)$`RK1zxlcyoS_oKG+z8DX1rBT>nDudw?&M?k7`RRwaDb_?ImOhqJvo4({~h3L9L
z?z}m=YxeV;d6m$zSK%6`)#h~00SB1v0Q8vF<w^<F_jyDbZt3XAxd(KNwh}M(xps_a
zAf#MIeX`bpB7heIrOFXo1(W3w(RH|&>=-rMt&O|_=6guFpIH<pzH@{m;aeVjAvml(
zvzO*VsgSSS606LVdvA#f8j8!ydxQouM%LYO)RC<g+MTSPY>Y!~WZUhaX+OP#`X_sp
z-3}c=wDh-`<}x)!QLJWTbfI~^Xga>zUN*k7d3>jDu{rCin-~ZyDSZVyCJU%1&$5~S
zI8g5Q#|duYSzpBjlvkH4XA!5M=_lpgbNV{6ZIlT*f=G#if1eFyr@4x%X%<Iq=w>Vp
zD-be!eL;2%l^WkH*CEzU0bZTQ54z6<ehJB!#kSUk^_BGyy0Zk4=6|RbP;|>!$-0v$
zbn&n9M~`OBmpQja#kJN*H3TxiH-#2wC^>|z!=$3DFJ<wqopf1!WW}usx~w$0`_>Lh
zx%~Ooc=+npb4`xSdx>J_#RQyLOeTaj!!@n~c2Hec6(xB#%b8E9fz0n2esH-TWT<P1
zvRO`R<zu<L4`f;cj;(MHof#fcALx%~`uQ4tPnmZLbhzaUbED(na73BOw%966kKu<9
zyDD_FIz?2~1dA*YB#+EBk3~EmhKr#M*tG7Y4iO4`U_Nu#uf_!Q5(aHa*9>fHDuit_
z256n<!vc_2Q~S~7$`A|<9pqYK3+9W=n^C`Aj+~bqcstQa+a^oqSwg&w@hw-1+^qM=
zx93GEE99Yhz1s9%PLN$*t}24xeo{uy@6c)_D6*qTn=FUTw~cb+g2xWXZzS*8djM)X
zGEOo54R{>+9Q;NCf-Xraz58<c*U*l*{xD=3>VgMG;AN)JhiP<?$L5a+e4g~zTgYCw
z#YX0yCZv#CA;9bEaIC~|i-W3jPsq8qMLTl$QFZ5rCNcW&+V%hm_g8q-?_o^P6jE<3
z7gpYF&!_9U<-}JG*3jU9uHmmIYMm(TPNVtAit8kxewWunv}r8w7r^DSRY#g2HE$u{
zz71SW2ve^_=!@MAl#im@AC2%<az#8WI}g&}l^mkeug+JVi;yPGw17&pT)t9^7dpDi
z(gqa=eHBUa>D#TtvY%xkI+K>NmlJOP?KZ4VS=7g2l<ZVeX%VAjKTNQx4G670m2~4Y
zN&G=`NcKH6!RFj46aF(m`9aS5PnIL+W4dm?E6zwW=`ZT5)D=o=Y9wbX4NCUtgv23G
z|9mFDnsB&@g;<)!@)WX~EGnmrW`BlxOsglMAjuF=p9Q9s><5v<1$=BTppQK*JZHL5
z=JYo*r8qVCH$>mN#Vr~L-elS)rx$k*+(o2%UXoAT5lel|%1w>O$gT0^BJq|;UBf<Z
zVWqEyn_yngkgD>wGEYm0PztZ}`jj)#4~VEtxg)B>8qU86j7^&5HjaSouc;<24695<
zRuo6dvSR;04xD<H0=sig_ErMubcz6gek&n126WlDcaFL}VD5}}T>37(_qkct-BFy7
zN#l<-axo0r+Jac(XElWb^nKjfdGfJ4dss4)8^JF8%wVOSgI_96T{Yb;`hf(`dYXjH
z#JU<n&XT{~*~^j1=FqE_iw5$-@fcYAmFQ-<F=Mx+{`LCt8{zL-veY1xb%+@c_0|<u
zSwVUqLHO8sf(^FV^MRM!ftr9syYGP-hdWEi7w#IXw3O%X8jJ;K{@wA)Q}V{Ue~pU)
zi72?aHdwU(2Kx-L6;-6*vdtLWyHffbmbc&2Mah&E_jJ|uc}rH`Gh&(pEtSK9{v_Ic
z?y59nU!+v<;4}Oe#Kz;7x4z#a-;x4y<`d^FmZOZ`xZ*h{=T_E$#69~q<e^YbJ7-GH
z1ctp!mfV}{_yMg<2i={}K>*eE$zUv%U+Q|Af+H^NNcEtQ$h9k>)nc(~SKN&znzH(Y
zBUg@EdaH)LY66>wp$K^&pEh$5*R{w%DRXHvPblie1TA(aNMTI;uJT_yb^r|g^dBA_
zs~QO#a+m9hBGCJ1Olj!UCrLTIPf`cE5N-**4f~x;F;JG=m(#kp6Nv1|Q<CHd_oXSH
z%G3At%Uz&J?fFd|9AIX%h4zvqkpX-rIAtQq&!{GU#cC{yXrvPSkeqY>>@XKw)$hQh
zS%IUgr1kQb`@1Wxr1^murCRoVV0O$0s7o#vZis}CU$w2Jnb)&}SkB!cKX_nC)YE`S
zby=Nyu?$w0f<2jf%pP@+W15`vU}nS}i04g!=|!Aj;p(mJc(Z)_!Q?JuY?cZ?)cD!V
z?pLUdj>A-whg^3qHsm&;#(<g%uIVR@j?uatx4hADYxrh}zXhG%0wA;z$8N2|d-7*T
zPi2WTmxM*EW@L-I0>s$$bl|u0{NI+tOJbB|a!yH{k}8*$*ur~&)>_cY2Zq&03tKNG
zo!aL_aqOs9(-AY3iY_F1PLND`Xo4>LJ6ZBjqT?ekCmWk$C-K54`z_QhayiRLccp?k
z0Tgvm7Ay21hpGtJu(NR;27wqn5Cc{W9^^73qeo+6@L-n}MVOGWtMsIIingGZCdeL7
zIUGi@KH8&m;k8FDN+J%k??N+*%W5&8VJL?UD+zy*=f=XR`L?4$f_pypQ8+=cfmfPN
z^SD5?=<)o*jMco-Xvj6yY{;}H%2@i9z=#sDU$ZIIVw>(b$%}#1fteT}UtTaunOMFs
ztW`DkP>Gj1&je{+*k8F$&R95E87tpgIL46%)!c<QW&#-zUcc8^w7}ym@j7qU+=me?
zdJStVkKas9Vs{EN6ei^Y)9dTEp?^#wCTue%q98~k5QA8GCqAvlf!F%5Pe`x2;KuA0
zL}WH#X2GMpRjGGq@0G>pV=cGV7UkZ8@kdbv-a4bX8Cu6sK|ap}d-HsWMvPG*$R}5t
zL_EQf+7hp)C;WIqxbQJ+WEb*z-tuII>I(&IgQ))46n3gRF<F#)l3ym-dVUK)mO0@7
z%UtYPj1sRm0uyUwr-$QU+QT01cl|4<=>+acPc%ahV+tH-B)_HZ5^X4--h-e}i$fs1
z3fl@t7dmx?hYnxfWcWw$!~-MYHhJXX?yYX}<wwfMN1|e?!E7a3p<|FCjL{!Y-1Esd
z%8`#Gwn}Nt$8C}&k92U*1i=)|U$6pxM?TjFvzTf4tjEj;S)LcU9{l#G)waCIcf{2Y
zY*+Hf++N&l@KVJwr0+be$FH=>gYF0nv!Ty(T}GMoXn&=9`Jza<;L$-!g8cZ=iOMY5
zanS%}u$;3fB6$Y&=K05MPB*#Kkrep!8iFTmn9w4MnnL}T^5sRbJ$j8PZ{<D)-*cR_
z7mr=9YMkr1jP4UOf&|{@1QN|A-2j6FHo#=bhD9m5KhMaN#c|iYPjOqX&^)t~JyYUa
zcv1)~ahnz#Bd^okVPG8#=8G@7e?)@88z?>9G>&@ilTR(SBn`}htaS9jX9dLSkAvv%
z5AH@S377nFaVOmmmt^Q;LmWLhYBKLePZW#$mj_}sQY->NPz*TA(Zfd1MXXEo(A{7P
zFMH0z*r>o*4-DA|irZ1%2WuGJ`Vstsm~DM~A)?mcUBZhvUc#;(j+4S|#lSBWJ@A~1
z3GF0i06lOq2!x-AjgluGOIK=S=#uPqG-7D68Nm0n!S?C1vS>+kSJ-+tE-uAn36Xo8
z=l-X8i9_Tbr#XL+>wb~1E{QhxI7WJmdymA{mcahM!CaIc{Kn3S5c%_xsE9H~sA5RX
zrI|^WJ+{l(rG1CxpXTbPxcURO)vt&PCi4i_J;HT6xNeVX>fRmoI-AA)BG=x9+37`w
zQ00cDv4$QuQ$}A^{&*)t4?A^B{ZxL=r1F3X<&Q_oVUGtX4RXTc8IH4Hon~D!ya4T-
zkfe<Li41{wIDAAq#-z3mAHZEN-kmwT&u+B{?4}DlCIF7`U??2vJB9N0P8@*ItLC&B
zB{1t^?GJT(r^Z-5rL!B~sJ9zs%O`@`ivArz9otLVlp@VfnA$X5qGjAB^PfocQw}eX
zw>&X#sB*Xuj33J~^$Cxs5OE5Y8_$tO4`&vdku!Nb;UOklXhB3MY98jAuH#DxPIo`&
zQcVRECmxQHNl#|_DQ{hrQ=VKExQTRy6VHYxbEiFn7Aok7jhC?j5R4s}<!PJQ7(#lC
zS*$_WON<<8UHU(|@oynVmWTJO1F!&a(lmw>+d0_5$1_yW3AG5HP&Pq6Q?}C)eV&_4
zWYo4^RJOJ4=eXuH$_C*_heFEsKd9ko9*En2FeR&<L>tyP2%eZm@F!X}&W|U$z*;c-
zG&XqgtSw@FJ+IM<J+;(d82a+yvdBc`&^x4)LpuuXcEKB;c1vr!(SrAm8+ue(QS*un
zEl-`Syt%}-3bPOfZMvo%I3Jv>ZLn38Q9z&PvXjQ})QR6SN8P16kz@94<}zpr%-^Bj
zi}0CDE|hCn8<(Js@^mFneq6p{fO5!B>nm|R@pZ5cdae>l#2G2!;OU5Vg(Wb#Qt<%Z
zv5c?D6AHvMh&;SL)j|YSRbU-`NWLiV3sNdqHF9h-$gWQ%N35`|!lsC^jJS;F{$mFk
zRVC*>73EMWXX2geXR#D%fQ$FjmLv@x=3)jbx(@Q*$N5PdinXUx3|DpIwTP}g*T<Sg
zWXKqt7h$~|Ysw>SSzldb#cHllI6?=|fI8Sa&ua8j3lw3s8b$dOqYhhldb?Q~mIpbM
zgQ<WNw87^cG9E}Rtc$o64rZfT($K`<B<+O!#RumNK0XsUj}1t$z<g5vt3Q18?KuBi
zlX^SO<hmS?PcMHXf^P>vNxLwH+wq(>m%$gx8BeGCDPPTzPd|M?*UeAPS@Dpc^5u5v
zUNI)B3R=6@Wv#%Ae$>O%TNz8K*CQU4MJp4PJ7np~1YO2Vxnbp0rMon&dOt$Z)`ksl
zkU)R!$)r`v6RSG-DF-&o*3YD;zCo&hKj(pG+RwAd`@8x%+rS7YR8<Z<NZcK`N6vT#
zSledGrOzyGp&W>#x^2-i_SqgO;g`r->pNnap*tQE@#Ard6!8#h&hp>(^4@3Dx|~2M
z&k**qk~TJT2{#=6wY{i>mJbvN(LOxS(e*p!{%12C?=XvZvt@C775)>k>6rz#4OFMK
zBSiTB*-XnXYMUjVPly`T5~EvKSK;)|y0WE|+HhIXcl?EnEe|qx^Qdme9GbUWDX60$
zHk(w}UOR@Pt-4OPsuvpAM|@EvpIbdf=_2b^-;}0&(Zm!m)8Qyn>!L64QZg(|ul9py
zw+Ll_y?o^VmXCS>Ftn(N0(*4lf<uS)Pk^l)uQ(iCwO@{$5pz)mygaY++AoD?F|#8`
zt9h*!lmqLC?fr}7+~>yO(=D%7bf<0G{Z`rV+?aOC{^%>(H_98IU#v*!em*Q>oy$@|
zywU8D%Sz-{!#2p+itzZ=<%-jL1`oc_ns$eQ6hbY2z8Wodkqaw2DZSBZ&qU>OicXc!
z2hdbaD*t?#%Wfq#4%TM1&#f|GP3M8BC!xZ6@+6;+Hnl6XR*0z3@fg!soQs_M;8r_O
zkn%Yly=~ovOBPU5Moq40seN%Jg%5S&9P;ipMTX?VJOG}T$JQhnQof)}Tu<40ZHKl>
zHLgdXdmkfKtB*_T+FrV>GxF}WiNQ+shu$OCTCQ9pUtSxPs8nwzBRKa0g>%(!;Dat^
zbpN|l_Ukl;TOjS5!X~yR$*LunuV>gbfb9X;7f3UW;|zfv9jS_BS}NR*y?O0DDZ;%2
z@2akayCwDniCTRf(;qD-ypZ1IRlsk-kE7vWHF68u6CGKYU|Lr0=k~J+J9wqs_Cg=W
zJ+`8vmfj6cT7*y>4#$rP-{~@!Q2(Y0E5pyQZ7HH{P>uFvFAl{ggvWi~j#l|v{dKl2
z2xO`CHH<x=u?_UH=(wU0!_n>m26~c#x_gn7&-QXYtqGFy8AWnhGdGZOG7n*%8mxsS
zs7WUC`3!FkqDmih9EMJ}&gQufv5}L&dK{jv1*A_w#tV@#nuZXH31Ory-07sD&mQOe
zFS5=07(eARhwQpOYLN2Ty*9JiioS~E+7G<s%7Mi)8{dg6XJObS8Mkpx`Annz8gj6P
zUs}ns^-<%L&-(F~4QP*@O0V<k`WexSmK&etYb`Y#{>vuFe<Z)cmQjTLV~fj(M6Y74
z3KO3}Ht<;+se3UwD3&OG{UO=Lrzd2u7rXl@pMEFjyqJshMY-`s%n_eHE|0vJfpn=f
zsuLY!;7@3sY)7j~qd#do#Oq}Sz%47-#@nv06a7fOqz00|?b;@tBa(dE-yxB>_q7)8
zwVGjnWLWwn3{9FXZ3)`)CS)OT{As+Yo0=nkR=adiJ`JS#2GcFz{<8Od+*a^Xg5Kwn
zy*KpL^{kcmZ%B+$_Wd{LI2XT)XrP|vPIZHa&${=$B;Vcu@%Al|?hR3Wlzqk2srw$*
zY@^T{6cdKFA!SO6<QaM2T(y&@Zah)iEqEt>-&9%f5=>y<2s!JeMCBd1^ra4tqb_TS
z;CVC^Hv(IVWu)+n$=JHU<`#3*iDI*T2_&2cF%m3t*#wJKsF9+T9ce^7=s$!D5-6u{
zQbpk9=Y}basn^25hH;eJdlr)Y>6PqH7~UW%b?l}6<8$8Pb13f3z~7<tytni`N;A0h
z07@@-OD~|bBbR=J(u>~Giztoa(w!*1<So5~QX>W8d*9kM)ebj$=^TO|C9J0^U)z|{
zLfQKSqb!%lHb#t7_AW-}DH<v|y6)0ZuANKHT+=!_pVrRtt|FsJw5R^q%k$>h`Q!%o
zE>IWY9HXuQ^DOS5c4h1laG4R^mAyq=c00q(1zb<S%`K>aZ?9_@ffdCcQ6V(;_hy^o
z882I|-W1<f*&9zoU~eZbOO$&zb#N$qTVSx-dFUj$1g%qOxa~En2E=vvj|BeYoK+MF
zI`sJDH(z-La^F#}esWkX^mwfH`8*+i@;T*j^Aw}Pj_Hcp`h@PqDW4pnSP_F(`Q#f!
zv-q@v-EOgH0EbAFPu`~e<WK%fTE#uKr^qiRb)&OnwNS@1;3x0OikD-uEi{f2ZliG&
z@fDAwRQfU&wjk2TC-m5%Eq3@K6o>s^y+yTO&5(b*oU9bc*jJL38FJt&cLa{1@-G|Y
zd#`jd#Ghh<Hd*(|NJH$WoC%e~Uwt%?Kcr>aCy%_Enr86&fbXHUf%x&v(drU9lh&Ui
z{sEM+OKvTt<+ZS(vj9(9qyft(R?yTt3;cF%glRS2Tl+1QV*89YI$CLG^`+unl%@lg
zeQB%yvh1~<5hcjyV7XSoF-rl=DS%`+c1Rw5ExA=uBju30q|q4_eiro0(duJODYg7r
z<~dUxi+OV{3x4T+VDUvhGq2gg>wQ!*y%(o;lE&k4Nem(3Pu{ZEeOQ%TPWx~yc}TPu
z;swGo^F$W@skdwum*M(}1EhBQQ2e~rkNJr1XQEphA%ahPA@1=(Y+(qRzqr}p<6eka
zK8U*+g5rA(qS^~FE-+9H9M1E^EIEI3Shk-!+;a(f`X1>;q%)9SKzcvY^GI(&dJgFV
zr1eOjLHZ}sMRMona7TOO4kA~N^eYoKtd(SKs|wR`f;Tp*!})g`tWWg3K5<~+2=jc^
zWbwCS)?&-y%Q$=9B$k7D*|z6(>=#kIm*QCg-*X7ixYb&O{R_`33@c%N)Md1zUXI+-
z&aqB=Mx6xgTYwE=$^`d{uMQt0^Spw(U|*f|)s>^}dDOM@)jj8{D?{Bf)R}yB8+~<4
zP`A*5%5Y!h5?|#~RNjG=Z$8$$epv5<o%l#s5)%EO(+Jw2hPb1Exs#u2@N^qL;qz*q
zIs9}MPdCvM+(4aYI@)PrL(oBOp<hRGO|<IB7IbS>*~2y(+=ATBo;E)HJq6TmT$ZP1
zS@d>Gk#J$rDne~VW-B*y5+j5ue0YX>!1yCUfB379!b(uUwOmUWHH`BCy<nI9;SuUP
z^LPg%J;O*}_>i7}KmHR)xB|pTSlbelAHK&(98?-h7^l*Q^CWP-1x|a$!R`hwJ<)N5
zhPj?GbGS8%`IHY=GiD32lE;BsC5vBA#Cl}q>)r8bvc0cI1kNJhu#e;~ug7)h$<MTr
zYVq#ydv8+nsN^lTFjZRKn5XoU6>r?81jvwWy$o^Hgx2CFY2P*|kPn+$SmkruvXz_U
zp>5qAi`j`4dme5acX4A0K9n}wE1|a4zH)5);A@_>yd>_0&m<P}IRLw!xN%%Zhik=x
z)+$;lhl++nzWgwzOiqv})2FmH$j7#)2C^;<TjZPDvjbZ)rE+<G`{P)+FWS)|*l63x
z_ufPtJJ?X8+_@v7Z7WcjjvsBh;)1n2wIfbBAp<IH%KNgQa#Zj(SJ8YOzH{bvz(McG
zmn+j-1vcgbish-w-mzUG;Di6*jS1Y+#a`t5)J3rm5z&x8rS;7l@SerGH#@hF`Lz+#
z|6Jo!09t)BtySyBe2~A4ek(V94kK65-XNsBo;oL{n9H_#%LZ}T%Ut&I)<@oYNWtl&
z;hn|lbD_Xe&+o*8iH=d&@dZ4IE~0q$K`!?>)qsVv>YX%PD*EM}7-foVxwB7)*%Xsv
zEYRSh^ULkjgn>>($kFm<f!-$P>>M2ax|e1upeHr9<o6ONhRNeQ+biv4{mu?;FQemk
zTz1}-r!yRs^LNF^wZR27+FhfIHGGr`LPlE=9a?%k-;I;bUCDu;!Nx_We0g+NqGN%!
zREI-7=3S<XPG%A)>Km{6!K%^kawu(a{oefy5lTB?z{l6{C{T!2uz0Y8g9UspuNQpI
zX_x@PXfxqP1R=kXDo6$Xvt>zDs<J?CtctOHqM9Bh!E&rdCm+vZJE1Q_;Uk~8+-7tR
zCmBvog=F5N4kuf(e-6o$`kFMnn~>7t*UMSuswFJY#J>b;J6Dc;w@>OBn;EAnmXZJ>
zNlod0#=uYE(}YLCYy?gc7GdVORql8<J@r{l1mz=Q<J%*+IoMRubnI)Unxo0m_+FT@
zL3VsEQF&Spd9P>YY{qyBtr#I-H~cvI(9fgt6N?%JLb+xOyzoppB)5S=`||(B%KG=>
zB3?uD2s;!TRsdbaGCS?3Lhcl}miHrdDXZkL_p`f9!bQ_6c3yNMLa(RXgcRSe<>O@R
z(m06&ZpH6=x#j(y<NZK(I^d$2$Cp*QhgvGaIQJ#$x*^vF9H!XJMMlz*AFcl38X##0
zw1l&l#YW*5wFU=}n?p9@C~+g$QmXEgdAqwuVfk?t2;8#q9Fpa`)4NZqNu-T&{H?&3
z2l;Frdl~=LG>tIcf{kB2?fW$LkY9gUw>z_~_Y#!{>psBa+q3_TaRe7yx0xs+0Dolq
zsfZNvsoqtmokO4&%LlamJ}EBwX0nQi5r0`l&@ipOA*?15=fhsEKq(8HIf>FQ$;j~v
zyXG+Fh1U@BAWEhI5ZJKw@P8Nj1ycZ5jvk_`;ZT<HvYh+Thr#4~7c?og%7Gte2PdL*
zZIjZdtz{p#RmR8JLM;L-VY+Zd_asKE6LIFH6Zy8D7GWEMDZ7-vS}6J}c=ubuswoOC
zZII`DU;{z%cSA}&7y4h1+Uo(0n}AxawC*kMwLaYQof_$(cYyuF+L2-^SBc<u!B~@4
zqpU?(A}x?nme4MteLMwQB%U<w%T?akI(pwhMcKEt^Jgt|fqO}P3Gd3@pIdYZ_@c+>
z{nC|6EK*7^jKBvxqr&%gD}S|Ro3T8rpz?TpXK}ZZPZm;na_f=L6`k^<Jo-hy_&rp#
z<6RZ&RPGSEp@1-oLh`B#)Ht{HJ@B}Kllr}1-h}Us?)@@a+P`Y0^pTUkN>}E|rC+5C
z1F!VmNEi~{rve@tYk|##Sds@$A%!RB1Y9X{v!_FMUWihk#aEB9gU(FHi%oeEP*}c*
zm%n_~A)*+XLj4uB>pU*m?O-<p>_|nw2g*eUvs-)$iQfXtqvXd2lR_gukLZH6cdS=v
ze8D%Wi)?eKzu!8~Ss8gK)`)vDbsiU#Pu92#H0B<<0f!&^52ZP7=dXn&;V9)8qSR7_
z_DAsAhceJ+thK1QV8`g*gRz2-gu*tS;)A6mJRxqyD;o54P<t~0o#_e9FxkLWN0b_H
zGa(3zQ77zb9loO2S9HLU40#BuEzdKS2v<q1kv{eXM2&>4q(q@Yk;H_GJ^1QaiCp#d
zgSa?rI-K2NK8;<_oi8UG9v|-n&8|3Ld%4`~{@rG&jUitG+B?w3Z;;|HdEjtnhcc+2
zxIBb&s$_hREz(n+hp*)=Z&4fQa-u1{nxu0`%Qs;|Q@y_EB|vXNE3cqK@5OT#REwAz
z(h>G%oJXdGh1yCiimS{*C&5XcPZ1mk;~p#p$5tWQydulKNeF{1^kvng@(!A)xZ6}#
zCO`aUtkPb_9*M$bu}{D2sJm1qryoh^g@rc^<l+w|=EBQav1cMo3+98Pn0iP~cWBGX
zbnpZN!H>a|D&IVko=o%lbgU+Kz;r?5Z0CsS+%TPON1-kgvgAZfm+ikzPp0P#+%N?!
zFse0-OHY_my)D)?)L}g9r1`rD@b}2K>8U?~LJZSu!Lr?qd>URXR9r>age<XTXq;cV
zP9FW%G|VeTMiYWBsLzWzUh<_%jK(;=22J}M%TYJWSLcU1ohj8@_o&P}I!^gUK65k`
ztn5CTsSK1CkM_ZH&UYOWLp2disr!XdxOZtZXiJZua7uCM2l?AKU1NhrxSS*{I5xPp
znsHy*77V+_aRzAyJ&>$?B>(s>Zd!JKb8T$7g)J!-=%c+ltn=idPwFl`-rsD|fkDM)
zvFL!iP-FAbL*8=373Fw)x#>Y&P?)^`ScG2>jJ>iibL9SGopljs%8w7zMeLQskH?In
zXj0pB4yAC<<9VL8zeL1llyC9vHR;F)wqC*>3yUN`;qn<7F?>;z!w5hrTSm*B$0Oo`
zw+w+9hr+c7xQswf3T)7(5X7F!mfrG@;~5dNy=~JDavtBwV%pDrv(@^&F}UsAnZ@Qi
z=H5PY+6}X&O`kJUzIG-|&N@@Db@!R~m1(88yM=#m%+=DZKWph5*gv9wZ{%sIue`JH
z7Y2VRgjW8}d2j0Wrl+)Yr{0@CvekVy+|RL6%YNVE|1Wjv{vE#KS`DA-rV&2rmHVII
zPxk)ba3{@IWpJYBlve{M9=s}m$93ZJ@_%B))$(#USM}DS^ON*1IQ9PW?S?32kv!B8
zr{v4}hV<ZSq5Z=yBK=bgGRu>WCCVE8Xg&SUD3-k&+CA_g<q%Z{;{U6_>ALqAt?~cx
zfckoG`5rB;+UoJN)hU)0_!FmOY){uI;fiiw(TV~;WtU=IVbCl6ltU{D^h$d0B0@n3
z=uJibibYiHWz5f;Duxw%^h(!|eMJl{zV)W2(JKu8N_q>YR@~rRVf9xsgS}agHx>33
Ri~N-bbz2UtFa#(o{~zA!vo-(#

-- 
2.18.2



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

* [PULL 16/16] tests/qtest/cdrom: Add more s390x-related boot tests
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (14 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 15/16] pc-bios/s390: Update the s390-ccw bios binaries Thomas Huth
@ 2020-10-06 18:31 ` Thomas Huth
  2020-10-07  5:59 ` [PULL 00/16] s390-ccw bios update Christian Borntraeger
  2020-10-08 10:32 ` Peter Maydell
  17 siblings, 0 replies; 19+ messages in thread
From: Thomas Huth @ 2020-10-06 18:31 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell
  Cc: Christian Borntraeger, qemu-s390x, Cornelia Huck, Marc Hartmayer,
	Janosch Frank

Let's add two new tests:

1) Booting with "bootindex" is the architected default behavior on the
s390x target, so we should have at least one test that is using the
"bootindex" property.

2) The s390-ccw bios used to fail when other unbootable devices have
been specified before the bootable device (without "bootindex"). Now
that the s390-ccw bios is a little bit smarter here, we should test
this scenario, too, to avoid regressions.

Message-Id: <20200806105349.632-10-thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 tests/qtest/cdrom-test.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c
index e9afab693c..eef242dc80 100644
--- a/tests/qtest/cdrom-test.c
+++ b/tests/qtest/cdrom-test.c
@@ -163,6 +163,18 @@ static void add_s390x_tests(void)
     qtest_add_data_func("cdrom/boot/virtio-scsi",
                         "-device virtio-scsi -device scsi-cd,drive=cdr "
                         "-blockdev file,node-name=cdr,filename=", test_cdboot);
+    qtest_add_data_func("cdrom/boot/with-bootindex",
+                        "-device virtio-serial -device virtio-scsi "
+                        "-device virtio-blk,drive=d1 "
+                        "-drive driver=null-co,read-zeroes=on,if=none,id=d1 "
+                        "-device virtio-blk,drive=d2,bootindex=1 "
+                        "-drive if=none,id=d2,media=cdrom,file=", test_cdboot);
+    qtest_add_data_func("cdrom/boot/without-bootindex",
+                        "-device virtio-scsi -device virtio-serial "
+                        "-device x-terminal3270 -device virtio-blk,drive=d1 "
+                        "-drive driver=null-co,read-zeroes=on,if=none,id=d1 "
+                        "-device virtio-blk,drive=d2 "
+                        "-drive if=none,id=d2,media=cdrom,file=", test_cdboot);
 }
 
 int main(int argc, char **argv)
-- 
2.18.2



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

* Re: [PULL 00/16] s390-ccw bios update
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (15 preceding siblings ...)
  2020-10-06 18:31 ` [PULL 16/16] tests/qtest/cdrom: Add more s390x-related boot tests Thomas Huth
@ 2020-10-07  5:59 ` Christian Borntraeger
  2020-10-08 10:32 ` Peter Maydell
  17 siblings, 0 replies; 19+ messages in thread
From: Christian Borntraeger @ 2020-10-07  5:59 UTC (permalink / raw)
  To: Thomas Huth, qemu-devel, Peter Maydell
  Cc: qemu-s390x, Cornelia Huck, Marc Hartmayer, Janosch Frank,
	Christian Ehrhardt



On 06.10.20 20:31, Thomas Huth wrote:
>  Hi Peter,
> 
> the following changes since commit d7c5b788295426c1ef48a9ffc3432c51220f69ba:
> 
>   Merge remote-tracking branch 'remotes/stefanha-gitlab/tags/block-pull-request' into staging (2020-10-06 12:15:59 +0100)
> 
> are available in the Git repository at:
> 
>   https://gitlab.com/huth/qemu.git tags/pull-request-2020-10-06
> 
> for you to fetch changes up to eb32abd8d931994d10327bd965a4fb12d765a0fb:
> 
>   tests/qtest/cdrom: Add more s390x-related boot tests (2020-10-06 20:14:48 +0200)
> 
> ----------------------------------------------------------------
> * Don't stop at the first unbootable device, continue scanning

This also fixes 
https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1806823
for me.

> * Fix corner cases in booting from ECKD
> * s390x-ccw bios cleanup part 2​
> ----------------------------------------------------------------
> 
> Janosch Frank (4):
>       pc-bios: s390x: Fix bootmap.c zipl component entry data handling
>       pc-bios: s390x: Save PSW rework
>       pc-bios: s390x: Use reset PSW if avaliable
>       pc-bios: s390x: Go into disabled wait when encountering a PGM exception
> 
> Marc Hartmayer (2):
>       pc-bios/s390-ccw: fix off-by-one error
>       pc-bios/s390-ccw: break loop if a null block number is reached
> 
> Thomas Huth (10):
>       pc-bios/s390-ccw/Makefile: Compile with -std=gnu99, -fwrapv and -fno-common
>       pc-bios/s390-ccw: Move ipl-related code from main() into a separate function
>       pc-bios/s390-ccw: Introduce ENODEV define and remove guards of others
>       pc-bios/s390-ccw: Move the inner logic of find_subch() to a separate function
>       pc-bios/s390-ccw: Do not bail out early if not finding a SCSI disk
>       pc-bios/s390-ccw: Scan through all devices if no boot device specified
>       pc-bios/s390-ccw: Allow booting in case the first virtio-blk disk is bad
>       pc-bios/s390-ccw/main: Remove superfluous call to enable_subchannel()
>       pc-bios/s390: Update the s390-ccw bios binaries
>       tests/qtest/cdrom: Add more s390x-related boot tests
> 
>  pc-bios/s390-ccw.img             | Bin 42608 -> 42608 bytes
>  pc-bios/s390-ccw/Makefile        |   7 +-
>  pc-bios/s390-ccw/bootmap.c       |  47 +++++++----
>  pc-bios/s390-ccw/bootmap.h       |   7 +-
>  pc-bios/s390-ccw/jump2ipl.c      |  45 +++++-----
>  pc-bios/s390-ccw/main.c          | 172 ++++++++++++++++++++++++---------------
>  pc-bios/s390-ccw/s390-ccw.h      |   9 +-
>  pc-bios/s390-ccw/start.S         |   5 +-
>  pc-bios/s390-ccw/virtio-blkdev.c |   7 +-
>  pc-bios/s390-ccw/virtio-scsi.c   |  28 +++++--
>  pc-bios/s390-ccw/virtio-scsi.h   |   2 +-
>  pc-bios/s390-netboot.img         | Bin 67232 -> 67232 bytes
>  tests/qtest/cdrom-test.c         |  12 +++
>  13 files changed, 218 insertions(+), 123 deletions(-)
> 


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

* Re: [PULL 00/16] s390-ccw bios update
  2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
                   ` (16 preceding siblings ...)
  2020-10-07  5:59 ` [PULL 00/16] s390-ccw bios update Christian Borntraeger
@ 2020-10-08 10:32 ` Peter Maydell
  17 siblings, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2020-10-08 10:32 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Janosch Frank, Cornelia Huck, QEMU Developers,
	Christian Borntraeger, qemu-s390x, Marc Hartmayer

On Tue, 6 Oct 2020 at 19:31, Thomas Huth <thuth@redhat.com> wrote:
>
>  Hi Peter,
>
> the following changes since commit d7c5b788295426c1ef48a9ffc3432c51220f69ba:
>
>   Merge remote-tracking branch 'remotes/stefanha-gitlab/tags/block-pull-request' into staging (2020-10-06 12:15:59 +0100)
>
> are available in the Git repository at:
>
>   https://gitlab.com/huth/qemu.git tags/pull-request-2020-10-06
>
> for you to fetch changes up to eb32abd8d931994d10327bd965a4fb12d765a0fb:
>
>   tests/qtest/cdrom: Add more s390x-related boot tests (2020-10-06 20:14:48 +0200)
>
> ----------------------------------------------------------------
> * Don't stop at the first unbootable device, continue scanning
> * Fix corner cases in booting from ECKD
> * s390x-ccw bios cleanup part 2
> ----------------------------------------------------------------


Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/5.2
for any user-visible changes.

-- PMM


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

end of thread, other threads:[~2020-10-08 10:33 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-06 18:31 [PULL 00/16] s390-ccw bios update Thomas Huth
2020-10-06 18:31 ` [PULL 01/16] pc-bios/s390-ccw/Makefile: Compile with -std=gnu99, -fwrapv and -fno-common Thomas Huth
2020-10-06 18:31 ` [PULL 02/16] pc-bios/s390-ccw: Move ipl-related code from main() into a separate function Thomas Huth
2020-10-06 18:31 ` [PULL 03/16] pc-bios/s390-ccw: Introduce ENODEV define and remove guards of others Thomas Huth
2020-10-06 18:31 ` [PULL 04/16] pc-bios/s390-ccw: Move the inner logic of find_subch() to a separate function Thomas Huth
2020-10-06 18:31 ` [PULL 05/16] pc-bios/s390-ccw: Do not bail out early if not finding a SCSI disk Thomas Huth
2020-10-06 18:31 ` [PULL 06/16] pc-bios/s390-ccw: Scan through all devices if no boot device specified Thomas Huth
2020-10-06 18:31 ` [PULL 07/16] pc-bios/s390-ccw: Allow booting in case the first virtio-blk disk is bad Thomas Huth
2020-10-06 18:31 ` [PULL 08/16] pc-bios/s390-ccw/main: Remove superfluous call to enable_subchannel() Thomas Huth
2020-10-06 18:31 ` [PULL 09/16] pc-bios/s390-ccw: fix off-by-one error Thomas Huth
2020-10-06 18:31 ` [PULL 10/16] pc-bios/s390-ccw: break loop if a null block number is reached Thomas Huth
2020-10-06 18:31 ` [PULL 11/16] pc-bios: s390x: Fix bootmap.c zipl component entry data handling Thomas Huth
2020-10-06 18:31 ` [PULL 12/16] pc-bios: s390x: Save PSW rework Thomas Huth
2020-10-06 18:31 ` [PULL 13/16] pc-bios: s390x: Use reset PSW if avaliable Thomas Huth
2020-10-06 18:31 ` [PULL 14/16] pc-bios: s390x: Go into disabled wait when encountering a PGM exception Thomas Huth
2020-10-06 18:31 ` [PULL 15/16] pc-bios/s390: Update the s390-ccw bios binaries Thomas Huth
2020-10-06 18:31 ` [PULL 16/16] tests/qtest/cdrom: Add more s390x-related boot tests Thomas Huth
2020-10-07  5:59 ` [PULL 00/16] s390-ccw bios update Christian Borntraeger
2020-10-08 10:32 ` 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.