qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties


From: Anthony Liguori
Subject: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties
Date: Fri, 17 Jul 2009 09:41:25 -0500

This patch introduces macros for defining qdev properties.  The default macro
is clever enough to infer the type of the structure field and to automatically
generate a name for the property.  Additional macros are provided that allow
infered values to be overridden along with a set of macros to define properties
with default values.

This patch converts over syborg and a few other devices as a demonstration.
Final patch will convert everything.

Signed-off-by: Anthony Liguori <address@hidden>
---
 hw/escc.c             |   50 ++++++++++--------------------------------------
 hw/qdev.h             |   49 ++++++++++++++++++++++++++++++++++++++++++++++++
 hw/sun4m.c            |    6 +----
 hw/syborg_fb.c        |   11 +--------
 hw/syborg_interrupt.c |    7 +-----
 hw/syborg_keyboard.c  |    7 +-----
 hw/syborg_pointer.c   |   13 +----------
 hw/syborg_serial.c    |    7 +-----
 hw/syborg_timer.c     |    6 +----
 9 files changed, 69 insertions(+), 87 deletions(-)

diff --git a/hw/escc.c b/hw/escc.c
index 9abd092..ff21277 100644
--- a/hw/escc.c
+++ b/hw/escc.c
@@ -737,8 +737,8 @@ int escc_init(target_phys_addr_t base, qemu_irq irqA, 
qemu_irq irqB,
     qdev_prop_set_uint32(dev, "disabled", 0);
     qdev_prop_set_uint32(dev, "frequency", clock);
     qdev_prop_set_uint32(dev, "it_shift", it_shift);
-    qdev_prop_set_ptr(dev, "chrB", chrB);
-    qdev_prop_set_ptr(dev, "chrA", chrA);
+    qdev_prop_set_chrdev(dev, "chrB", chrB);
+    qdev_prop_set_chrdev(dev, "chrA", chrA);
     qdev_prop_set_uint32(dev, "chnBtype", ser);
     qdev_prop_set_uint32(dev, "chnAtype", ser);
     qdev_init(dev);
@@ -900,8 +900,8 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, 
qemu_irq irq,
     qdev_prop_set_uint32(dev, "disabled", disabled);
     qdev_prop_set_uint32(dev, "frequency", clock);
     qdev_prop_set_uint32(dev, "it_shift", it_shift);
-    qdev_prop_set_ptr(dev, "chrB", NULL);
-    qdev_prop_set_ptr(dev, "chrA", NULL);
+    qdev_prop_set_chrdev(dev, "chrB", NULL);
+    qdev_prop_set_chrdev(dev, "chrA", NULL);
     qdev_prop_set_uint32(dev, "chnBtype", mouse);
     qdev_prop_set_uint32(dev, "chnAtype", kbd);
     qdev_init(dev);
@@ -952,41 +952,13 @@ static SysBusDeviceInfo escc_info = {
     .qdev.name  = "escc",
     .qdev.size  = sizeof(SerialState),
     .qdev.props = (Property[]) {
-        {
-            .name = "frequency",
-            .info = &qdev_prop_uint32,
-            .offset = offsetof(SerialState, frequency),
-        },
-        {
-            .name = "it_shift",
-            .info = &qdev_prop_uint32,
-            .offset = offsetof(SerialState, it_shift),
-        },
-        {
-            .name = "disabled",
-            .info = &qdev_prop_uint32,
-            .offset = offsetof(SerialState, disabled),
-        },
-        {
-            .name = "chrB",
-            .info = &qdev_prop_ptr,
-            .offset = offsetof(SerialState, chn[1].chr),
-        },
-        {
-            .name = "chrA",
-            .info = &qdev_prop_ptr,
-            .offset = offsetof(SerialState, chn[0].chr),
-        },
-        {
-            .name = "chnBtype",
-            .info = &qdev_prop_uint32,
-            .offset = offsetof(SerialState, chn[1].type),
-        },
-        {
-            .name = "chnAtype",
-            .info = &qdev_prop_uint32,
-            .offset = offsetof(SerialState, chn[0].type),
-        },
+        QDEV_PROP(SerialState, frequency),
+        QDEV_PROP(SerialState, it_shift),
+        QDEV_PROP(SerialState, disabled),
+        QDEV_PROP_NAME(SerialState, chn[1].chr, "chrB"),
+        QDEV_PROP_NAME(SerialState, chn[0].chr, "chrA"),
+        QDEV_PROP_NAME(SerialState, chn[1].type, "chrBtype"),
+        QDEV_PROP_NAME(SerialState, chn[0].type, "chrAtype"),
         {/* end of list */}
     }
 };
diff --git a/hw/qdev.h b/hw/qdev.h
index 97722b1..9ed635c 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -145,6 +145,55 @@ void do_info_qtree(Monitor *mon);
 
 /*** qdev-properties.c ***/
 
+#define CHOOSE(a, b, c) __builtin_choose_expr(a, b, c)
+#define TYPES_COMPAT(a, b) __builtin_types_compatible_p(a, b)
+#define TYPEOF_FIELD(type, field) typeof(((type *)0)->field)
+
+#define QDEV_PROP_TYPE_INFER(type, field)                          \
+        CHOOSE(TYPES_COMPAT(TYPEOF_FIELD(type, field), uint16_t),  \
+        &qdev_prop_uint16,                                         \
+        CHOOSE(TYPES_COMPAT(TYPEOF_FIELD(type, field), int16_t),   \
+        &qdev_prop_uint16,                                         \
+        CHOOSE(TYPES_COMPAT(TYPEOF_FIELD(type, field), uint32_t),  \
+        &qdev_prop_uint32,                                         \
+        CHOOSE(TYPES_COMPAT(TYPEOF_FIELD(type, field), int32_t),   \
+        &qdev_prop_uint32,                                         \
+        CHOOSE(TYPES_COMPAT(TYPEOF_FIELD(type, field), CharDriverState *), \
+        &qdev_prop_chrdev,                                         \
+        /* force a build break when inference fails */             \
+       (double)3.14159265)))))
+
+#define QDEV_PROP_FULL_DEF(type, field, label, kind, def) \
+    {                                                     \
+        .name = label,                                    \
+        .offset = offsetof(type, field),                  \
+        .info = kind,                                     \
+        .defval = (TYPEOF_FIELD(type, field)[]){def},        \
+    }
+
+#define QDEV_PROP_FULL(type, field, label, kind)      \
+    {                                                 \
+        .name = label,                                \
+        .offset = offsetof(type, field),              \
+        .info = kind,                                 \
+        .defval = 0,                                  \
+    }
+
+#define QDEV_PROP_NAME(type, field, name) \
+    QDEV_PROP_FULL(type, field, name, QDEV_PROP_TYPE_INFER(type, field))
+
+#define QDEV_PROP(type, field)                         \
+    QDEV_PROP_FULL(type, field, stringify(field),      \
+                   QDEV_PROP_TYPE_INFER(type, field))
+
+#define QDEV_PROP_DEFVAL(type, field, defval)                     \
+    QDEV_PROP_FULL_DEF(type, field, stringify(field),             \
+                       QDEV_PROP_TYPE_INFER(type, field), defval)
+
+#define QDEV_PROP_NAME_DEFVAL(type, field, name, defval)          \
+    QDEV_PROP_FULL_DEF(type, field, name,                         \
+                       QDEV_PROP_TYPE_INFER(type, field), defval)
+
 extern PropertyInfo qdev_prop_uint16;
 extern PropertyInfo qdev_prop_uint32;
 extern PropertyInfo qdev_prop_hex32;
diff --git a/hw/sun4m.c b/hw/sun4m.c
index 4954ba3..937960a 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -524,11 +524,7 @@ static SysBusDeviceInfo ram_info = {
     .qdev.name  = "memory",
     .qdev.size  = sizeof(RamDevice),
     .qdev.props = (Property[]) {
-        {
-            .name = "size",
-            .info = &qdev_prop_uint32,
-            .offset = offsetof(RamDevice, size),
-        },
+        QDEV_PROP(RamDevice, size),
         {/* end of property list */}
     }
 };
diff --git a/hw/syborg_fb.c b/hw/syborg_fb.c
index 2929ffd..2178adc 100644
--- a/hw/syborg_fb.c
+++ b/hw/syborg_fb.c
@@ -535,15 +535,8 @@ static SysBusDeviceInfo syborg_fb_info = {
     .qdev.name  = "syborg,framebuffer",
     .qdev.size  = sizeof(SyborgFBState),
     .qdev.props = (Property[]) {
-        {
-            .name   = "width",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgFBState, cols),
-        },{
-            .name   = "height",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgFBState, rows),
-        },
+        QDEV_PROP_NAME(SyborgFBState, cols, "width"),
+        QDEV_PROP_NAME(SyborgFBState, rows, "height"),
         {/* end of list */}
     }
 };
diff --git a/hw/syborg_interrupt.c b/hw/syborg_interrupt.c
index a372ec1..32a8d03 100644
--- a/hw/syborg_interrupt.c
+++ b/hw/syborg_interrupt.c
@@ -222,12 +222,7 @@ static SysBusDeviceInfo syborg_int_info = {
     .qdev.name  = "syborg,interrupt",
     .qdev.size  = sizeof(SyborgIntState),
     .qdev.props = (Property[]) {
-        {
-            .name   = "num-interrupts",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgIntState, num_irqs),
-            .defval = (uint32_t[]) { 64 },
-        },
+        QDEV_PROP_NAME_DEFVAL(SyborgIntState, num_irqs, "num-interrupts", 64),
         {/* end of list */}
     }
 };
diff --git a/hw/syborg_keyboard.c b/hw/syborg_keyboard.c
index ffc85a5..a12712d 100644
--- a/hw/syborg_keyboard.c
+++ b/hw/syborg_keyboard.c
@@ -229,12 +229,7 @@ static SysBusDeviceInfo syborg_keyboard_info = {
     .qdev.name  = "syborg,keyboard",
     .qdev.size  = sizeof(SyborgKeyboardState),
     .qdev.props = (Property[]) {
-        {
-            .name   = "fifo-size",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgKeyboardState, fifo_size),
-            .defval = (uint32_t[]) { 16 },
-        },
+        QDEV_PROP_NAME_DEFVAL(SyborgKeyboardState, fifo_size, "fifo-size", 16),
         {/* end of list */}
     }
 };
diff --git a/hw/syborg_pointer.c b/hw/syborg_pointer.c
index edd1f22..e69e579 100644
--- a/hw/syborg_pointer.c
+++ b/hw/syborg_pointer.c
@@ -227,17 +227,8 @@ static SysBusDeviceInfo syborg_pointer_info = {
     .qdev.name  = "syborg,pointer",
     .qdev.size  = sizeof(SyborgPointerState),
     .qdev.props = (Property[]) {
-        {
-            .name   = "fifo-size",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgPointerState, fifo_size),
-            .defval = (uint32_t[]) { 16 },
-        },{
-            .name   = "absolute",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgPointerState, absolute),
-            .defval = (uint32_t[]) { 1 },
-        },
+        QDEV_PROP_NAME_DEFVAL(SyborgPointerState, fifo_size, "fifo-size", 16),
+        QDEV_PROP_DEFVAL(SyborgPointerState, absolute, 1),
         {/* end of list */}
     }
 };
diff --git a/hw/syborg_serial.c b/hw/syborg_serial.c
index f693421..1492a9e 100644
--- a/hw/syborg_serial.c
+++ b/hw/syborg_serial.c
@@ -344,12 +344,7 @@ static SysBusDeviceInfo syborg_serial_info = {
     .qdev.name  = "syborg,serial",
     .qdev.size  = sizeof(SyborgSerialState),
     .qdev.props = (Property[]) {
-        {
-            .name   = "fifo-size",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgSerialState, fifo_size),
-            .defval = (uint32_t[]) { 16 },
-        },
+        QDEV_PROP_NAME_DEFVAL(SyborgSerialState, fifo_size, "fifo-size", 16),
         {/* end of list */}
     }
 };
diff --git a/hw/syborg_timer.c b/hw/syborg_timer.c
index cf96c5f..422037b 100644
--- a/hw/syborg_timer.c
+++ b/hw/syborg_timer.c
@@ -230,11 +230,7 @@ static SysBusDeviceInfo syborg_timer_info = {
     .qdev.name  = "syborg,timer",
     .qdev.size  = sizeof(SyborgTimerState),
     .qdev.props = (Property[]) {
-        {
-            .name   = "frequency",
-            .info   = &qdev_prop_uint32,
-            .offset = offsetof(SyborgTimerState, freq),
-        },
+        QDEV_PROP_NAME(SyborgTimerState, freq, "frequency"),
         {/* end of list */}
     }
 };
-- 
1.6.2.5





reply via email to

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