>From a770efe5a41de0bc841e935bf0a102ba643db031 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 13 Jul 2009 14:00:18 +0200 Subject: [PATCH] qdev/prop: helper macros. --- hw/pci.c | 5 +++++ hw/qdev-addr.h | 3 +++ hw/qdev.h | 32 +++++++++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 1 deletions(-) diff --git a/hw/pci.c b/hw/pci.c index 4c61d63..e689d35 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -56,6 +56,7 @@ static struct BusInfo pci_bus_info = { .print_dev = pcibus_dev_print, .add_dev = pci_create, .props = (Property[]) { +#if 0 { .name = "devfn", .info = &qdev_prop_uint32, @@ -63,6 +64,10 @@ static struct BusInfo pci_bus_info = { .defval = (uint32_t[]) { -1 }, }, {/* end of list */} +#else + DEFINE_PROP_UINT32("devfn", 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 ed0ae83..e7f2367 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -51,7 +51,12 @@ struct Property { const char *name; PropertyInfo *info; int offset; - void *defval; + void *defval; /* FIXME: delete */ + union { + uint16_t *uint16_t; + uint32_t *uint32_t; + void *any; + } def; }; enum PropertyType { @@ -144,6 +149,31 @@ extern PropertyInfo qdev_prop_hex32; extern PropertyInfo qdev_prop_ptr; extern PropertyInfo qdev_prop_mac; +#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), \ + .def._type = (_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_PTR(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_ptr) +#define DEFINE_PROP_MAC(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_mac) +#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