Tested-by: Jim Shu On Wed, Feb 23, 2022 at 5:18 PM Damien Hedde wrote: > 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 > --- > softmmu/qdev-monitor.c | 11 +++++++++++ > softmmu/vl.c | 2 -- > 2 files changed, 11 insertions(+), 2 deletions(-) > > diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c > index 47a89aee20..9ec3e0ebff 100644 > --- a/softmmu/qdev-monitor.c > +++ b/softmmu/qdev-monitor.c > @@ -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 > @@ -671,6 +672,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); > > @@ -712,6 +717,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: > @@ -719,6 +727,9 @@ err_del_dev: > object_unparent(OBJECT(dev)); > object_unref(OBJECT(dev)); > } > + if (!is_hotplug) { > + rom_reset_order_override(); > + } > return NULL; > } > > diff --git a/softmmu/vl.c b/softmmu/vl.c > index 50337d68b9..b91ae1b8ae 100644 > --- a/softmmu/vl.c > +++ b/softmmu/vl.c > @@ -2680,7 +2680,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) { > @@ -2697,7 +2696,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) > -- > 2.35.1 > > >