qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2 24/27] qdev: initialize properties via QOM


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH v2 24/27] qdev: initialize properties via QOM
Date: Mon, 06 Feb 2012 08:38:25 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.23) Gecko/20110922 Lightning/1.0b2 Thunderbird/3.1.15

On 02/04/2012 02:02 AM, Paolo Bonzini wrote:
Similarly, use the object properties also to set the default
values of the qdev properties.  This requires reordering
registration and initialization.

Signed-off-by: Paolo Bonzini<address@hidden>

Reviewed-by: Anthony Liguori <address@hidden>

Regards,

Anthony Liguori

---
  hw/qdev-properties.c |   29 ++++++++++++++---------------
  hw/qdev.c            |    4 ++--
  hw/qdev.h            |   11 +++++++----
  3 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
index b3cd2a8..49bed30 100644
--- a/hw/qdev-properties.c
+++ b/hw/qdev-properties.c
@@ -26,17 +26,6 @@ static void bit_prop_set(DeviceState *dev, Property *props, 
bool val)
          *p&= ~mask;
  }

-static void qdev_prop_cpy(DeviceState *dev, Property *props, void *src)
-{
-    if (props->info->type == PROP_TYPE_BIT) {
-        bool *defval = src;
-        bit_prop_set(dev, props, *defval);
-    } else {
-        char *dst = qdev_get_prop_ptr(dev, props);
-        memcpy(dst, src, props->info->size);
-    }
-}
-
  /* Bit */
  static int parse_bit(DeviceState *dev, Property *prop, const char *str)
  {
@@ -1241,13 +1230,23 @@ void qdev_prop_set_ptr(DeviceState *dev, const char 
*name, void *value)

  void qdev_prop_set_defaults(DeviceState *dev, Property *props)
  {
+    Object *obj = OBJECT(dev);
      if (!props)
          return;
-    while (props->name) {
-        if (props->defval) {
-            qdev_prop_cpy(dev, props, props->defval);
+    for (; props->name; props++) {
+        Error *errp = NULL;
+        if (props->qtype == QTYPE_NONE) {
+            continue;
          }
-        props++;
+        if (props->qtype == QTYPE_QBOOL) {
+            object_property_set_bool(obj, props->defval, props->name,&errp);
+        } else if (props->info->enum_table) {
+            object_property_set_str(obj, 
props->info->enum_table[props->defval],
+                                    props->name,&errp);
+        } else if (props->qtype == QTYPE_QINT) {
+            object_property_set_int(obj, props->defval, props->name,&errp);
+        }
+        assert(!errp);
      }
  }

diff --git a/hw/qdev.c b/hw/qdev.c
index f719f14..dc1d1a1 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -86,11 +86,11 @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
      dev->parent_bus = bus;
      QTAILQ_INSERT_HEAD(&bus->children, dev, sibling);

-    qdev_prop_set_defaults(dev, dev->parent_bus->info->props);
      for (prop = qdev_get_bus_info(dev)->props; prop&&  prop->name; prop++) {
          qdev_property_add_legacy(dev, prop, NULL);
          qdev_property_add_static(dev, prop, NULL);
      }
+    qdev_prop_set_defaults(dev, dev->parent_bus->info->props);
  }

  /* Create a new device.  This only initializes the device state structure
@@ -612,13 +612,13 @@ static void device_initfn(Object *obj)
      dev->instance_id_alias = -1;
      dev->state = DEV_STATE_CREATED;

-    qdev_prop_set_defaults(dev, qdev_get_props(dev));
      for (prop = qdev_get_props(dev); prop&&  prop->name; prop++) {
          qdev_property_add_legacy(dev, prop, NULL);
          qdev_property_add_static(dev, prop, NULL);
      }

      object_property_add_str(OBJECT(dev), "type", qdev_get_type, NULL, NULL);
+    qdev_prop_set_defaults(dev, qdev_get_props(dev));
  }

  /* Unlink device from bus and free the structure.  */
diff --git a/hw/qdev.h b/hw/qdev.h
index 9ccd5c3..a3bcf0b 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -112,8 +112,9 @@ struct Property {
      const char   *name;
      PropertyInfo *info;
      int          offset;
-    int          bitnr;
-    void         *defval;
+    uint8_t      bitnr;
+    uint8_t      qtype;
+    int64_t      defval;
  };

  enum PropertyType {
@@ -255,7 +256,8 @@ extern PropertyInfo qdev_prop_pci_devfn;
          .info      =&(_prop),                                          \
          .offset    = offsetof(_state, _field)                           \
              + type_check(_type,typeof_field(_state, _field)),           \
-        .defval    = (_type[]) { _defval },                             \
+        .qtype     = QTYPE_QINT,                                        \
+        .defval    = (_type)_defval,                                    \
          }
  #define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) {  \
          .name      = (_name),                                    \
@@ -263,7 +265,8 @@ extern PropertyInfo qdev_prop_pci_devfn;
          .bitnr    = (_bit),                                      \
          .offset    = offsetof(_state, _field)                    \
              + type_check(uint32_t,typeof_field(_state, _field)), \
-        .defval    = (bool[]) { (_defval) },                     \
+        .qtype     = QTYPE_QBOOL,                                \
+        .defval    = (bool)_defval,                              \
          }

  #define DEFINE_PROP_UINT8(_n, _s, _f, _d)                       \




reply via email to

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