summaryrefslogtreecommitdiffstats
path: root/pc-bios/s390-ccw/menu.c
diff options
context:
space:
mode:
authorCollin L. Walling2018-02-23 16:43:15 +0100
committerThomas Huth2018-02-26 07:56:55 +0100
commitf7178910845a73fcb69642476c3222af842e25e9 (patch)
tree6b14598ee7ea8ff0f68966f1c9873d6b860a2df9 /pc-bios/s390-ccw/menu.c
parents390-ccw: read stage2 boot loader data to find menu (diff)
downloadqemu-f7178910845a73fcb69642476c3222af842e25e9.tar.gz
qemu-f7178910845a73fcb69642476c3222af842e25e9.tar.xz
qemu-f7178910845a73fcb69642476c3222af842e25e9.zip
s390-ccw: print zipl boot menu
When the boot menu options are present and the guest's disk has been configured by the zipl tool, then the user will be presented with an interactive boot menu with labeled entries. An example of what the menu might look like: zIPL v1.37.1-build-20170714 interactive boot menu. 0. default (linux-4.13.0) 1. linux-4.13.0 2. performance 3. kvm Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
Diffstat (limited to 'pc-bios/s390-ccw/menu.c')
-rw-r--r--pc-bios/s390-ccw/menu.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index c1d242fed1..730d44e36b 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -15,11 +15,42 @@
static uint8_t flag;
static uint64_t timeout;
-int menu_get_zipl_boot_index(const char *menu_data)
+static int get_boot_index(int entries)
{
return 0; /* implemented next patch */
}
+static void zipl_println(const char *data, size_t len)
+{
+ char buf[len + 2];
+
+ ebcdic_to_ascii(data, buf, len);
+ buf[len] = '\n';
+ buf[len + 1] = '\0';
+
+ sclp_print(buf);
+}
+
+int menu_get_zipl_boot_index(const char *menu_data)
+{
+ size_t len;
+ int entries;
+
+ /* Print and count all menu items, including the banner */
+ for (entries = 0; *menu_data; entries++) {
+ len = strlen(menu_data);
+ zipl_println(menu_data, len);
+ menu_data += len + 1;
+
+ if (entries < 2) {
+ sclp_print("\n");
+ }
+ }
+
+ sclp_print("\n");
+ return get_boot_index(entries - 1); /* subtract 1 to exclude banner */
+}
+
void menu_set_parms(uint8_t boot_menu_flag, uint32_t boot_menu_timeout)
{
flag = boot_menu_flag;