On 06/09/12 20:46, Gleb Natapov wrote:
On Thu, Sep 06, 2012 at 08:39:24PM +0800, Amos Kong wrote:
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. This feature need the new seabios's support.
IMO default should be no reboot just like before Seabios change.
Seabios reboots in 60s by default.
And I agree with you, will pass a '-1' to seabios by default, then the default behavior of qemu is no-reboot.
Thanks, Amos
Signed-off-by: Amos Kong akong@redhat.com
hw/fw_cfg.c | 29 +++++++++++++++++++++++++++++ qemu-config.c | 3 +++ qemu-options.hx | 10 +++++++--- vl.c | 3 ++- 4 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c index 7b3b576..a017184 100644 --- a/hw/fw_cfg.c +++ b/hw/fw_cfg.c @@ -183,6 +183,34 @@ 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);
}
- }
- if (reboot_timeout >= 0) {
/* 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) { int arch = !!(s->cur_entry & FW_CFG_ARCH_LOCAL);
@@ -497,6 +525,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_BOOT_MENU, (uint16_t)boot_menu); fw_cfg_bootsplash(s);
fw_cfg_reboot(s);
s->machine_ready.notify = fw_cfg_machine_ready; qemu_add_machine_init_done_notifier(&s->machine_ready);
diff --git a/qemu-config.c b/qemu-config.c index c05ffbc..b9f9e0f 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -638,6 +638,9 @@ QemuOptsList qemu_boot_opts = { }, { .name = "splash-time", .type = QEMU_OPT_STRING,
}, {
.name = "reboot-timeout",
.type = QEMU_OPT_STRING, }, { /*End of list */ } },
diff --git a/qemu-options.hx b/qemu-options.hx index 3c411c4..d50505b 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -339,13 +339,14 @@ ETEXI
DEF("boot", HAS_ARG, QEMU_OPTION_boot, "-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" " '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) 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 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 @@ -364,6 +365,9 @@ 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 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.
- @example # try to boot from network first, then from hard disk qemu-system-i386 -boot order=nc
diff --git a/vl.c b/vl.c index 7c577fa..1bd9931 100644 --- a/vl.c +++ b/vl.c @@ -2622,7 +2622,8 @@ int main(int argc, char **argv, char **envp) { static const char * const params[] = { "order", "once", "menu",
"splash", "splash-time", NULL
"splash", "splash-time",
"reboot-timeout", NULL }; char buf[sizeof(boot_devices)]; char *standard_boot_devices;
-- 1.7.1
-- Gleb.