qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback
@ 2011-01-18 10:58 Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

This patchset allows a new property type called PROP_TYPE_ENUM,
I want to use it for the backend property in the ccid patches (will
send the patchset that uses it after this), libvirt is the ultimate
user.

The first patch adds a print_options callback that works with this
property type to print the optional values.

The second patch allows storing the name/value mapping in the property,
using a void ptr for later different uses.

The third patch adds the property itself.

Alon Levy (3):
  qdev: add print_options callback
  qdev: add data pointer to Property
  qdev-properties: add PROP_TYPE_ENUM

 hw/qdev-properties.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/qdev.c            |   10 +++++++-
 hw/qdev.h            |   17 ++++++++++++++
 3 files changed, 86 insertions(+), 1 deletions(-)

-- 
1.7.3.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 1/3] qdev: add print_options callback
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
@ 2011-01-18 10:58 ` Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property Alon Levy
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

another callback added to PropertyInfo, for later use by PROP_TYPE_ENUM.
Allows printing of runtime computed options when doing:
 qemu -device foo,?
---
 hw/qdev.c |   10 +++++++++-
 hw/qdev.h |    1 +
 2 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 5b8d374..d1550b9 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -188,7 +188,15 @@ int qdev_device_help(QemuOpts *opts)
         if (!prop->info->parse) {
             continue;           /* no way to set it, don't show */
         }
-        error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
+        if (prop->info->print_options) {
+            char buf[256];
+            int ret;
+            ret = prop->info->print_options(info, prop, buf, sizeof(buf) - 3);
+            error_printf("%s.%s=%s%s\n", info->name, prop->name, buf,
+                ret == sizeof(buf) - 3 ? "..." : "" );
+        } else {
+            error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
+        }
     }
     return 1;
 }
diff --git a/hw/qdev.h b/hw/qdev.h
index e520aaa..530fc5d 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -109,6 +109,7 @@ struct PropertyInfo {
     enum PropertyType type;
     int (*parse)(DeviceState *dev, Property *prop, const char *str);
     int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
+    int (*print_options)(DeviceInfo *info, Property *prop, char *dest, size_t len);
     void (*free)(DeviceState *dev, Property *prop);
 };
 
-- 
1.7.3.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
@ 2011-01-18 10:58 ` Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM Alon Levy
  2011-01-25 15:58 ` [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

For later use by PROP_TYPE_ENUM, will store enumeration name/value
table there.
---
 hw/qdev.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/qdev.h b/hw/qdev.h
index 530fc5d..f6d5279 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -83,6 +83,7 @@ struct Property {
     int          offset;
     int          bitnr;
     void         *defval;
+    void         *data;
 };
 
 enum PropertyType {
-- 
1.7.3.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property Alon Levy
@ 2011-01-18 10:58 ` Alon Levy
  2011-01-25 15:58 ` [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

Example usage:

EnumTable foo_enum_table[] = {
    {"bar", 1},
    {"buz", 2},
    {NULL, 0},
};

DEFINE_PROP_ENUM("foo", State, foo, 1, foo_enum_table)

When using qemu -device foodev,? it will appear as:
 foodev.foo=bar/buz
---
 hw/qdev-properties.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/qdev.h            |   15 ++++++++++++
 2 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
index a493087..3157721 100644
--- a/hw/qdev-properties.c
+++ b/hw/qdev-properties.c
@@ -63,6 +63,66 @@ PropertyInfo qdev_prop_bit = {
     .print = print_bit,
 };
 
+/* --- Enumeration --- */
+/* Example usage:
+EnumTable foo_enum_table[] = {
+    {"bar", 1},
+    {"buz", 2},
+    {NULL, 0},
+};
+DEFINE_PROP_ENUM("foo", State, foo, 1, foo_enum_table),
+ */
+static int parse_enum(DeviceState *dev, Property *prop, const char *str)
+{
+    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
+    EnumTable *option = (EnumTable*)prop->data;
+
+    while (option->name != NULL) {
+        if (!strncmp(str, option->name, strlen(option->name))) {
+            *ptr = option->value;
+            return 0;
+        }
+        option++;
+    }
+    return -EINVAL;
+}
+
+static int print_enum(DeviceState *dev, Property *prop, char *dest, size_t len)
+{
+    uint32_t *p = qdev_get_prop_ptr(dev, prop);
+    EnumTable *option = (EnumTable*)prop->data;
+    while (option->name != NULL) {
+        if (*p == option->value) {
+            return snprintf(dest, len, "%s", option->name);
+        }
+        option++;
+    }
+    return 0;
+}
+
+static int print_enum_options(DeviceInfo *info, Property *prop, char *dest, size_t len)
+{
+    int ret = 0;
+    EnumTable *option = (EnumTable*)prop->data;
+    while (option->name != NULL) {
+        ret += snprintf(dest + ret, len - ret, "%s", option->name);
+        if (option[1].name != NULL) {
+            ret += snprintf(dest + ret, len - ret, "/");
+        }
+        option++;
+    }
+    return ret;
+}
+
+PropertyInfo qdev_prop_enum = {
+    .name  = "enum",
+    .type  = PROP_TYPE_ENUM,
+    .size  = sizeof(uint32_t),
+    .parse = parse_enum,
+    .print = print_enum,
+    .print_options = print_enum_options,
+};
+
 /* --- 8bit integer --- */
 
 static int parse_uint8(DeviceState *dev, Property *prop, const char *str)
diff --git a/hw/qdev.h b/hw/qdev.h
index f6d5279..26b3d9e 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -102,6 +102,7 @@ enum PropertyType {
     PROP_TYPE_VLAN,
     PROP_TYPE_PTR,
     PROP_TYPE_BIT,
+    PROP_TYPE_ENUM,
 };
 
 struct PropertyInfo {
@@ -121,6 +122,11 @@ typedef struct GlobalProperty {
     QTAILQ_ENTRY(GlobalProperty) next;
 } GlobalProperty;
 
+typedef struct EnumTable {
+    const char *name;
+    uint32_t    value;
+} EnumTable;
+
 /*** Board API.  This should go away once we have a machine config file.  ***/
 
 DeviceState *qdev_create(BusState *bus, const char *name);
@@ -237,6 +243,7 @@ extern PropertyInfo qdev_prop_drive;
 extern PropertyInfo qdev_prop_netdev;
 extern PropertyInfo qdev_prop_vlan;
 extern PropertyInfo qdev_prop_pci_devfn;
+extern PropertyInfo qdev_prop_enum;
 
 #define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
         .name      = (_name),                                    \
@@ -259,6 +266,14 @@ extern PropertyInfo qdev_prop_pci_devfn;
             + type_check(uint32_t,typeof_field(_state, _field)), \
         .defval    = (bool[]) { (_defval) },                     \
         }
+#define DEFINE_PROP_ENUM(_name, _state, _field, _defval, _options) {    \
+        .name      = (_name),                                           \
+        .info      = &(qdev_prop_enum),                                 \
+        .offset    = offsetof(_state, _field)                           \
+            + type_check(uint32_t,typeof_field(_state, _field)),        \
+        .defval    = (uint32_t[]) { (_defval) },                        \
+        .data      = (void*)(_options),                                 \
+        }
 
 #define DEFINE_PROP_UINT8(_n, _s, _f, _d)                       \
     DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
-- 
1.7.3.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
                   ` (2 preceding siblings ...)
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM Alon Levy
@ 2011-01-25 15:58 ` Alon Levy
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-25 15:58 UTC (permalink / raw)
  To: qemu-devel

On Tue, Jan 18, 2011 at 12:58:37PM +0200, Alon Levy wrote:
> This patchset allows a new property type called PROP_TYPE_ENUM,
> I want to use it for the backend property in the ccid patches (will
> send the patchset that uses it after this), libvirt is the ultimate
> user.

Ping.

Anthony - this is required for the ccid patch I will sent (ok, a little
predictive) since it makes choosing a backend for ccid-card-emulated simpler,
all the string comparing is here.

Looking at other devices this can be used:
 * ivshmem.c: role

> 
> The first patch adds a print_options callback that works with this
> property type to print the optional values.
> 
> The second patch allows storing the name/value mapping in the property,
> using a void ptr for later different uses.
> 
> The third patch adds the property itself.
> 
> Alon Levy (3):
>   qdev: add print_options callback
>   qdev: add data pointer to Property
>   qdev-properties: add PROP_TYPE_ENUM
> 
>  hw/qdev-properties.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/qdev.c            |   10 +++++++-
>  hw/qdev.h            |   17 ++++++++++++++
>  3 files changed, 86 insertions(+), 1 deletions(-)
> 
> -- 
> 1.7.3.4
> 
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-01-25 15:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
2011-01-18 10:58 ` [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property Alon Levy
2011-01-18 10:58 ` [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM Alon Levy
2011-01-25 15:58 ` [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).