From: Anthony Liguori <anthony@codemonkey.ws>
To: "Andreas Färber" <afaerber@suse.de>
Cc: pbonzini@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH qom-next 4/7] qdev: Move bulk of qdev-properties.c to qom/object-properties.c
Date: Fri, 08 Jun 2012 09:26:22 +0800 [thread overview]
Message-ID: <4FD154BE.1040407@codemonkey.ws> (raw)
In-Reply-To: <1339097465-22977-5-git-send-email-afaerber@suse.de>
On 06/08/2012 03:31 AM, Andreas Färber wrote:
> From: Paolo Bonzini<pbonzini@redhat.com>
>
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
> [AF: Move to new qom/object-properties.c, update documentation.]
> Signed-off-by: Andreas Färber<afaerber@suse.de>
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Regards,
Anthony Liguori
> ---
> hw/qdev-properties.c | 487 +++++------------------------------------------
> hw/qdev.c | 47 +-----
> hw/qdev.h | 87 ---------
> include/qemu/object.h | 98 ++++++++++
> qom/Makefile | 2 +-
> qom/object-properties.c | 461 ++++++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 607 insertions(+), 575 deletions(-)
> create mode 100644 qom/object-properties.c
>
> diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
> index 910e07f..5187604 100644
> --- a/hw/qdev-properties.c
> +++ b/hw/qdev-properties.c
> @@ -3,392 +3,27 @@
> #include "qerror.h"
> #include "blockdev.h"
>
> -void *object_get_prop_ptr(Object *obj, Property *prop)
> -{
> - void *ptr = obj;
> - ptr += prop->offset;
> - return ptr;
> -}
> -
> -static uint32_t get_prop_mask(Property *prop)
> -{
> - assert(prop->info ==&qdev_prop_bit);
> - return 0x1<< prop->bitnr;
> -}
> -
> -static void bit_prop_set(Object *obj, Property *props, bool val)
> -{
> - uint32_t *p = object_get_prop_ptr(obj, props);
> - uint32_t mask = get_prop_mask(props);
> - if (val)
> - *p |= mask;
> - else
> - *p&= ~mask;
> -}
> -
> -/* Bit */
> -
> -static int print_bit(Object *obj, Property *prop, char *dest, size_t len)
> -{
> - uint32_t *p = object_get_prop_ptr(obj, prop);
> - return snprintf(dest, len, (*p& get_prop_mask(prop)) ? "on" : "off");
> -}
> -
> -static void get_bit(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint32_t *p = object_get_prop_ptr(obj, prop);
> - bool value = (*p& get_prop_mask(prop)) != 0;
> -
> - visit_type_bool(v,&value, name, errp);
> -}
> -
> -static void set_bit(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - Error *local_err = NULL;
> - bool value;
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_bool(v,&value, name,&local_err);
> - if (local_err) {
> - error_propagate(errp, local_err);
> - return;
> - }
> - bit_prop_set(obj, prop, value);
> -}
> -
> -PropertyInfo qdev_prop_bit = {
> - .name = "boolean",
> - .legacy_name = "on/off",
> - .print = print_bit,
> - .get = get_bit,
> - .set = set_bit,
> -};
> -
> -/* --- 8bit integer --- */
> -
> -static void get_uint8(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint8_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - visit_type_uint8(v, ptr, name, errp);
> -}
> -
> -static void set_uint8(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint8_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_uint8(v, ptr, name, errp);
> -}
> -
> -PropertyInfo qdev_prop_uint8 = {
> - .name = "uint8",
> - .get = get_uint8,
> - .set = set_uint8,
> -};
> -
> -/* --- 8bit hex value --- */
> -
> -static int parse_hex8(Object *obj, Property *prop, const char *str)
> -{
> - uint8_t *ptr = object_get_prop_ptr(obj, prop);
> - char *end;
> -
> - if (str[0] != '0' || str[1] != 'x') {
> - return -EINVAL;
> - }
> -
> - *ptr = strtoul(str,&end, 16);
> - if ((*end != '\0') || (end == str)) {
> - return -EINVAL;
> - }
> -
> - return 0;
> -}
> -
> -static int print_hex8(Object *obj, Property *prop, char *dest, size_t len)
> -{
> - uint8_t *ptr = object_get_prop_ptr(obj, prop);
> - return snprintf(dest, len, "0x%" PRIx8, *ptr);
> -}
> -
> -PropertyInfo qdev_prop_hex8 = {
> - .name = "uint8",
> - .legacy_name = "hex8",
> - .parse = parse_hex8,
> - .print = print_hex8,
> - .get = get_uint8,
> - .set = set_uint8,
> -};
> -
> -/* --- 16bit integer --- */
> -
> -static void get_uint16(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint16_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - visit_type_uint16(v, ptr, name, errp);
> -}
> -
> -static void set_uint16(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint16_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_uint16(v, ptr, name, errp);
> -}
> -
> -PropertyInfo qdev_prop_uint16 = {
> - .name = "uint16",
> - .get = get_uint16,
> - .set = set_uint16,
> -};
> -
> -/* --- 32bit integer --- */
> -
> -static void get_uint32(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint32_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - visit_type_uint32(v, ptr, name, errp);
> -}
> -
> -static void set_uint32(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint32_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_uint32(v, ptr, name, errp);
> -}
> -
> -static void get_int32(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - int32_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - visit_type_int32(v, ptr, name, errp);
> -}
> -
> -static void set_int32(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - int32_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_int32(v, ptr, name, errp);
> -}
> -
> -PropertyInfo qdev_prop_uint32 = {
> - .name = "uint32",
> - .get = get_uint32,
> - .set = set_uint32,
> -};
> -
> -PropertyInfo qdev_prop_int32 = {
> - .name = "int32",
> - .get = get_int32,
> - .set = set_int32,
> -};
> -
> -/* --- 32bit hex value --- */
> -
> -static int parse_hex32(Object *obj, Property *prop, const char *str)
> -{
> - uint32_t *ptr = object_get_prop_ptr(obj, prop);
> - char *end;
> -
> - if (str[0] != '0' || str[1] != 'x') {
> - return -EINVAL;
> - }
> -
> - *ptr = strtoul(str,&end, 16);
> - if ((*end != '\0') || (end == str)) {
> - return -EINVAL;
> - }
> -
> - return 0;
> -}
> -
> -static int print_hex32(Object *obj, Property *prop, char *dest, size_t len)
> -{
> - uint32_t *ptr = object_get_prop_ptr(obj, prop);
> - return snprintf(dest, len, "0x%" PRIx32, *ptr);
> -}
> -
> -PropertyInfo qdev_prop_hex32 = {
> - .name = "uint32",
> - .legacy_name = "hex32",
> - .parse = parse_hex32,
> - .print = print_hex32,
> - .get = get_uint32,
> - .set = set_uint32,
> -};
> -
> -/* --- 64bit integer --- */
> -
> -static void get_uint64(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint64_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - visit_type_uint64(v, ptr, name, errp);
> -}
> -
> -static void set_uint64(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - uint64_t *ptr = object_get_prop_ptr(obj, prop);
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_uint64(v, ptr, name, errp);
> -}
> -
> -PropertyInfo qdev_prop_uint64 = {
> - .name = "uint64",
> - .get = get_uint64,
> - .set = set_uint64,
> -};
> -
> -/* --- 64bit hex value --- */
> -
> -static int parse_hex64(Object *obj, Property *prop, const char *str)
> -{
> - uint64_t *ptr = object_get_prop_ptr(obj, prop);
> - char *end;
> -
> - if (str[0] != '0' || str[1] != 'x') {
> - return -EINVAL;
> - }
> -
> - *ptr = strtoull(str,&end, 16);
> - if ((*end != '\0') || (end == str)) {
> - return -EINVAL;
> - }
> -
> - return 0;
> -}
> -
> -static int print_hex64(Object *obj, Property *prop, char *dest, size_t len)
> -{
> - uint64_t *ptr = object_get_prop_ptr(obj, prop);
> - return snprintf(dest, len, "0x%" PRIx64, *ptr);
> -}
> -
> -PropertyInfo qdev_prop_hex64 = {
> - .name = "uint64",
> - .legacy_name = "hex64",
> - .parse = parse_hex64,
> - .print = print_hex64,
> - .get = get_uint64,
> - .set = set_uint64,
> -};
> -
> -/* --- string --- */
> -
> -static void release_string(Object *obj, const char *name, void *opaque)
> -{
> - Property *prop = opaque;
> - g_free(*(char **)object_get_prop_ptr(obj, prop));
> -}
> -
> -static int print_string(Object *obj, Property *prop, char *dest, size_t len)
> -{
> - char **ptr = object_get_prop_ptr(obj, prop);
> - if (!*ptr)
> - return snprintf(dest, len, "<null>");
> - return snprintf(dest, len, "\"%s\"", *ptr);
> -}
> -
> -static void get_string(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - char **ptr = object_get_prop_ptr(obj, prop);
> -
> - if (!*ptr) {
> - char *str = (char *)"";
> - visit_type_str(v,&str, name, errp);
> - } else {
> - visit_type_str(v, ptr, name, errp);
> - }
> -}
> -
> -static void set_string(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> +void error_set_from_prop_error(Error **errp, int ret, Object *obj,
> + Property *prop, const char *value)
> {
> - Property *prop = opaque;
> - char **ptr = object_get_prop_ptr(obj, prop);
> - Error *local_err = NULL;
> - char *str;
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_str(v,&str, name,&local_err);
> - if (local_err) {
> - error_propagate(errp, local_err);
> - return;
> - }
> - if (*ptr) {
> - g_free(*ptr);
> + switch (ret) {
> + case -EEXIST:
> + error_set(errp, QERR_PROPERTY_VALUE_IN_USE,
> + object_get_id(obj), prop->name, value);
> + break;
> + default:
> + case -EINVAL:
> + error_set(errp, QERR_PROPERTY_VALUE_BAD,
> + object_get_id(obj), prop->name, value);
> + break;
> + case -ENOENT:
> + error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND,
> + object_get_id(obj), prop->name, value);
> + break;
> + case 0:
> + break;
> }
> - *ptr = str;
> }
> -
> -PropertyInfo qdev_prop_string = {
> - .name = "string",
> - .print = print_string,
> - .release = release_string,
> - .get = get_string,
> - .set = set_string,
> -};
> -
> /* --- drive --- */
>
> static int parse_drive(Object *obj, const char *str, void **ptr)
> @@ -636,13 +271,6 @@ PropertyInfo qdev_prop_vlan = {
> .set = set_vlan,
> };
>
> -/* --- pointer --- */
> -
> -/* Not a proper property, just for dirty hacks. TODO Remove it! */
> -PropertyInfo qdev_prop_ptr = {
> - .name = "ptr",
> -};
> -
> /* --- mac address --- */
>
> /*
> @@ -713,6 +341,12 @@ PropertyInfo qdev_prop_macaddr = {
> .set = set_mac,
> };
>
> +/* --- pointer --- */
> +
> +/* Not a proper property, just for dirty hacks. TODO Remove it! */
> +PropertyInfo qdev_prop_ptr = {
> + .name = "ptr",
> +};
>
> /* --- lost tick policy --- */
>
> @@ -726,40 +360,24 @@ static const char *lost_tick_policy_table[LOST_TICK_MAX+1] = {
>
> QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
>
> -static void get_enum(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - int *ptr = object_get_prop_ptr(obj, prop);
> -
> - visit_type_enum(v, ptr, prop->info->enum_table,
> - prop->info->name, prop->name, errp);
> -}
> -
> -static void set_enum(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - Property *prop = opaque;
> - int *ptr = object_get_prop_ptr(obj, prop);
> -
> - if (object_is_realized(obj)) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_enum(v, ptr, prop->info->enum_table,
> - prop->info->name, prop->name, errp);
> -}
> -
> PropertyInfo qdev_prop_losttickpolicy = {
> .name = "LostTickPolicy",
> .enum_table = lost_tick_policy_table,
> - .get = get_enum,
> - .set = set_enum,
> + .get = property_get_enum,
> + .set = property_set_enum,
> };
>
> /* --- pci address --- */
>
> +static void get_pci_devfn(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + int32_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_int32(v, ptr, name, errp);
> +}
> +
> /*
> * bus-local address, i.e. "$slot" or "$slot.$fn"
> */
> @@ -826,12 +444,21 @@ PropertyInfo qdev_prop_pci_devfn = {
> .name = "int32",
> .legacy_name = "pci-devfn",
> .print = print_pci_devfn,
> - .get = get_int32,
> + .get = get_pci_devfn,
> .set = set_pci_devfn,
> };
>
> /* --- blocksize --- */
>
> +static void get_blocksize(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint16_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_uint16(v, ptr, name, errp);
> +}
> +
> static void set_blocksize(Object *obj, Visitor *v, void *opaque,
> const char *name, Error **errp)
> {
> @@ -869,7 +496,7 @@ static void set_blocksize(Object *obj, Visitor *v, void *opaque,
>
> PropertyInfo qdev_prop_blocksize = {
> .name = "blocksize",
> - .get = get_uint16,
> + .get = get_blocksize,
> .set = set_blocksize,
> };
>
> @@ -905,28 +532,6 @@ static Property *qdev_prop_find(Object *obj, const char *name)
> return NULL;
> }
>
> -void error_set_from_prop_error(Error **errp, int ret, Object *obj,
> - Property *prop, const char *value)
> -{
> - switch (ret) {
> - case -EEXIST:
> - error_set(errp, QERR_PROPERTY_VALUE_IN_USE,
> - object_get_id(obj), prop->name, value);
> - break;
> - default:
> - case -EINVAL:
> - error_set(errp, QERR_PROPERTY_VALUE_BAD,
> - object_get_id(obj), prop->name, value);
> - break;
> - case -ENOENT:
> - error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND,
> - object_get_id(obj), prop->name, value);
> - break;
> - case 0:
> - break;
> - }
> -}
> -
> int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
> {
> char *legacy_name;
> diff --git a/hw/qdev.c b/hw/qdev.c
> index fdafd7d..d4b8f91 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -615,51 +615,6 @@ void qdev_property_add_legacy(DeviceState *dev, Property *prop,
> g_free(name);
> }
>
> -/**
> - * @qdev_property_add_static - add a @Property to a device.
> - *
> - * Static properties access data in a struct. The actual type of the
> - * property and the field depends on the property type.
> - */
> -void qdev_property_add_static(DeviceState *dev, Property *prop,
> - Error **errp)
> -{
> - Error *local_err = NULL;
> - Object *obj = OBJECT(dev);
> -
> - /*
> - * TODO qdev_prop_ptr does not have getters or setters. It must
> - * go now that it can be replaced with links. The test should be
> - * removed along with it: all static properties are read/write.
> - */
> - if (!prop->info->get&& !prop->info->set) {
> - return;
> - }
> -
> - object_property_add(obj, prop->name, prop->info->name,
> - prop->info->get, prop->info->set,
> - prop->info->release,
> - prop,&local_err);
> -
> - if (local_err) {
> - error_propagate(errp, local_err);
> - return;
> - }
> - if (prop->qtype == QTYPE_NONE) {
> - return;
> - }
> -
> - if (prop->qtype == QTYPE_QBOOL) {
> - object_property_set_bool(obj, prop->defval, prop->name,&local_err);
> - } else if (prop->info->enum_table) {
> - object_property_set_str(obj, prop->info->enum_table[prop->defval],
> - prop->name,&local_err);
> - } else if (prop->qtype == QTYPE_QINT) {
> - object_property_set_int(obj, prop->defval, prop->name,&local_err);
> - }
> - assert_no_error(local_err);
> -}
> -
> static void device_initfn(Object *obj)
> {
> DeviceState *dev = DEVICE(obj);
> @@ -677,7 +632,7 @@ static void device_initfn(Object *obj)
> do {
> for (prop = DEVICE_CLASS(class)->props; prop&& prop->name; prop++) {
> qdev_property_add_legacy(dev, prop, NULL);
> - qdev_property_add_static(dev, prop, NULL);
> + object_property_add_static(OBJECT(dev), prop, NULL);
> }
> class = object_class_get_parent(class);
> } while (class != object_class_by_name(TYPE_DEVICE));
> diff --git a/hw/qdev.h b/hw/qdev.h
> index bfa8620..c810d43 100644
> --- a/hw/qdev.h
> +++ b/hw/qdev.h
> @@ -9,10 +9,6 @@
> #include "qemu/object.h"
> #include "error.h"
>
> -typedef struct Property Property;
> -
> -typedef struct PropertyInfo PropertyInfo;
> -
> typedef struct CompatProperty CompatProperty;
>
> typedef struct BusState BusState;
> @@ -117,26 +113,6 @@ struct BusState {
> QLIST_ENTRY(BusState) sibling;
> };
>
> -struct Property {
> - const char *name;
> - PropertyInfo *info;
> - int offset;
> - uint8_t bitnr;
> - uint8_t qtype;
> - int64_t defval;
> -};
> -
> -struct PropertyInfo {
> - const char *name;
> - const char *legacy_name;
> - const char **enum_table;
> - int (*parse)(Object *obj, Property *prop, const char *str);
> - int (*print)(Object *obj, Property *prop, char *dest, size_t len);
> - ObjectPropertyAccessor *get;
> - ObjectPropertyAccessor *set;
> - ObjectPropertyRelease *release;
> -};
> -
> typedef struct GlobalProperty {
> const char *driver;
> const char *property;
> @@ -212,16 +188,6 @@ int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
>
> /*** qdev-properties.c ***/
>
> -extern PropertyInfo qdev_prop_bit;
> -extern PropertyInfo qdev_prop_uint8;
> -extern PropertyInfo qdev_prop_uint16;
> -extern PropertyInfo qdev_prop_uint32;
> -extern PropertyInfo qdev_prop_int32;
> -extern PropertyInfo qdev_prop_uint64;
> -extern PropertyInfo qdev_prop_hex8;
> -extern PropertyInfo qdev_prop_hex32;
> -extern PropertyInfo qdev_prop_hex64;
> -extern PropertyInfo qdev_prop_string;
> extern PropertyInfo qdev_prop_chr;
> extern PropertyInfo qdev_prop_ptr;
> extern PropertyInfo qdev_prop_macaddr;
> @@ -232,55 +198,12 @@ extern PropertyInfo qdev_prop_vlan;
> extern PropertyInfo qdev_prop_pci_devfn;
> extern PropertyInfo qdev_prop_blocksize;
>
> -#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)), \
> - .qtype = QTYPE_QINT, \
> - .defval = (_type)_defval, \
> - }
> -#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \
> - .name = (_name), \
> - .info =&(qdev_prop_bit), \
> - .bitnr = (_bit), \
> - .offset = offsetof(_state, _field) \
> - + type_check(uint32_t,typeof_field(_state, _field)), \
> - .qtype = QTYPE_QBOOL, \
> - .defval = (bool)_defval, \
> - }
> -
> -#define DEFINE_PROP_UINT8(_n, _s, _f, _d) \
> - DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
> -#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_INT32(_n, _s, _f, _d) \
> - DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t)
> -#define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
> - DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
> -#define DEFINE_PROP_HEX8(_n, _s, _f, _d) \
> - DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex8, uint8_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, int32_t)
> -
> #define DEFINE_PROP_PTR(_n, _s, _f) \
> DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*)
> #define DEFINE_PROP_CHR(_n, _s, _f) \
> DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*)
> -#define DEFINE_PROP_STRING(_n, _s, _f) \
> - DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
> #define DEFINE_PROP_NETDEV(_n, _s, _f) \
> DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, VLANClientState*)
> #define DEFINE_PROP_VLAN(_n, _s, _f) \
> @@ -295,11 +218,7 @@ extern PropertyInfo qdev_prop_blocksize;
> #define DEFINE_PROP_BLOCKSIZE(_n, _s, _f, _d) \
> DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_blocksize, uint16_t)
>
> -#define DEFINE_PROP_END_OF_LIST() \
> - {}
> -
> /* Set properties between creation and init. */
> -void *object_get_prop_ptr(Object *obj, Property *prop);
> int qdev_prop_parse(DeviceState *dev, const char *name, const char *value);
> void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value);
> void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value);
> @@ -326,12 +245,6 @@ void error_set_from_prop_error(Error **errp, int ret, Object *obj,
> char *qdev_get_fw_dev_path(DeviceState *dev);
>
> /**
> - * @qdev_property_add_static - add a @Property to a device referencing a
> - * field in a struct.
> - */
> -void qdev_property_add_static(DeviceState *dev, Property *prop, Error **errp);
> -
> -/**
> * @qdev_machine_init
> *
> * Initialize platform devices before machine init. This is a hack until full
> diff --git a/include/qemu/object.h b/include/qemu/object.h
> index 81e0280..ea5f16e 100644
> --- a/include/qemu/object.h
> +++ b/include/qemu/object.h
> @@ -983,5 +983,103 @@ int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque),
> */
> Object *container_get(Object *root, const char *path);
>
> +typedef struct Property Property;
> +typedef struct PropertyInfo PropertyInfo;
> +
> +struct Property {
> + const char *name;
> + PropertyInfo *info;
> + int offset;
> + uint8_t bitnr;
> + uint8_t qtype;
> + int64_t defval;
> +};
> +
> +struct PropertyInfo {
> + const char *name;
> + const char *legacy_name;
> + const char **enum_table;
> + int (*parse)(Object *obj, Property *prop, const char *str);
> + int (*print)(Object *obj, Property *prop, char *dest, size_t len);
> + ObjectPropertyAccessor *get;
> + ObjectPropertyAccessor *set;
> + ObjectPropertyRelease *release;
> +};
> +
> +extern PropertyInfo qdev_prop_bit;
> +extern PropertyInfo qdev_prop_uint8;
> +extern PropertyInfo qdev_prop_uint16;
> +extern PropertyInfo qdev_prop_uint32;
> +extern PropertyInfo qdev_prop_int32;
> +extern PropertyInfo qdev_prop_uint64;
> +extern PropertyInfo qdev_prop_hex8;
> +extern PropertyInfo qdev_prop_hex32;
> +extern PropertyInfo qdev_prop_hex64;
> +extern PropertyInfo qdev_prop_string;
> +
> +#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)), \
> + .qtype = QTYPE_QINT, \
> + .defval = (_type)_defval, \
> + }
> +#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \
> + .name = (_name), \
> + .info =&(qdev_prop_bit), \
> + .bitnr = (_bit), \
> + .offset = offsetof(_state, _field) \
> + + type_check(uint32_t,typeof_field(_state, _field)), \
> + .qtype = QTYPE_QBOOL, \
> + .defval = (bool)_defval, \
> + }
> +
> +#define DEFINE_PROP_UINT8(_n, _s, _f, _d) \
> + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
> +#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_INT32(_n, _s, _f, _d) \
> + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t)
> +#define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
> + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
> +#define DEFINE_PROP_HEX8(_n, _s, _f, _d) \
> + DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex8, uint8_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_STRING(_n, _s, _f) \
> + DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
> +
> +#define DEFINE_PROP_END_OF_LIST() \
> + {}
> +
> +void property_get_enum(Object *obj, struct Visitor *v, void *opaque,
> + const char *name, struct Error **errp);
> +void property_set_enum(Object *obj, struct Visitor *v, void *opaque,
> + const char *name, struct Error **errp);
> +
> +void *object_get_prop_ptr(Object *obj, Property *prop);
> +
> +/**
> + * object_property_add_static:
> + * @obj: the object to add the property to
> + * @prop: the property to be added
> + * @errp: if an error occurs, a pointer to an area to store the error
> + *
> + * Add a #Property to an object referencing a field in a struct.
> + */
> +void object_property_add_static(Object *obj, Property *prop,
> + struct Error **errp);
> +
>
> #endif
> diff --git a/qom/Makefile b/qom/Makefile
> index 34c6de5..2aae0ba 100644
> --- a/qom/Makefile
> +++ b/qom/Makefile
> @@ -1,2 +1,2 @@
> -qom-y = object.o container.o qom-qobject.o
> +qom-y = object.o object-properties.o container.o qom-qobject.o
> qom-twice-y = cpu.o
> diff --git a/qom/object-properties.c b/qom/object-properties.c
> new file mode 100644
> index 0000000..6765e90
> --- /dev/null
> +++ b/qom/object-properties.c
> @@ -0,0 +1,461 @@
> +#include "qemu/object.h"
> +#include "qapi/qapi-visit-core.h"
> +
> +void *object_get_prop_ptr(Object *obj, Property *prop)
> +{
> + void *ptr = obj;
> + ptr += prop->offset;
> + return ptr;
> +}
> +
> +static uint32_t get_prop_mask(Property *prop)
> +{
> + assert(prop->info ==&qdev_prop_bit);
> + return 0x1<< prop->bitnr;
> +}
> +
> +static void bit_prop_set(Object *obj, Property *props, bool val)
> +{
> + uint32_t *p = object_get_prop_ptr(obj, props);
> + uint32_t mask = get_prop_mask(props);
> + if (val)
> + *p |= mask;
> + else
> + *p&= ~mask;
> +}
> +
> +/* Bit */
> +
> +static int print_bit(Object *obj, Property *prop, char *dest, size_t len)
> +{
> + uint32_t *p = object_get_prop_ptr(obj, prop);
> + return snprintf(dest, len, (*p& get_prop_mask(prop)) ? "on" : "off");
> +}
> +
> +static void get_bit(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint32_t *p = object_get_prop_ptr(obj, prop);
> + bool value = (*p& get_prop_mask(prop)) != 0;
> +
> + visit_type_bool(v,&value, name, errp);
> +}
> +
> +static void set_bit(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + Error *local_err = NULL;
> + bool value;
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_bool(v,&value, name,&local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + bit_prop_set(obj, prop, value);
> +}
> +
> +PropertyInfo qdev_prop_bit = {
> + .name = "boolean",
> + .legacy_name = "on/off",
> + .print = print_bit,
> + .get = get_bit,
> + .set = set_bit,
> +};
> +
> +/* --- 8bit integer --- */
> +
> +static void get_uint8(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint8_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_uint8(v, ptr, name, errp);
> +}
> +
> +static void set_uint8(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint8_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_uint8(v, ptr, name, errp);
> +}
> +
> +PropertyInfo qdev_prop_uint8 = {
> + .name = "uint8",
> + .get = get_uint8,
> + .set = set_uint8,
> +};
> +
> +/* --- 8bit hex value --- */
> +
> +static int parse_hex8(Object *obj, Property *prop, const char *str)
> +{
> + uint8_t *ptr = object_get_prop_ptr(obj, prop);
> + char *end;
> +
> + if (str[0] != '0' || str[1] != 'x') {
> + return -EINVAL;
> + }
> +
> + *ptr = strtoul(str,&end, 16);
> + if ((*end != '\0') || (end == str)) {
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int print_hex8(Object *obj, Property *prop, char *dest, size_t len)
> +{
> + uint8_t *ptr = object_get_prop_ptr(obj, prop);
> + return snprintf(dest, len, "0x%" PRIx8, *ptr);
> +}
> +
> +PropertyInfo qdev_prop_hex8 = {
> + .name = "uint8",
> + .legacy_name = "hex8",
> + .parse = parse_hex8,
> + .print = print_hex8,
> + .get = get_uint8,
> + .set = set_uint8,
> +};
> +
> +/* --- 16bit integer --- */
> +
> +static void get_uint16(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint16_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_uint16(v, ptr, name, errp);
> +}
> +
> +static void set_uint16(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint16_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_uint16(v, ptr, name, errp);
> +}
> +
> +PropertyInfo qdev_prop_uint16 = {
> + .name = "uint16",
> + .get = get_uint16,
> + .set = set_uint16,
> +};
> +
> +/* --- 32bit integer --- */
> +
> +static void get_uint32(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint32_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_uint32(v, ptr, name, errp);
> +}
> +
> +static void set_uint32(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint32_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_uint32(v, ptr, name, errp);
> +}
> +
> +static void get_int32(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + int32_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_int32(v, ptr, name, errp);
> +}
> +
> +static void set_int32(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + int32_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_int32(v, ptr, name, errp);
> +}
> +
> +PropertyInfo qdev_prop_uint32 = {
> + .name = "uint32",
> + .get = get_uint32,
> + .set = set_uint32,
> +};
> +
> +PropertyInfo qdev_prop_int32 = {
> + .name = "int32",
> + .get = get_int32,
> + .set = set_int32,
> +};
> +
> +/* --- 32bit hex value --- */
> +
> +static int parse_hex32(Object *obj, Property *prop, const char *str)
> +{
> + uint32_t *ptr = object_get_prop_ptr(obj, prop);
> + char *end;
> +
> + if (str[0] != '0' || str[1] != 'x') {
> + return -EINVAL;
> + }
> +
> + *ptr = strtoul(str,&end, 16);
> + if ((*end != '\0') || (end == str)) {
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int print_hex32(Object *obj, Property *prop, char *dest, size_t len)
> +{
> + uint32_t *ptr = object_get_prop_ptr(obj, prop);
> + return snprintf(dest, len, "0x%" PRIx32, *ptr);
> +}
> +
> +PropertyInfo qdev_prop_hex32 = {
> + .name = "uint32",
> + .legacy_name = "hex32",
> + .parse = parse_hex32,
> + .print = print_hex32,
> + .get = get_uint32,
> + .set = set_uint32,
> +};
> +
> +/* --- 64bit integer --- */
> +
> +static void get_uint64(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint64_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_uint64(v, ptr, name, errp);
> +}
> +
> +static void set_uint64(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + uint64_t *ptr = object_get_prop_ptr(obj, prop);
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_uint64(v, ptr, name, errp);
> +}
> +
> +PropertyInfo qdev_prop_uint64 = {
> + .name = "uint64",
> + .get = get_uint64,
> + .set = set_uint64,
> +};
> +
> +/* --- 64bit hex value --- */
> +
> +static int parse_hex64(Object *obj, Property *prop, const char *str)
> +{
> + uint64_t *ptr = object_get_prop_ptr(obj, prop);
> + char *end;
> +
> + if (str[0] != '0' || str[1] != 'x') {
> + return -EINVAL;
> + }
> +
> + *ptr = strtoull(str,&end, 16);
> + if ((*end != '\0') || (end == str)) {
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int print_hex64(Object *obj, Property *prop, char *dest, size_t len)
> +{
> + uint64_t *ptr = object_get_prop_ptr(obj, prop);
> + return snprintf(dest, len, "0x%" PRIx64, *ptr);
> +}
> +
> +PropertyInfo qdev_prop_hex64 = {
> + .name = "uint64",
> + .legacy_name = "hex64",
> + .parse = parse_hex64,
> + .print = print_hex64,
> + .get = get_uint64,
> + .set = set_uint64,
> +};
> +
> +/* --- string --- */
> +
> +static void release_string(Object *obj, const char *name, void *opaque)
> +{
> + Property *prop = opaque;
> + g_free(*(char **)object_get_prop_ptr(obj, prop));
> +}
> +
> +static int print_string(Object *obj, Property *prop, char *dest, size_t len)
> +{
> + char **ptr = object_get_prop_ptr(obj, prop);
> + if (!*ptr)
> + return snprintf(dest, len, "<null>");
> + return snprintf(dest, len, "\"%s\"", *ptr);
> +}
> +
> +static void get_string(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + char **ptr = object_get_prop_ptr(obj, prop);
> +
> + if (!*ptr) {
> + char *str = (char *)"";
> + visit_type_str(v,&str, name, errp);
> + } else {
> + visit_type_str(v, ptr, name, errp);
> + }
> +}
> +
> +static void set_string(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + char **ptr = object_get_prop_ptr(obj, prop);
> + Error *local_err = NULL;
> + char *str;
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_str(v,&str, name,&local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + if (*ptr) {
> + g_free(*ptr);
> + }
> + *ptr = str;
> +}
> +
> +PropertyInfo qdev_prop_string = {
> + .name = "string",
> + .print = print_string,
> + .release = release_string,
> + .get = get_string,
> + .set = set_string,
> +};
> +
> +
> +/* --- enums --- */
> +
> +void property_get_enum(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + int *ptr = object_get_prop_ptr(obj, prop);
> +
> + visit_type_enum(v, ptr, prop->info->enum_table,
> + prop->info->name, prop->name, errp);
> +}
> +
> +void property_set_enum(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + Property *prop = opaque;
> + int *ptr = object_get_prop_ptr(obj, prop);
> +
> + if (object_is_realized(obj)) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_enum(v, ptr, prop->info->enum_table,
> + prop->info->name, prop->name, errp);
> +}
> +
> +
> +/**
> + * @object_property_add_static - add a @Property to a device.
> + *
> + * Static properties access data in a struct. The actual type of the
> + * property and the field depends on the property type.
> + */
> +void object_property_add_static(Object *obj, Property *prop,
> + Error **errp)
> +{
> + Error *local_err = NULL;
> +
> + /*
> + * TODO qdev_prop_ptr does not have getters or setters. It must
> + * go now that it can be replaced with links. The test should be
> + * removed along with it: all static properties are read/write.
> + */
> + if (!prop->info->get&& !prop->info->set) {
> + return;
> + }
> +
> + object_property_add(obj, prop->name, prop->info->name,
> + prop->info->get, prop->info->set,
> + prop->info->release,
> + prop,&local_err);
> +
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + if (prop->qtype == QTYPE_NONE) {
> + return;
> + }
> +
> + if (prop->qtype == QTYPE_QBOOL) {
> + object_property_set_bool(obj, prop->defval, prop->name,&local_err);
> + } else if (prop->info->enum_table) {
> + object_property_set_str(obj, prop->info->enum_table[prop->defval],
> + prop->name,&local_err);
> + } else if (prop->qtype == QTYPE_QINT) {
> + object_property_set_int(obj, prop->defval, prop->name,&local_err);
> + }
> + assert_no_error(local_err);
> +}
next prev parent reply other threads:[~2012-06-08 1:26 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-07 19:30 [Qemu-devel] [PATCH qom-next 0/7] QOM realize, revised Andreas Färber
2012-06-07 19:30 ` [Qemu-devel] [PATCH qom-next 1/7] qdev: Push state up to Object Andreas Färber
2012-06-08 1:19 ` Anthony Liguori
2012-06-10 15:49 ` Paolo Bonzini
2012-06-10 17:35 ` Anthony Liguori
2012-06-10 17:38 ` Andreas Färber
2012-06-11 8:25 ` Kevin Wolf
2012-06-11 13:21 ` Anthony Liguori
2012-06-11 14:38 ` Kevin Wolf
2012-06-11 21:31 ` Andreas Färber
2012-06-11 21:43 ` Andreas Färber
2012-06-11 21:48 ` Anthony Liguori
2012-06-12 0:14 ` Andreas Färber
2012-06-07 19:31 ` [Qemu-devel] [PATCH qom-next 2/7] qom: Add get_id Andreas Färber
2012-06-08 1:22 ` Anthony Liguori
2012-06-08 7:11 ` Andreas Färber
2012-06-08 7:44 ` Anthony Liguori
2012-06-08 8:17 ` Andreas Färber
2012-06-08 10:59 ` [Qemu-devel] [libvirt] " Daniel P. Berrange
2012-06-08 11:58 ` [Qemu-devel] " Eric Blake
2012-06-07 19:31 ` [Qemu-devel] [PATCH qom-next 3/7] qdev: Generalize properties to Objects Andreas Färber
2012-06-08 1:23 ` Anthony Liguori
2012-06-07 19:31 ` [Qemu-devel] [PATCH qom-next 4/7] qdev: Move bulk of qdev-properties.c to qom/object-properties.c Andreas Färber
2012-06-07 23:23 ` Paolo Bonzini
2012-06-08 1:26 ` Anthony Liguori [this message]
2012-06-07 19:31 ` [Qemu-devel] [PATCH qom-next 5/7] qom: Push static properties to Object Andreas Färber
2012-06-08 1:26 ` Anthony Liguori
2012-06-07 19:31 ` [Qemu-devel] [PATCH qom-next 6/7] qom: Add "realized" property Andreas Färber
2012-06-08 1:26 ` Anthony Liguori
2012-06-07 19:31 ` [Qemu-devel] [PATCH qom-next 7/7] qom: Add QERR_PROPERTY_SET_AFTER_REALIZE Andreas Färber
2012-06-07 19:56 ` Andreas Färber
2012-06-07 23:22 ` [Qemu-devel] [PATCH qom-next 0/7] QOM realize, revised Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FD154BE.1040407@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=afaerber@suse.de \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).