Commit ac05f349 authored by Amos Kong's avatar Amos Kong Committed by Anthony Liguori

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: default avatarAmos Kong <akong@redhat.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 3202beca
...@@ -183,6 +183,30 @@ static void fw_cfg_bootsplash(FWCfgState *s) ...@@ -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, ...@@ -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);
......
...@@ -645,6 +645,9 @@ QemuOptsList qemu_boot_opts = { ...@@ -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 */ }
}, },
......
...@@ -344,13 +344,14 @@ ETEXI ...@@ -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 ...@@ -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
......
...@@ -2632,7 +2632,8 @@ int main(int argc, char **argv, char **envp) ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment