From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MR3iU-0008F7-NZ for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:36:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MR3iO-00089a-OT for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:36:09 -0400 Received: from [199.232.76.173] (port=34318 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MR3iO-00089P-IA for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:36:04 -0400 Received: from mx2.redhat.com ([66.187.237.31]:50066) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MR3iN-0007EJ-SZ for qemu-devel@nongnu.org; Wed, 15 Jul 2009 08:36:04 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6FCa2PN030110 for ; Wed, 15 Jul 2009 08:36:02 -0400 From: Gerd Hoffmann Date: Wed, 15 Jul 2009 14:35:58 +0200 Message-Id: <1247661358-5411-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [RfC PATCH] qdev: helper macros for properties List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Hi, New revision of the helper macros for defining properties, going on top of all other qdev patches posted today. Some minor updates. Now there are versions with and without defaults. Problem of verifying the type of _state->_field still unsolved. Dropped the union idea because it doesn't help much here. cheers, Gerd --- hw/pci.c | 5 +++++ hw/qdev-addr.h | 3 +++ hw/qdev.h | 29 +++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 0 deletions(-) diff --git a/hw/pci.c b/hw/pci.c index 03c7840..6ce3f8f 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -55,6 +55,7 @@ static struct BusInfo pci_bus_info = { .size = sizeof(PCIBus), .print_dev = pcibus_dev_print, .props = (Property[]) { +#if 0 { .name = "addr", .info = &qdev_prop_pci_devfn, @@ -62,6 +63,10 @@ static struct BusInfo pci_bus_info = { .defval = (uint32_t[]) { -1 }, }, {/* end of list */} +#else + DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1), + DEFINE_PROP_END_OF_LIST() +#endif } }; diff --git a/hw/qdev-addr.h b/hw/qdev-addr.h index f02bd7a..e135a96 100644 --- a/hw/qdev-addr.h +++ b/hw/qdev-addr.h @@ -1,2 +1,5 @@ +#define DEFINE_PROP_TADDR(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_taddr) + extern PropertyInfo qdev_prop_taddr; void qdev_prop_set_taddr(DeviceState *dev, const char *name, target_phys_addr_t value); diff --git a/hw/qdev.h b/hw/qdev.h index f2b8b2e..7b2c062 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -152,6 +152,35 @@ extern PropertyInfo qdev_prop_ptr; extern PropertyInfo qdev_prop_macaddr; extern PropertyInfo qdev_prop_pci_devfn; +#define DEFINE_PROP(_name, _state, _field, _prop) { \ + .name = (_name), \ + .info = &(_prop), \ + .offset = offsetof(_state, _field), \ + } +#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \ + .name = (_name), \ + .info = &(_prop), \ + .offset = offsetof(_state, _field), \ + .defval = (_type[]) { _defval }, \ + } + +#define DEFINE_PROP_UINT16(_n, _s, _f, _d) \ + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t) +#define DEFINE_PROP_UINT32(_n, _s, _f, _d) \ + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t) +#define DEFINE_PROP_HEX32(_n, _s, _f, _d) \ + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t) +#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \ + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, uint32_t) + +#define DEFINE_PROP_PTR(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_ptr) +#define DEFINE_PROP_MACADDR(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr) + +#define DEFINE_PROP_END_OF_LIST() \ + {} + /* Set properties between creation and init. */ void *qdev_get_prop_ptr(DeviceState *dev, Property *prop); int qdev_prop_parse(DeviceState *dev, const char *name, const char *value); -- 1.6.2.5