]> git.proxmox.com Git - qemu.git/commitdiff
Add boot-once support
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 1 Jul 2009 22:19:02 +0000 (00:19 +0200)
committerAnthony Liguori <aliguori@us.ibm.com>
Thu, 16 Jul 2009 13:28:12 +0000 (08:28 -0500)
This allows to specify an exceptional boot order only for the first
startup of the guest. After reboot, qemu will switch back to the default
order (or what was specified via 'order='). Makes installing from CD
images and then booting the freshly set up harddisk more handy.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
vl.c

diff --git a/vl.c b/vl.c
index 963b8999f7d3f6f24a916c70067bf1ad88bad0cd..7360d4f0212d1d5bef97802139013dca272a08ff 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -2402,6 +2402,16 @@ static int parse_bootdevices(char *devices)
     return bitmap;
 }
 
+static void restore_boot_devices(void *opaque)
+{
+    char *standard_boot_devices = opaque;
+
+    qemu_boot_set(standard_boot_devices);
+
+    qemu_unregister_reset(restore_boot_devices, standard_boot_devices);
+    qemu_free(standard_boot_devices);
+}
+
 static void numa_add(const char *optarg)
 {
     char option[128];
@@ -5111,9 +5121,10 @@ int main(int argc, char **argv, char **envp)
             case QEMU_OPTION_boot:
                 {
                     static const char * const params[] = {
-                        "order", NULL
+                        "order", "once", NULL
                     };
                     char buf[sizeof(boot_devices)];
+                    char *standard_boot_devices;
                     int legacy = 0;
 
                     if (!strchr(optarg, '=')) {
@@ -5131,6 +5142,16 @@ int main(int argc, char **argv, char **envp)
                         boot_devices_bitmap = parse_bootdevices(buf);
                         pstrcpy(boot_devices, sizeof(boot_devices), buf);
                     }
+                    if (!legacy) {
+                        if (get_param_value(buf, sizeof(buf),
+                                            "once", optarg)) {
+                            boot_devices_bitmap |= parse_bootdevices(buf);
+                            standard_boot_devices = qemu_strdup(boot_devices);
+                            pstrcpy(boot_devices, sizeof(boot_devices), buf);
+                            qemu_register_reset(restore_boot_devices,
+                                                standard_boot_devices);
+                        }
+                    }
                 }
                 break;
             case QEMU_OPTION_fda: