@@ -43,6 +43,7 @@
#include "hw/qdev-properties.h"
#include "hw/clock.h"
#include "hw/boards.h"
+#include "hw/loader.h"
/*
* Aliases were a bad idea from the start. Let's keep them
@@ -673,6 +674,10 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts,
return NULL;
}
+ if (!is_hotplug) {
+ rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
+ }
+
/* create device */
dev = qdev_new(driver);
@@ -714,6 +719,9 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts,
if (!qdev_realize(DEVICE(dev), bus, errp)) {
goto err_del_dev;
}
+ if (!is_hotplug) {
+ rom_reset_order_override();
+ }
return dev;
err_del_dev:
@@ -721,6 +729,9 @@ err_del_dev:
object_unparent(OBJECT(dev));
object_unref(OBJECT(dev));
}
+ if (!is_hotplug) {
+ rom_reset_order_override();
+ }
return NULL;
}
@@ -2635,7 +2635,6 @@ static void qemu_create_cli_devices(void)
}
/* init generic devices */
- rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
qemu_opts_foreach(qemu_find_opts("device"),
device_init_func, NULL, &error_fatal);
QTAILQ_FOREACH(opt, &device_opts, next) {
@@ -2652,7 +2651,6 @@ static void qemu_create_cli_devices(void)
object_unref(OBJECT(dev));
loc_pop(&opt->loc);
}
- rom_reset_order_override();
}
static void qemu_machine_creation_done(void)
rom_set_order_override() and rom_reset_order_override() were called in qemu_create_cli_devices() to set the rom_order_override value once and for all when creating the devices added on CLI. Unfortunately this won't work with qapi commands. Move the calls inside device_add so that it will be done in every case: + CLI option: -device + QAPI command: device_add rom_[set|reset]_order_override() are implemented in hw/core/loader.c They either do nothing or call fw_cfg_[set|reset]_order_override(). The later functions are implemented in hw/nvram/fw_cfg.c and only change an integer value of a "global" variable. In consequence, there are no complex side effects involved and we can safely move them from outside the -device option loop to the inner function. Signed-off-by: Damien Hedde <damien.hedde@greensocs.com> --- I see 2 other ways to handle this: 1. Adding a new option to device_add. We could add a new boolean (_rom_order_override_ for example) option tot he qapi command. This flag would then be forced to "true" when handling "-device" parameter from CLI. The flag default could be: - always false - false on hot-plug, true on cold-plug. 2. Adding a new qapi command We could add one or two commands to do the rom_[set|reset]_order_override() operation. --- softmmu/qdev-monitor.c | 11 +++++++++++ softmmu/vl.c | 2 -- 2 files changed, 11 insertions(+), 2 deletions(-)