From: Gonglei <arei.gong...@huawei.com> When we want to change one device's bootindex, we should lookup the device and change the bootindex. it is simply that remove it from the global boot list, then re-add it, sorted by new bootindex. If the new bootindex has already used by another device just throw an error.
Signed-off-by: Gonglei <arei.gong...@huawei.com> Signed-off-by: Chenliang <chenlian...@huawei.com> --- include/sysemu/sysemu.h | 2 ++ vl.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index d8539fd..e1b0659 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -209,6 +209,8 @@ void usb_info(Monitor *mon, const QDict *qdict); void add_boot_device_path(int32_t bootindex, DeviceState *dev, const char *suffix); +void modify_boot_device_path(int32_t bootindex, DeviceState *dev, + const char *suffix); char *get_boot_devices_list(size_t *size, bool ignore_suffixes); DeviceState *get_boot_device(uint32_t position); diff --git a/vl.c b/vl.c index fe451aa..3e42eaa 100644 --- a/vl.c +++ b/vl.c @@ -1248,6 +1248,64 @@ void add_boot_device_path(int32_t bootindex, DeviceState *dev, QTAILQ_INSERT_TAIL(&fw_boot_order, node, link); } +void modify_boot_device_path(int32_t bootindex, DeviceState *dev, + const char *suffix) +{ + FWBootEntry *node, *i, *old_entry = NULL; + + assert(dev != NULL || suffix != NULL); + + if (bootindex >= 0) { + QTAILQ_FOREACH(i, &fw_boot_order, link) { + if (i->bootindex == bootindex) { + qerror_report(ERROR_CLASS_GENERIC_ERROR, + "The bootindex %d has already been used", bootindex); + return; + } + } + } + + QTAILQ_FOREACH(i, &fw_boot_order, link) { + /* delete the same original dev */ + if (i->dev->id && !strcmp(i->dev->id, dev->id)) { + QTAILQ_REMOVE(&fw_boot_order, i, link); + old_entry = i; + + break; + } + } + + if (bootindex >= 0) { + node = g_malloc0(sizeof(FWBootEntry)); + node->bootindex = bootindex; + if (suffix) { + node->suffix = g_strdup(suffix); + } else if (old_entry) { + node->suffix = g_strdup(old_entry->suffix); + } else { + node->suffix = NULL; + } + node->dev = dev; + + /* add to the global boot list */ + QTAILQ_FOREACH(i, &fw_boot_order, link) { + if (i->bootindex < bootindex) { + continue; + } + QTAILQ_INSERT_BEFORE(i, node, link); + goto out; + } + + QTAILQ_INSERT_TAIL(&fw_boot_order, node, link); + } + +out: + if (old_entry) { + g_free(old_entry->suffix); + g_free(old_entry); + } +} + DeviceState *get_boot_device(uint32_t position) { uint32_t counter = 0; -- 1.7.12.4