[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 1/3] machine: add device_type_is_dynamic_sysbus function
From: |
Alistair Francis |
Subject: |
Re: [PATCH v3 1/3] machine: add device_type_is_dynamic_sysbus function |
Date: |
Mon, 1 Nov 2021 09:36:53 +1000 |
On Sat, Oct 30, 2021 at 12:26 AM Damien Hedde
<damien.hedde@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.hedde@greensocs.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> Cc: Ani Sinha <ani@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
>
>