On Sat, Oct 30, 2021 at 12:26 AM Damien Hedde <damien.he...@greensocs.com> wrote: > > Right now the allowance check for adding a sysbus device using > -device cli option (or device_add qmp command) is done well after > the device has been created. It is done during the machine init done > notifier: machine_init_notify() in hw/core/machine.c > > This new function will allow us to do the check at the right time and > issue an error if it fails. > > Also make device_is_dynamic_sysbus() use the new function. > > Signed-off-by: Damien Hedde <damien.he...@greensocs.com>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > Cc: Ani Sinha <a...@anisinha.ca> > > v3: change the function name (Ani) > --- > include/hw/boards.h | 15 +++++++++++++++ > hw/core/machine.c | 13 ++++++++++--- > 2 files changed, 25 insertions(+), 3 deletions(-) > > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 5adbcbb99b..85adf660c1 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -51,6 +51,21 @@ void machine_set_cpu_numa_node(MachineState *machine, > */ > void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char > *type); > > +/** > + * device_type_is_dynamic_sysbus: Check if type is an allowed sysbus device > + * type for the machine class. > + * @mc: Machine class > + * @type: type to check (should be a subtype of TYPE_SYS_BUS_DEVICE) > + * > + * Returns: true if @type is a type in the machine's list of > + * dynamically pluggable sysbus devices; otherwise false. > + * > + * Check if the QOM type @type is in the list of allowed sysbus device > + * types (see machine_class_allowed_dynamic_sysbus_dev()). > + * Note that if @type has a parent type in the list, it is allowed too. > + */ > +bool device_type_is_dynamic_sysbus(MachineClass *mc, const char *type); > + > /** > * device_is_dynamic_sysbus: test whether device is a dynamic sysbus device > * @mc: Machine class > diff --git a/hw/core/machine.c b/hw/core/machine.c > index b8d95eec32..0d20104796 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -548,18 +548,25 @@ void > machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type) > > bool device_is_dynamic_sysbus(MachineClass *mc, DeviceState *dev) > { > - bool allowed = false; > - strList *wl; > Object *obj = OBJECT(dev); > > if (!object_dynamic_cast(obj, TYPE_SYS_BUS_DEVICE)) { > return false; > } > > + return device_type_is_dynamic_sysbus(mc, object_get_typename(obj)); > +} > + > +bool device_type_is_dynamic_sysbus(MachineClass *mc, const char *type) > +{ > + bool allowed = false; > + strList *wl; > + ObjectClass *klass = object_class_by_name(type); > + > for (wl = mc->allowed_dynamic_sysbus_devices; > !allowed && wl; > wl = wl->next) { > - allowed |= !!object_dynamic_cast(obj, wl->value); > + allowed |= !!object_class_dynamic_cast(klass, wl->value); > } > > return allowed; > -- > 2.33.0 > >