Commit e0f084bf authored by Jan Kiszka's avatar Jan Kiszka Committed by Anthony Liguori
Browse files

Add boot-once support



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: default avatarJan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent dda9b29f
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -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: