@@ -269,8 +269,7 @@ static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
return 0;
}
- zipl_parms.menu_start++; /* make compiler happy -- does nothing vital */
- return 0; /* implemented next patch */
+ return menu_get_zipl_boot_index(s2_cur_blk, zipl_parms);
}
static void run_eckd_boot_script(block_number_t mbr_block_nr,
@@ -10,10 +10,52 @@
*/
#include "menu.h"
+#include "s390-ccw.h"
static uint8_t flags;
static uint64_t timeout;
+static void zipl_println(const char *data, size_t len)
+{
+ char buf[len + 1];
+
+ ebcdic_to_ascii(data, buf, len);
+ buf[len] = '\n';
+ buf[len + 1] = '\0';
+
+ sclp_print(buf);
+}
+
+int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms)
+{
+ const char *data = stage2 + zipl_parms.menu_start;
+ size_t len;
+ int ct;
+
+ if (flags & BOOT_MENU_FLAG_ZIPL_OPTS) {
+ if (zipl_parms.flag) {
+ timeout = zipl_parms.timeout;
+ } else {
+ return 0; /* Boot default */
+ }
+ }
+
+ /* Print and count all menu items, including the banner */
+ for (ct = 0; *data; ct++) {
+ len = strlen(data);
+ zipl_println(data, len);
+ data += len + 1;
+
+ if (ct < 2) {
+ sclp_print("\n");
+ }
+ }
+
+ sclp_print("\n");
+
+ return 0; /* return user input next patch */
+}
+
void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout)
{
flags = boot_menu_flag;
@@ -27,6 +27,7 @@ typedef struct ZiplParms {
uint64_t menu_start;
} ZiplParms;
+int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms);
void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
bool menu_check_flags(uint8_t check_flags);
Prints the menu data starting from the zIPL menu banner. Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com> --- pc-bios/s390-ccw/bootmap.c | 3 +-- pc-bios/s390-ccw/menu.c | 42 ++++++++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/menu.h | 1 + 3 files changed, 44 insertions(+), 2 deletions(-)