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: Collin L. Walling <walling@linux.vnet.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Collin L. Walling 2018-02-23 10:43:13 -05:00 committed by Thomas Huth
parent 26b2a2a491
commit 9eaa654ab3
4 changed files with 50 additions and 1 deletions

View File

@ -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

View File

@ -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
pc-bios/s390-ccw/menu.c Normal file
View File

@ -0,0 +1,22 @@
/*
* 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;
}

View File

@ -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";