From: Eduardo Habkost <ehabkost@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Daniel P. Berrange" <berrange@redhat.com>,
"John Snow" <jsnow@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Igor Mammedov" <imammedo@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: [PATCH 03/36] qdev: Move property code to qdev-properties.[ch]
Date: Thu, 29 Oct 2020 18:02:13 -0400 [thread overview]
Message-ID: <20201029220246.472693-4-ehabkost@redhat.com> (raw)
In-Reply-To: <20201029220246.472693-1-ehabkost@redhat.com>
Move everything related to Property and PropertyInfo to
qdev-properties.[ch] to make it easier to refactor that code.
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org
---
include/hw/qdev-core.h | 37 -----------
include/hw/qdev-properties.h | 38 +++++++++++
hw/core/qdev-properties.c | 120 +++++++++++++++++++++++++++++++++++
hw/core/qdev.c | 120 -----------------------------------
softmmu/qdev-monitor.c | 1 +
5 files changed, 159 insertions(+), 157 deletions(-)
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index a653295d6f..aea49355fa 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -274,43 +274,6 @@ struct BusState {
ResettableState reset;
};
-/**
- * Property:
- * @set_default: true if the default value should be set from @defval,
- * in which case @info->set_default_value must not be NULL
- * (if false then no default value is set by the property system
- * and the field retains whatever value it was given by instance_init).
- * @defval: default value for the property. This is used only if @set_default
- * is true.
- */
-struct Property {
- const char *name;
- const PropertyInfo *info;
- ptrdiff_t offset;
- uint8_t bitnr;
- bool set_default;
- union {
- int64_t i;
- uint64_t u;
- } defval;
- int arrayoffset;
- const PropertyInfo *arrayinfo;
- int arrayfieldsize;
- const char *link_type;
-};
-
-struct PropertyInfo {
- const char *name;
- const char *description;
- const QEnumLookup *enum_table;
- int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
- void (*set_default_value)(ObjectProperty *op, const Property *prop);
- void (*create)(ObjectClass *oc, Property *prop);
- ObjectPropertyAccessor *get;
- ObjectPropertyAccessor *set;
- ObjectPropertyRelease *release;
-};
-
/**
* GlobalProperty:
* @used: Set to true if property was used when initializing a device.
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 4437450065..db7ce51dd5 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -3,6 +3,44 @@
#include "hw/qdev-core.h"
+/**
+ * Property:
+ * @set_default: true if the default value should be set from @defval,
+ * in which case @info->set_default_value must not be NULL
+ * (if false then no default value is set by the property system
+ * and the field retains whatever value it was given by instance_init).
+ * @defval: default value for the property. This is used only if @set_default
+ * is true.
+ */
+struct Property {
+ const char *name;
+ const PropertyInfo *info;
+ ptrdiff_t offset;
+ uint8_t bitnr;
+ bool set_default;
+ union {
+ int64_t i;
+ uint64_t u;
+ } defval;
+ int arrayoffset;
+ const PropertyInfo *arrayinfo;
+ int arrayfieldsize;
+ const char *link_type;
+};
+
+struct PropertyInfo {
+ const char *name;
+ const char *description;
+ const QEnumLookup *enum_table;
+ int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
+ void (*set_default_value)(ObjectProperty *op, const Property *prop);
+ void (*create)(ObjectClass *oc, Property *prop);
+ ObjectPropertyAccessor *get;
+ ObjectPropertyAccessor *set;
+ ObjectPropertyRelease *release;
+};
+
+
/*** qdev-properties.c ***/
extern const PropertyInfo qdev_prop_bit;
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 509cbf155d..12a053e732 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -929,3 +929,123 @@ const PropertyInfo qdev_prop_link = {
.name = "link",
.create = create_link_property,
};
+
+void qdev_property_add_static(DeviceState *dev, Property *prop)
+{
+ Object *obj = OBJECT(dev);
+ ObjectProperty *op;
+
+ assert(!prop->info->create);
+
+ op = object_property_add(obj, prop->name, prop->info->name,
+ prop->info->get, prop->info->set,
+ prop->info->release,
+ prop);
+
+ object_property_set_description(obj, prop->name,
+ prop->info->description);
+
+ if (prop->set_default) {
+ prop->info->set_default_value(op, prop);
+ if (op->init) {
+ op->init(obj, op);
+ }
+ }
+}
+
+static void qdev_class_add_property(DeviceClass *klass, Property *prop)
+{
+ ObjectClass *oc = OBJECT_CLASS(klass);
+
+ if (prop->info->create) {
+ prop->info->create(oc, prop);
+ } else {
+ ObjectProperty *op;
+
+ op = object_class_property_add(oc,
+ prop->name, prop->info->name,
+ prop->info->get, prop->info->set,
+ prop->info->release,
+ prop);
+ if (prop->set_default) {
+ prop->info->set_default_value(op, prop);
+ }
+ }
+ object_class_property_set_description(oc, prop->name,
+ prop->info->description);
+}
+
+/**
+ * Legacy property handling
+ */
+
+static void qdev_get_legacy_property(Object *obj, Visitor *v,
+ const char *name, void *opaque,
+ Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+
+ char buffer[1024];
+ char *ptr = buffer;
+
+ prop->info->print(dev, prop, buffer, sizeof(buffer));
+ visit_type_str(v, name, &ptr, errp);
+}
+
+/**
+ * qdev_class_add_legacy_property:
+ * @dev: Device to add the property to.
+ * @prop: The qdev property definition.
+ *
+ * Add a legacy QOM property to @dev for qdev property @prop.
+ *
+ * Legacy properties are string versions of QOM properties. The format of
+ * the string depends on the property type. Legacy properties are only
+ * needed for "info qtree".
+ *
+ * Do not use this in new code! QOM Properties added through this interface
+ * will be given names in the "legacy" namespace.
+ */
+static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
+{
+ g_autofree char *name = NULL;
+
+ /* Register pointer properties as legacy properties */
+ if (!prop->info->print && prop->info->get) {
+ return;
+ }
+
+ name = g_strdup_printf("legacy-%s", prop->name);
+ object_class_property_add(OBJECT_CLASS(dc), name, "str",
+ prop->info->print ? qdev_get_legacy_property : prop->info->get,
+ NULL, NULL, prop);
+}
+
+void device_class_set_props(DeviceClass *dc, Property *props)
+{
+ Property *prop;
+
+ dc->props_ = props;
+ for (prop = props; prop && prop->name; prop++) {
+ qdev_class_add_legacy_property(dc, prop);
+ qdev_class_add_property(dc, prop);
+ }
+}
+
+void qdev_alias_all_properties(DeviceState *target, Object *source)
+{
+ ObjectClass *class;
+ Property *prop;
+
+ class = object_get_class(OBJECT(target));
+ do {
+ DeviceClass *dc = DEVICE_CLASS(class);
+
+ for (prop = dc->props_; prop && prop->name; prop++) {
+ object_property_add_alias(source, prop->name,
+ OBJECT(target), prop->name);
+ }
+ class = object_class_get_parent(class);
+ } while (class != object_class_by_name(TYPE_DEVICE));
+}
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index fc4daa36fa..3c43107f71 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -714,115 +714,6 @@ char *qdev_get_dev_path(DeviceState *dev)
return NULL;
}
-/**
- * Legacy property handling
- */
-
-static void qdev_get_legacy_property(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
-
- char buffer[1024];
- char *ptr = buffer;
-
- prop->info->print(dev, prop, buffer, sizeof(buffer));
- visit_type_str(v, name, &ptr, errp);
-}
-
-/**
- * qdev_class_add_legacy_property:
- * @dev: Device to add the property to.
- * @prop: The qdev property definition.
- *
- * Add a legacy QOM property to @dev for qdev property @prop.
- *
- * Legacy properties are string versions of QOM properties. The format of
- * the string depends on the property type. Legacy properties are only
- * needed for "info qtree".
- *
- * Do not use this in new code! QOM Properties added through this interface
- * will be given names in the "legacy" namespace.
- */
-static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
-{
- g_autofree char *name = NULL;
-
- /* Register pointer properties as legacy properties */
- if (!prop->info->print && prop->info->get) {
- return;
- }
-
- name = g_strdup_printf("legacy-%s", prop->name);
- object_class_property_add(OBJECT_CLASS(dc), name, "str",
- prop->info->print ? qdev_get_legacy_property : prop->info->get,
- NULL, NULL, prop);
-}
-
-void qdev_property_add_static(DeviceState *dev, Property *prop)
-{
- Object *obj = OBJECT(dev);
- ObjectProperty *op;
-
- assert(!prop->info->create);
-
- op = object_property_add(obj, prop->name, prop->info->name,
- prop->info->get, prop->info->set,
- prop->info->release,
- prop);
-
- object_property_set_description(obj, prop->name,
- prop->info->description);
-
- if (prop->set_default) {
- prop->info->set_default_value(op, prop);
- if (op->init) {
- op->init(obj, op);
- }
- }
-}
-
-static void qdev_class_add_property(DeviceClass *klass, Property *prop)
-{
- ObjectClass *oc = OBJECT_CLASS(klass);
-
- if (prop->info->create) {
- prop->info->create(oc, prop);
- } else {
- ObjectProperty *op;
-
- op = object_class_property_add(oc,
- prop->name, prop->info->name,
- prop->info->get, prop->info->set,
- prop->info->release,
- prop);
- if (prop->set_default) {
- prop->info->set_default_value(op, prop);
- }
- }
- object_class_property_set_description(oc, prop->name,
- prop->info->description);
-}
-
-void qdev_alias_all_properties(DeviceState *target, Object *source)
-{
- ObjectClass *class;
- Property *prop;
-
- class = object_get_class(OBJECT(target));
- do {
- DeviceClass *dc = DEVICE_CLASS(class);
-
- for (prop = dc->props_; prop && prop->name; prop++) {
- object_property_add_alias(source, prop->name,
- OBJECT(target), prop->name);
- }
- class = object_class_get_parent(class);
- } while (class != object_class_by_name(TYPE_DEVICE));
-}
-
static bool device_get_realized(Object *obj, Error **errp)
{
DeviceState *dev = DEVICE(obj);
@@ -1217,17 +1108,6 @@ static void device_class_init(ObjectClass *class, void *data)
offsetof(DeviceState, parent_bus), NULL, 0);
}
-void device_class_set_props(DeviceClass *dc, Property *props)
-{
- Property *prop;
-
- dc->props_ = props;
- for (prop = props; prop && prop->name; prop++) {
- qdev_class_add_legacy_property(dc, prop);
- qdev_class_add_property(dc, prop);
- }
-}
-
void device_class_set_parent_reset(DeviceClass *dc,
DeviceReset dev_reset,
DeviceReset *parent_reset)
diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c
index bcfb90a08f..79164e4a3f 100644
--- a/softmmu/qdev-monitor.c
+++ b/softmmu/qdev-monitor.c
@@ -38,6 +38,7 @@
#include "migration/misc.h"
#include "migration/migration.h"
#include "qemu/cutils.h"
+#include "hw/qdev-properties.h"
#include "hw/clock.h"
/*
--
2.28.0
next prev parent reply other threads:[~2020-10-29 22:05 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-29 22:02 [PATCH 00/36] Make qdev static property API usable by any QOM type Eduardo Habkost
2020-10-29 22:02 ` [PATCH 01/36] cs4231: Get rid of empty property array Eduardo Habkost
2020-10-30 7:42 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 02/36] cpu: Move cpu_common_props to hw/core/cpu.c Eduardo Habkost
2020-10-30 7:42 ` Marc-André Lureau
2020-10-29 22:02 ` Eduardo Habkost [this message]
2020-10-30 7:42 ` [PATCH 03/36] qdev: Move property code to qdev-properties.[ch] Marc-André Lureau
2020-10-29 22:02 ` [PATCH 04/36] qdev: Check dev->realized at set_size() Eduardo Habkost
2020-10-30 7:11 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 05/36] sparc: Check dev->realized at sparc_set_nwindows() Eduardo Habkost
2020-10-30 7:43 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 06/36] qdev: Don't use dev->id on set_size32() error message Eduardo Habkost
2020-10-30 7:42 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 07/36] qdev: Make PropertyInfo.print method get Object* argument Eduardo Habkost
2020-10-30 7:43 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 08/36] qdev: Make bit_prop_set() " Eduardo Habkost
2020-10-30 7:45 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 09/36] qdev: Make qdev_get_prop_ptr() get Object* arg Eduardo Habkost
2020-10-29 22:46 ` Stefan Berger
2020-10-30 7:29 ` Marc-André Lureau
2020-10-30 7:34 ` Marc-André Lureau
2020-10-30 11:35 ` --enable-xen on gitlab CI? (was Re: [PATCH 09/36] qdev: Make qdev_get_prop_ptr() get Object* arg) Eduardo Habkost
2020-10-30 17:13 ` Paolo Bonzini
2020-10-31 10:25 ` Thomas Huth
2020-11-08 17:45 ` Philippe Mathieu-Daudé
2020-10-29 22:02 ` [PATCH 10/36] qdev: Make qdev_find_global_prop() get Object* argument Eduardo Habkost
2020-10-30 7:45 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 11/36] qdev: Make check_prop_still_unset() " Eduardo Habkost
2020-10-30 7:53 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 12/36] qdev: Make error_set_from_qdev_prop_error() " Eduardo Habkost
2020-10-30 8:00 ` Marc-André Lureau
2020-10-30 11:16 ` Eduardo Habkost
2020-10-29 22:02 ` [PATCH 13/36] qdev: Wrap getters and setters in separate helpers Eduardo Habkost
2020-10-30 8:06 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 14/36] qdev: Move dev->realized check to qdev_property_set() Eduardo Habkost
2020-10-29 22:43 ` Stefan Berger
2020-10-30 8:05 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 15/36] qdev: Make PropertyInfo.create return ObjectProperty* Eduardo Habkost
2020-10-30 16:52 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 16/36] qdev: Make qdev_class_add_property() more flexible Eduardo Habkost
2020-10-30 9:45 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 17/36] qdev: Separate generic and device-specific property registration Eduardo Habkost
2020-10-30 9:56 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 18/36] qdev: Avoid unnecessary DeviceState* variable at set_prop_arraylen() Eduardo Habkost
2020-10-30 9:59 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 19/36] qdev: Move array property creation/registration to separate functions Eduardo Habkost
2020-10-30 10:03 ` Marc-André Lureau
2020-10-30 10:10 ` Marc-André Lureau
2020-10-30 10:12 ` Daniel P. Berrangé
2020-10-30 11:20 ` Eduardo Habkost
2020-10-29 22:02 ` [PATCH 20/36] qdev: Reuse object_property_add_static() when adding array elements Eduardo Habkost
2020-10-30 11:37 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 21/36] qom: Add allow_set callback to ObjectProperty Eduardo Habkost
2020-10-30 16:43 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 22/36] qdev: Make qdev_prop_allow_set() a property allow_set callback Eduardo Habkost
2020-10-30 16:42 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 23/36] qdev: Make qdev_propinfo_get_uint16() static Eduardo Habkost
2020-10-30 16:51 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 24/36] qdev: Rename qdev_propinfo_* to object_propinfo_* Eduardo Habkost
2020-10-30 16:50 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 25/36] qdev: Rename qdev_get_prop_ptr() to object_static_prop_ptr() Eduardo Habkost
2020-10-29 22:41 ` Stefan Berger
2020-10-29 22:02 ` [PATCH 26/36] qdev: Move softmmu properties to qdev-properties-system.h Eduardo Habkost
2020-10-30 16:51 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 27/36] qdev: Reuse DEFINE_PROP in all DEFINE_PROP_* macros Eduardo Habkost
2020-10-30 16:53 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 28/36] qdev: Move core static property code to QOM Eduardo Habkost
2020-10-30 16:59 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 29/36] qdev: Move qdev_prop_tpm declaration to tpm_prop.h Eduardo Habkost
2020-10-29 22:40 ` Stefan Berger
2020-10-30 17:02 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 30/36] qdev: Rename qdev_prop_* to prop_info_* Eduardo Habkost
2020-10-30 17:02 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 31/36] qdev: Stop using error_set_from_qdev_prop_error() for UUID property Eduardo Habkost
2020-10-30 17:06 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 32/36] qdev: Move base property types to qom/property-types.c Eduardo Habkost
2020-10-31 7:38 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 33/36] tests: Use static properties at check-qom-proplist test case Eduardo Habkost
2020-10-31 7:53 ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 34/36] machine: Use DEFINE_PROP_STRING for string properties Eduardo Habkost
2020-10-30 17:10 ` Paolo Bonzini
2020-10-30 20:03 ` Eduardo Habkost
2020-10-30 20:41 ` Paolo Bonzini
2020-10-30 21:00 ` Eduardo Habkost
2020-10-29 22:02 ` [PATCH 35/36] machine: Use DEFINE_PROP_BOOL for boolean properties Eduardo Habkost
2020-10-29 22:02 ` [PATCH 36/36] qom: Include static property API reference in documentation Eduardo Habkost
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=20201029220246.472693-4-ehabkost@redhat.com \
--to=ehabkost@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=imammedo@redhat.com \
--cc=jsnow@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@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).