[Top][All Lists]
[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
- [Qemu-devel] [PATCH 0/2][RFC] Introduce macros for setting properties, Anthony Liguori, 2009/07/17
- [Qemu-devel] [PATCH 1/2] Introduce CharDriverState qdev property type, Anthony Liguori, 2009/07/17
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Gerd Hoffmann, 2009/07/21
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Anthony Liguori, 2009/07/21
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Gerd Hoffmann, 2009/07/21
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Gerd Hoffmann, 2009/07/21
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Anthony Liguori, 2009/07/21
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Gerd Hoffmann, 2009/07/21
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Anthony Liguori, 2009/07/21
- [Qemu-devel] Re: [PATCH 1/2] Introduce CharDriverState qdev property type, Gerd Hoffmann, 2009/07/22
[Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties,
Anthony Liguori <=
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Blue Swirl, 2009/07/17
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Anthony Liguori, 2009/07/17
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Paul Brook, 2009/07/17
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Anthony Liguori, 2009/07/17
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Blue Swirl, 2009/07/17
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Anthony Liguori, 2009/07/17
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Paul Brook, 2009/07/17
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Jamie Lokier, 2009/07/18
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Anthony Liguori, 2009/07/18
- Re: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties, Jamie Lokier, 2009/07/19