qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Cornelia Huck <cohuck@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>,
	Alexander Graf <agraf@suse.de>,
	Richard Henderson <rth@twiddle.net>,
	David Hildenbrand <david@redhat.com>,
	Thomas Huth <thuth@redhat.com>,
	qemu-s390x@nongnu.org, qemu-devel@nongnu.org,
	Collin Walling <walling@linux.ibm.com>
Subject: [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd)
Date: Fri,  4 May 2018 09:25:08 +0200	[thread overview]
Message-ID: <20180504072514.8450-10-cohuck@redhat.com> (raw)
In-Reply-To: <20180504072514.8450-1-cohuck@redhat.com>

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

  parent reply	other threads:[~2018-05-04  7:25 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 ` Cornelia Huck [this message]
2018-05-15  8:46   ` [Qemu-devel] [PULL 09/15] pc-bios/s390-ccw: fix non-sequential boot entries (eckd) 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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180504072514.8450-10-cohuck@redhat.com \
    --to=cohuck@redhat.com \
    --cc=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=david@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=thuth@redhat.com \
    --cc=walling@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).