machine: add device_type_is_dynamic_sysbus function
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.hedde@greensocs.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Acked-by: Eduardo Habkost <ehabkost@redhat.com> Message-Id: <20211029142258.484907-2-damien.hedde@greensocs.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
parent
9e8e393bb7
commit
b5fdf4102f
|
@ -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 device_is_dynamic_sysbus(MachineClass *mc, DeviceState *dev)
|
||||||
{
|
{
|
||||||
bool allowed = false;
|
|
||||||
strList *wl;
|
|
||||||
Object *obj = OBJECT(dev);
|
Object *obj = OBJECT(dev);
|
||||||
|
|
||||||
if (!object_dynamic_cast(obj, TYPE_SYS_BUS_DEVICE)) {
|
if (!object_dynamic_cast(obj, TYPE_SYS_BUS_DEVICE)) {
|
||||||
return false;
|
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;
|
for (wl = mc->allowed_dynamic_sysbus_devices;
|
||||||
!allowed && wl;
|
!allowed && wl;
|
||||||
wl = wl->next) {
|
wl = wl->next) {
|
||||||
allowed |= !!object_dynamic_cast(obj, wl->value);
|
allowed |= !!object_class_dynamic_cast(klass, wl->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return allowed;
|
return allowed;
|
||||||
|
|
|
@ -52,6 +52,21 @@ void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp);
|
||||||
*/
|
*/
|
||||||
void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
|
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
|
* device_is_dynamic_sysbus: test whether device is a dynamic sysbus device
|
||||||
* @mc: Machine class
|
* @mc: Machine class
|
||||||
|
|
Loading…
Reference in a new issue