Commit 9eaa654a authored by Collin L. Walling's avatar Collin L. Walling Committed by Thomas Huth
Browse files

s390-ccw: set up interactive boot menu parameters



Reads boot menu flag and timeout values from the iplb and
sets the respective fields for the menu.

Signed-off-by: default avatarCollin L. Walling <walling@linux.vnet.ibm.com>
Reviewed-by: default avatarThomas Huth <thuth@redhat.com>
Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
parent 26b2a2a4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ $(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
OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o menu.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
+24 −0
Original line number Diff line number Diff line
@@ -18,6 +18,9 @@ IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
static char loadparm[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
QemuIplParameters qipl;

#define LOADPARM_PROMPT "PROMPT  "
#define LOADPARM_EMPTY  "........"

/*
 * Priniciples of Operations (SA22-7832-09) chapter 17 requires that
 * a subsystem-identification is at 184-187 and bytes 188-191 are zero
@@ -74,6 +77,26 @@ static bool find_dev(Schib *schib, int dev_no)
    return false;
}

static void menu_setup(void)
{
    if (memcmp(loadparm, 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) {
        return;
    }

    switch (iplb.pbt) {
    case S390_IPL_TYPE_CCW:
        menu_set_parms(qipl.qipl_flags & QIPL_FLAG_BM_OPTS_CMD,
                       qipl.boot_menu_timeout);
        return;
    }
}

static void virtio_setup(void)
{
    Schib schib;
@@ -117,6 +140,7 @@ static void virtio_setup(void)
        default:
            panic("List-directed IPL not supported yet!\n");
        }
        menu_setup();
    } else {
        for (ssid = 0; ssid < 0x3; ssid++) {
            blk_schid.ssid = ssid;
+22 −0
Original line number Diff line number Diff line
/*
 * QEMU S390 Interactive Boot Menu
 *
 * Copyright 2018 IBM Corp.
 * Author: Collin L. Walling <walling@linux.vnet.ibm.com>
 *
 * 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"

static uint8_t flag;
static uint64_t timeout;

void menu_set_parms(uint8_t boot_menu_flag, uint32_t boot_menu_timeout)
{
    flag = boot_menu_flag;
    timeout = boot_menu_timeout;
}
+3 −0
Original line number Diff line number Diff line
@@ -84,6 +84,9 @@ ulong get_second(void);
/* bootmap.c */
void zipl_load(void);

/* menu.c */
void menu_set_parms(uint8_t boot_menu_flag, uint32_t boot_menu_timeout);

static inline void fill_hex(char *out, unsigned char val)
{
    const char hex[] = "0123456789abcdef";