From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MRod0-0007ho-Us for qemu-devel@nongnu.org; Fri, 17 Jul 2009 10:41:39 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MRocv-0007ea-Es for qemu-devel@nongnu.org; Fri, 17 Jul 2009 10:41:38 -0400 Received: from [199.232.76.173] (port=46462 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MRocu-0007dx-RN for qemu-devel@nongnu.org; Fri, 17 Jul 2009 10:41:32 -0400 Received: from e9.ny.us.ibm.com ([32.97.182.139]:59693) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MRocu-0000Mh-1W for qemu-devel@nongnu.org; Fri, 17 Jul 2009 10:41:32 -0400 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e9.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id n6HETCsU026971 for ; Fri, 17 Jul 2009 10:29:12 -0400 Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v9.2) with ESMTP id n6HEfTuQ255602 for ; Fri, 17 Jul 2009 10:41:29 -0400 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n6HEfTLk003247 for ; Fri, 17 Jul 2009 10:41:29 -0400 From: Anthony Liguori Date: Fri, 17 Jul 2009 09:41:25 -0500 Message-Id: <1247841685-18495-3-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1247841685-18495-1-git-send-email-aliguori@us.ibm.com> References: <1247841685-18495-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 2/2] Introduce macro for defining qdev properties List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , Paul Brook , Gerd Hoffman 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 --- 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