From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MVjrH-0004p6-CI for qemu-devel@nongnu.org; Tue, 28 Jul 2009 06:24:35 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MVjrG-0004om-EG for qemu-devel@nongnu.org; Tue, 28 Jul 2009 06:24:34 -0400 Received: from [199.232.76.173] (port=37899 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MVjrG-0004ob-7C for qemu-devel@nongnu.org; Tue, 28 Jul 2009 06:24:34 -0400 Received: from mx2.redhat.com ([66.187.237.31]:60531) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MVjrF-0006in-L2 for qemu-devel@nongnu.org; Tue, 28 Jul 2009 06:24:33 -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 n6SAOWbC021709 for ; Tue, 28 Jul 2009 06:24:32 -0400 From: Gerd Hoffmann Date: Tue, 28 Jul 2009 12:24:24 +0200 Message-Id: <1248776664-4321-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1248776664-4321-1-git-send-email-kraxel@redhat.com> References: <1248776664-4321-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [RfC PATCH 2/2] qdev/prop: macros for creating typechecked 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 Signed-off-by: Gerd Hoffmann --- hw/pci.c | 5 +++++ hw/qdev-addr.h | 3 +++ hw/qdev.h | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 0 deletions(-) diff --git a/hw/pci.c b/hw/pci.c index 4d0cdc7..bac0f8b 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -60,6 +60,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, @@ -67,6 +68,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..9568c27 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, target_phys_addr_t) + 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 af2ee0f..3a02af9 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -155,6 +155,46 @@ extern PropertyInfo qdev_prop_ptr; extern PropertyInfo qdev_prop_macaddr; extern PropertyInfo qdev_prop_pci_devfn; +extern int type_check_failed; +#define typeof_field(type, field) typeof(((type *)0)->field) +#define type_check(t1,t2) __builtin_choose_expr( \ + __builtin_types_compatible_p(t1,t2),0,type_check_failed) + +#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \ + .name = (_name), \ + .info = &(_prop), \ + .offset = offsetof(_state, _field) \ + + type_check(_type,typeof_field(_state, _field)), \ + } +#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \ + .name = (_name), \ + .info = &(_prop), \ + .offset = offsetof(_state, _field) \ + + type_check(_type,typeof_field(_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_UINT64(_n, _s, _f, _d) \ + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t) +#define DEFINE_PROP_HEX32(_n, _s, _f, _d) \ + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t) +#define DEFINE_PROP_HEX64(_n, _s, _f, _d) \ + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_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, void*) +#define DEFINE_PROP_MACADDR(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, uint8_t[6]) + +#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