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:
parent
26b2a2a491
commit
9eaa654ab3
@ -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
|
||||
|
@ -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
22
pc-bios/s390-ccw/menu.c
Normal 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;
|
||||
}
|
@ -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";
|
||||
|
Loading…
Reference in New Issue
Block a user