On Mon, 26 Feb 2018 11:42:29 +0100 Thomas Huth <th...@redhat.com> wrote:
> From: "Collin L. Walling" <wall...@linux.vnet.ibm.com> > > Set boot menu options for an s390 guest and store them in > the iplb. These options are set via the QEMU command line > option: > > -boot menu=on|off[,splash-time=X] > > or via the libvirt domain xml: > > <os> > <bootmenu enable='yes|no' timeout='X'/> > </os> > > Where X represents some positive integer representing > milliseconds. > > Any value set for loadparm will override all boot menu options. > If loadparm=PROMPT, then the menu will be enabled without a > timeout. > > Signed-off-by: Collin L. Walling <wall...@linux.vnet.ibm.com> > Reviewed-by: Janosch Frank <fran...@linux.vnet.ibm.com> > Reviewed-by: Thomas Huth <th...@redhat.com> > Signed-off-by: Thomas Huth <th...@redhat.com> > --- > hw/s390x/ipl.c | 52 > +++++++++++++++++++++++++++++++++++++++++++++++++ > hw/s390x/ipl.h | 9 +++++++-- > pc-bios/s390-ccw/iplb.h | 9 +++++++-- Updating the header, but it is not consumed in the bios? > 3 files changed, 66 insertions(+), 4 deletions(-) > +static void s390_ipl_set_boot_menu(S390IPLState *ipl) > +{ > + QemuOptsList *plist = qemu_find_opts("boot-opts"); > + QemuOpts *opts = QTAILQ_FIRST(&plist->head); > + uint8_t *flags = &ipl->qipl.qipl_flags; > + uint32_t *timeout = &ipl->qipl.boot_menu_timeout; > + const char *tmp; > + unsigned long splash_time = 0; > + > + if (!get_boot_device(0)) { > + if (boot_menu) { > + error_report("boot menu requires a bootindex to be specified for > " > + "the IPL device."); > + } > + return; > + } > + > + switch (ipl->iplb.pbt) { > + case S390_IPL_TYPE_CCW: > + break; > + default: > + error_report("boot menu is not supported for this device type."); If I specify both a bootindex for a device and a -kernel parameter, I get this error message. Looks a tad odd, but not sure how to avoid it. Also, error_report() should not use trailing punctuation, but we can fix that up with a follow-on patch. > + return; > + } > + > + if (!boot_menu) { > + return; > + } > + > + *flags |= QIPL_FLAG_BM_OPTS_CMD; > + > + tmp = qemu_opt_get(opts, "splash-time"); > + > + if (tmp && qemu_strtoul(tmp, NULL, 10, &splash_time)) { > + error_report("splash-time is invalid, forcing it to 0."); > + *timeout = 0; > + return; > + } > + > + if (splash_time > 0xffffffff) { > + error_report("splash-time is too large, forcing it to max value."); > + *timeout = 0xffffffff; > + return; > + } > + > + *timeout = cpu_to_be32(splash_time); > +} > +