add a boot parameter to set reboot timeout

Added an option to let qemu transfer a configuration file to bios,
"etc/boot-fail-wait", which could be specified by command
    -boot reboot-timeout=T
T have a max value of 0xffff, unit is ms.

With this option, guest will wait for a given time if not find
bootabled device, then reboot. If reboot-timeout is '-1', guest
will not reboot, qemu passes '-1' to bios by default.

This feature need the new seabios's support.

Seabios pulls the value from the fwcfg "file" interface, this
interface is used because SeaBIOS needs a reliable way of
obtaining a name, value size, and value. It in no way requires
that there be a real file on the user's host machine.

Signed-off-by: Amos Kong <akong@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Amos Kong 2012-09-07 11:11:03 +08:00 committed by Anthony Liguori
parent 3202becaa2
commit ac05f34924
4 changed files with 39 additions and 4 deletions

View File

@ -183,6 +183,30 @@ static void fw_cfg_bootsplash(FWCfgState *s)
} }
} }
static void fw_cfg_reboot(FWCfgState *s)
{
int reboot_timeout = -1;
char *p;
const char *temp;
/* get user configuration */
QemuOptsList *plist = qemu_find_opts("boot-opts");
QemuOpts *opts = QTAILQ_FIRST(&plist->head);
if (opts != NULL) {
temp = qemu_opt_get(opts, "reboot-timeout");
if (temp != NULL) {
p = (char *)temp;
reboot_timeout = strtol(p, (char **)&p, 10);
}
}
/* validate the input */
if (reboot_timeout > 0xffff) {
error_report("reboot timeout is larger than 65535, force it to 65535.");
reboot_timeout = 0xffff;
}
fw_cfg_add_file(s, "etc/boot-fail-wait", g_memdup(&reboot_timeout, 4), 4);
}
static void fw_cfg_write(FWCfgState *s, uint8_t value) static void fw_cfg_write(FWCfgState *s, uint8_t value)
{ {
int arch = !!(s->cur_entry & FW_CFG_ARCH_LOCAL); int arch = !!(s->cur_entry & FW_CFG_ARCH_LOCAL);
@ -497,6 +521,7 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
fw_cfg_add_i16(s, FW_CFG_MAX_CPUS, (uint16_t)max_cpus); fw_cfg_add_i16(s, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu); fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu);
fw_cfg_bootsplash(s); fw_cfg_bootsplash(s);
fw_cfg_reboot(s);
s->machine_ready.notify = fw_cfg_machine_ready; s->machine_ready.notify = fw_cfg_machine_ready;
qemu_add_machine_init_done_notifier(&s->machine_ready); qemu_add_machine_init_done_notifier(&s->machine_ready);

View File

@ -645,6 +645,9 @@ QemuOptsList qemu_boot_opts = {
}, { }, {
.name = "splash-time", .name = "splash-time",
.type = QEMU_OPT_STRING, .type = QEMU_OPT_STRING,
}, {
.name = "reboot-timeout",
.type = QEMU_OPT_STRING,
}, },
{ /*End of list */ } { /*End of list */ }
}, },

View File

@ -344,13 +344,14 @@ ETEXI
DEF("boot", HAS_ARG, QEMU_OPTION_boot, DEF("boot", HAS_ARG, QEMU_OPTION_boot,
"-boot [order=drives][,once=drives][,menu=on|off]\n" "-boot [order=drives][,once=drives][,menu=on|off]\n"
" [,splash=sp_name][,splash-time=sp_time]\n" " [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time]\n"
" 'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)\n" " 'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)\n"
" 'sp_name': the file's name that would be passed to bios as logo picture, if menu=on\n" " 'sp_name': the file's name that would be passed to bios as logo picture, if menu=on\n"
" 'sp_time': the period that splash picture last if menu=on, unit is ms\n", " 'sp_time': the period that splash picture last if menu=on, unit is ms\n"
" 'rb_timeout': the timeout before guest reboot when boot failed, unit is ms\n",
QEMU_ARCH_ALL) QEMU_ARCH_ALL)
STEXI STEXI
@item -boot [order=@var{drives}][,once=@var{drives}][,menu=on|off][,splash=@var{sp_name}][,splash-time=@var{sp_time}] @item -boot [order=@var{drives}][,once=@var{drives}][,menu=on|off][,splash=@var{sp_name}][,splash-time=@var{sp_time}][,reboot-timeout=@var{rb_timeout}]
@findex -boot @findex -boot
Specify boot order @var{drives} as a string of drive letters. Valid Specify boot order @var{drives} as a string of drive letters. Valid
drive letters depend on the target achitecture. The x86 PC uses: a, b drive letters depend on the target achitecture. The x86 PC uses: a, b
@ -369,6 +370,11 @@ limitation: The splash file could be a jpeg file or a BMP file in 24 BPP
format(true color). The resolution should be supported by the SVGA mode, so format(true color). The resolution should be supported by the SVGA mode, so
the recommended is 320x240, 640x480, 800x640. the recommended is 320x240, 640x480, 800x640.
A timeout could be passed to bios, guest will pause for @var{rb_timeout} ms
when boot failed, then reboot. If @var{rb_timeout} is '-1', guest will not
reboot, qemu passes '-1' to bios by default. Currently Seabios for X86
system support it.
@example @example
# try to boot from network first, then from hard disk # try to boot from network first, then from hard disk
qemu-system-i386 -boot order=nc qemu-system-i386 -boot order=nc

3
vl.c
View File

@ -2632,7 +2632,8 @@ int main(int argc, char **argv, char **envp)
{ {
static const char * const params[] = { static const char * const params[] = {
"order", "once", "menu", "order", "once", "menu",
"splash", "splash-time", NULL "splash", "splash-time",
"reboot-timeout", NULL
}; };
char buf[sizeof(boot_devices)]; char buf[sizeof(boot_devices)];
char *standard_boot_devices; char *standard_boot_devices;