Message ID | 20220223090706.4888-6-damien.hedde@greensocs.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Initial support for machine creation via QMP | expand |
Tested-by: Jim Shu <jim.shu@sifive.com> On Wed, Feb 23, 2022 at 5:18 PM Damien Hedde <damien.hedde@greensocs.com> 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 <damien.hedde@greensocs.com> > --- > 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 > > >
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)
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> --- softmmu/qdev-monitor.c | 11 +++++++++++ softmmu/vl.c | 2 -- 2 files changed, 11 insertions(+), 2 deletions(-)