Message ID | 1516732013-18272-7-git-send-email-walling@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 23.01.2018 19:26, Collin L. Walling wrote: > 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> > --- > pc-bios/s390-ccw/Makefile | 2 +- > pc-bios/s390-ccw/iplb.h | 3 +++ > pc-bios/s390-ccw/main.c | 21 +++++++++++++++++++++ > pc-bios/s390-ccw/menu.c | 26 ++++++++++++++++++++++++++ > pc-bios/s390-ccw/menu.h | 23 +++++++++++++++++++++++ > 5 files changed, 74 insertions(+), 1 deletion(-) > create mode 100644 pc-bios/s390-ccw/menu.c > create mode 100644 pc-bios/s390-ccw/menu.h [...] > diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c > new file mode 100644 > index 0000000..e15a7f2 > --- /dev/null > +++ b/pc-bios/s390-ccw/menu.c > @@ -0,0 +1,26 @@ > +/* > + * QEMU S390 Interactive Boot Menu > + * > + * Copyright 2017 IBM Corp. Happy new year? > + * 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 "menu.h" > + > +static uint8_t flags; > +static uint64_t timeout; > + > +void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout) > +{ > + flags = boot_menu_flag; > + timeout = boot_menu_timeout; > +} > + > +int menu_check_flags(uint8_t check_flags) > +{ > + return flags & check_flags; > +} > diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h > new file mode 100644 > index 0000000..04b1db1 > --- /dev/null > +++ b/pc-bios/s390-ccw/menu.h > @@ -0,0 +1,23 @@ > +/* > + * QEMU S390 Interactive Boot Menu > + * > + * Copyright 2017 IBM Corp. You might want to bump that to 2018, too. > + * 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. > + */ > + > +#ifndef MENU_H > +#define MENU_H > + > +#include "libc.h" > + > +#define BOOT_MENU_FLAG_BOOT_OPTS 0x80 > +#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40 > + > +void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout); > +bool menu_check_flags(uint8_t check_flags); > + > +#endif /* MENU_H */ > Reviewed-by: Thomas Huth <thuth@redhat.com>
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 9f7904f..1712c2d 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -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 diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h index fe909d2..da29e6e 100644 --- a/pc-bios/s390-ccw/iplb.h +++ b/pc-bios/s390-ccw/iplb.h @@ -81,6 +81,9 @@ extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); #define S390_IPL_TYPE_CCW 0x02 #define S390_IPL_TYPE_QEMU_SCSI 0xff +#define LOADPARM_PROMPT "PROMPT " +#define LOADPARM_EMPTY "........" + static inline bool store_iplb(IplParameterBlock *iplb) { register unsigned long addr asm("0") = (unsigned long) iplb; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index a8ef120..709e5ef 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -11,6 +11,7 @@ #include "libc.h" #include "s390-ccw.h" #include "virtio.h" +#include "menu.h" char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); static SubChannelId blk_schid = { .one = 1 }; @@ -73,6 +74,25 @@ 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(BOOT_MENU_FLAG_BOOT_OPTS, 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(iplb.ccw.boot_menu_flags, iplb.ccw.boot_menu_timeout); + return; + } +} + static void virtio_setup(void) { Schib schib; @@ -113,6 +133,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; diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c new file mode 100644 index 0000000..e15a7f2 --- /dev/null +++ b/pc-bios/s390-ccw/menu.c @@ -0,0 +1,26 @@ +/* + * QEMU S390 Interactive Boot Menu + * + * Copyright 2017 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 "menu.h" + +static uint8_t flags; +static uint64_t timeout; + +void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout) +{ + flags = boot_menu_flag; + timeout = boot_menu_timeout; +} + +int menu_check_flags(uint8_t check_flags) +{ + return flags & check_flags; +} diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h new file mode 100644 index 0000000..04b1db1 --- /dev/null +++ b/pc-bios/s390-ccw/menu.h @@ -0,0 +1,23 @@ +/* + * QEMU S390 Interactive Boot Menu + * + * Copyright 2017 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. + */ + +#ifndef MENU_H +#define MENU_H + +#include "libc.h" + +#define BOOT_MENU_FLAG_BOOT_OPTS 0x80 +#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40 + +void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout); +bool menu_check_flags(uint8_t check_flags); + +#endif /* MENU_H */
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> --- pc-bios/s390-ccw/Makefile | 2 +- pc-bios/s390-ccw/iplb.h | 3 +++ pc-bios/s390-ccw/main.c | 21 +++++++++++++++++++++ pc-bios/s390-ccw/menu.c | 26 ++++++++++++++++++++++++++ pc-bios/s390-ccw/menu.h | 23 +++++++++++++++++++++++ 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 pc-bios/s390-ccw/menu.c create mode 100644 pc-bios/s390-ccw/menu.h