qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] add a boot parameter to set reboot timeout


From: Amos Kong
Subject: Re: [Qemu-devel] [PATCH] add a boot parameter to set reboot timeout
Date: Fri, 07 Sep 2012 10:41:25 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0

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 <address@hidden>
---
  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
address@hidden -boot 
address@hidden,address@hidden,menu=on|off][,address@hidden,address@hidden
address@hidden -boot 
address@hidden,address@hidden,menu=on|off][,address@hidden,address@hidden,address@hidden
  @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.


--
                        Amos.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]