qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 10/11] qdev: Add do_info_qbus and friends.


From: Luiz Capitulino
Subject: Re: [Qemu-devel] [PATCH 10/11] qdev: Add do_info_qbus and friends.
Date: Tue, 29 Dec 2009 15:13:54 -0200

On Sat, 26 Dec 2009 21:19:21 +0000
Nathan Baum <address@hidden> wrote:

> Places information about a bus and the devices on into a QObject.
> 
> Signed-off-by: Nathan Baum <address@hidden>
> ---
>  hw/qdev.c |   73 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 73 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/qdev.c b/hw/qdev.c
> index b6bd4ae..f5d68c6 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -30,6 +30,8 @@
>  #include "sysemu.h"
>  #include "monitor.h"
>  #include "qerror.h"
> +#include "qint.h"
> +#include "qbool.h"
>  
>  static int qdev_hotplug = 0;
>  
> @@ -654,6 +656,77 @@ void qbus_free(BusState *bus)
>      }
>  }
>  
> +static void do_info_qbus(Monitor *mon, BusState *bus, QObject **ret_data);
> +
> +static void do_info_qdev_props(Monitor *mon, DeviceState *dev, Property 
> *props, const char *prefix,
> +                               QDict *qdict)
> +{
> +    char name[64];
> +    char value[64];
> +
> +    if (!props)
> +        return;
> +    while (props->name) {
> +        if (props->info->print) {
> +            props->info->print(dev, props, value, sizeof(value));
> +            snprintf(name, sizeof(name), "%s-%s", prefix, props->name);
> +            qdict_put(qdict, name, qstring_from_str(value));

 We can't have information to be parsed in QMP, so you probably want to another
QDict here.

> +        }
> +        props++;
> +    }
> +}
> +
> +static void do_info_qdev(Monitor *mon, DeviceState *dev, QObject **ret_data)
> +{
> +    BusState *child;
> +    QDict *qdict;
> +    QList *children;
> +
> +    qdict = qdict_new();
> +    qdict_put(qdict, "name", qstring_from_str(dev->info->name));
> +    if (dev->id)
> +        qdict_put(qdict, "id", qstring_from_str(dev->id));
> +    qdict_put(qdict, "gpio-in", qint_from_int(dev->num_gpio_in));
> +    qdict_put(qdict, "gpio-out", qint_from_int(dev->num_gpio_out));

 Is this a boolean? If so you should use qbool_from_int().

> +    do_info_qdev_props(mon, dev, dev->info->props, "dev", qdict);
> +    do_info_qdev_props(mon, dev, dev->parent_bus->info->props, "bus", qdict);
> +    children = qlist_new();
> +    QLIST_FOREACH(child, &dev->child_bus, sibling) {
> +        QObject *data = NULL;
> +        do_info_qbus(mon, child, &data);
> +        if (data)
> +            qlist_append_obj(children, data);
> +    }
> +    if (!qlist_empty(children))
> +        qdict_put(qdict, "children", children);
> +    if (dev->parent_bus->info->info_dev) {
> +        qdict_put_obj(qdict, "info", dev->parent_bus->info->info_dev(mon, 
> dev));
> +    }
> +    *ret_data = (QObject *) qdict;

 You need QOBJECT() macro here.

> +}
> +
> +static void do_info_qbus(Monitor *mon, BusState *bus, QObject **ret_data)
> +{
> +    struct DeviceState *dev;
> +    QDict *qdict;
> +    QList *children;
> +
> +    qdict = qdict_new();
> +    qdict_put(qdict, "bus", qstring_from_str(bus->name));
> +    qdict_put(qdict, "type", qstring_from_str(bus->info->name));
> +    qdict_put(qdict, "allow_hotplug", qbool_from_int(bus->allow_hotplug));
> +    children = qlist_new();
> +    qdict_put(qdict, "children", children);
> +    QLIST_FOREACH(dev, &bus->children, sibling) {
> +        QObject *data = NULL;
> +        do_info_qdev(mon, dev, &data);
> +        if (data)
> +            qlist_append_obj(children, data);
> +    }
> +    
> +    *ret_data = (QObject *) qdict;

 Here too.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]