@@ -246,26 +246,6 @@ struct PropertyInfo {
ObjectPropertyRelease *release;
};
-/**
- * GlobalProperty:
- * @user_provided: Set to true if property comes from user-provided config
- * (command-line or config file).
- * @used: Set to true if property was used when initializing a device.
- * @errp: Error destination, used like first argument of error_setg()
- * in case property setting fails later. If @errp is NULL, we
- * print warnings instead of ignoring errors silently. For
- * hotplugged devices, errp is always ignored and warnings are
- * printed instead.
- */
-typedef struct GlobalProperty {
- const char *driver;
- const char *property;
- const char *value;
- bool user_provided;
- bool used;
- Error **errp;
-} GlobalProperty;
-
/*** Board API. This should go away once we have a machine config file. ***/
DeviceState *qdev_create(BusState *bus, const char *name);
@@ -4,6 +4,7 @@
#include "qapi/qapi-types-block.h"
#include "qapi/qapi-types-misc.h"
#include "hw/qdev-core.h"
+#include "qom/globals.h"
/*** qdev-properties.c ***/
@@ -248,9 +249,6 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
/* FIXME: Remove opaque pointer properties. */
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
-void qdev_prop_register_global(GlobalProperty *prop);
-int qdev_prop_check_globals(void);
-void qdev_prop_set_globals(DeviceState *dev);
void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
Property *prop, const char *value);
new file mode 100644
@@ -0,0 +1,32 @@
+#ifndef QOM_GLOBALS
+#define QOM_GLOBALS
+
+#include "qom/object.h"
+
+/**
+ * GlobalProperty:
+ * @user_provided: Set to true if property comes from user-provided config
+ * (command-line or config file).
+ * @used: Set to true if property was used when initializing a device.
+ * @errp: Error destination, used like first argument of error_setg()
+ * in case property setting fails later. If @errp is NULL, we
+ * print warnings instead of ignoring errors silently. For
+ * hotplugged devices, errp is always ignored and warnings are
+ * printed instead.
+ */
+typedef struct GlobalProperty {
+ const char *driver;
+ const char *property;
+ const char *value;
+ bool user_provided;
+ bool used;
+ Error **errp;
+} GlobalProperty;
+
+void object_property_register_global(GlobalProperty *prop);
+
+void object_property_set_globals(Object *obj);
+
+int object_property_check_globals(void);
+
+#endif
@@ -127,7 +127,7 @@ void accel_register_compat_props(AccelState *accel)
for (; prop && prop->driver; prop++) {
/* Any compat_props must never cause error */
prop->errp = &error_abort;
- qdev_prop_register_global(prop);
+ object_property_register_global(prop);
}
}
@@ -855,7 +855,7 @@ void machine_register_compat_props(MachineState *machine)
p = g_array_index(mc->compat_props, GlobalProperty *, i);
/* Machine compat_props must never cause errors: */
p->errp = &error_abort;
- qdev_prop_register_global(p);
+ object_property_register_global(p);
}
}
@@ -1173,73 +1173,6 @@ void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
*ptr = value;
}
-static GList *global_props;
-
-void qdev_prop_register_global(GlobalProperty *prop)
-{
- global_props = g_list_append(global_props, prop);
-}
-
-int qdev_prop_check_globals(void)
-{
- GList *l;
- int ret = 0;
-
- for (l = global_props; l; l = l->next) {
- GlobalProperty *prop = l->data;
- ObjectClass *oc;
- DeviceClass *dc;
- if (prop->used) {
- continue;
- }
- if (!prop->user_provided) {
- continue;
- }
- oc = object_class_by_name(prop->driver);
- oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
- if (!oc) {
- warn_report("global %s.%s has invalid class name",
- prop->driver, prop->property);
- ret = 1;
- continue;
- }
- dc = DEVICE_CLASS(oc);
- if (!dc->hotpluggable && !prop->used) {
- warn_report("global %s.%s=%s not used",
- prop->driver, prop->property, prop->value);
- ret = 1;
- continue;
- }
- }
- return ret;
-}
-
-void qdev_prop_set_globals(DeviceState *dev)
-{
- GList *l;
-
- for (l = global_props; l; l = l->next) {
- GlobalProperty *prop = l->data;
- Error *err = NULL;
-
- if (object_dynamic_cast(OBJECT(dev), prop->driver) == NULL) {
- continue;
- }
- prop->used = true;
- object_property_parse(OBJECT(dev), prop->value, prop->property, &err);
- if (err != NULL) {
- error_prepend(&err, "can't apply global %s.%s=%s: ",
- prop->driver, prop->property, prop->value);
- if (!dev->hotplugged && prop->errp) {
- error_propagate(prop->errp, err);
- } else {
- assert(prop->user_provided);
- warn_report_err(err);
- }
- }
- }
-}
-
/* --- 64bit unsigned int 'size' type --- */
static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
@@ -976,7 +976,7 @@ static void device_initfn(Object *obj)
static void device_post_init(Object *obj)
{
- qdev_prop_set_globals(DEVICE(obj));
+ object_property_set_globals(obj);
}
/* Unlink device from bus and free the structure. */
@@ -314,7 +314,7 @@ static void cpu_common_parse_features(const char *typename, char *features,
prop->property = g_strdup(featurestr);
prop->value = g_strdup(val);
prop->errp = &error_fatal;
- qdev_prop_register_global(prop);
+ object_property_register_global(prop);
} else {
error_setg(errp, "Expected key=value format, found %s.",
featurestr);
new file mode 100644
@@ -0,0 +1,75 @@
+#include "qemu/osdep.h"
+
+#include "hw/qdev.h"
+#include "qapi/error.h"
+#include "qemu/error-report.h"
+#include "qom/globals.h"
+#include "qom/object_interfaces.h"
+
+static GList *global_props;
+
+void object_property_register_global(GlobalProperty *prop)
+{
+ global_props = g_list_append(global_props, prop);
+}
+
+void object_property_set_globals(Object *obj)
+{
+ DeviceState *dev = DEVICE(obj);
+ GList *l;
+
+ for (l = global_props; l; l = l->next) {
+ GlobalProperty *prop = l->data;
+ Error *err = NULL;
+
+ if (object_dynamic_cast(OBJECT(dev), prop->driver) == NULL) {
+ continue;
+ }
+ prop->used = true;
+ object_property_parse(OBJECT(dev), prop->value, prop->property, &err);
+ if (err != NULL) {
+ error_prepend(&err, "can't apply global %s.%s=%s: ",
+ prop->driver, prop->property, prop->value);
+ if (!dev->hotplugged && prop->errp) {
+ error_propagate(prop->errp, err);
+ } else {
+ assert(prop->user_provided);
+ warn_report_err(err);
+ }
+ }
+ }
+}
+
+int object_property_check_globals(void)
+{
+ GList *l;
+ int ret = 0;
+
+ for (l = global_props; l; l = l->next) {
+ GlobalProperty *prop = l->data;
+ ObjectClass *oc;
+ DeviceClass *dc;
+ if (prop->used) {
+ continue;
+ }
+ if (!prop->user_provided) {
+ continue;
+ }
+ oc = object_class_by_name(prop->driver);
+ oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
+ if (!oc) {
+ warn_report("global %s.%s has invalid class name",
+ prop->driver, prop->property);
+ ret = 1;
+ continue;
+ }
+ dc = DEVICE_CLASS(oc);
+ if (!dc->hotpluggable && !prop->used) {
+ warn_report("global %s.%s=%s not used",
+ prop->driver, prop->property, prop->value);
+ ret = 1;
+ continue;
+ }
+ }
+ return ret;
+}
@@ -3414,7 +3414,7 @@ static void x86_cpu_parse_featurestr(const char *typename, char *features,
prop->property = g_strdup(name);
prop->value = g_strdup(val);
prop->errp = &error_fatal;
- qdev_prop_register_global(prop);
+ object_property_register_global(prop);
}
if (ambiguous) {
@@ -112,7 +112,7 @@ cpu_add_feat_as_prop(const char *typename, const char *name, const char *val)
prop->property = g_strdup(name);
prop->value = g_strdup(val);
prop->errp = &error_fatal;
- qdev_prop_register_global(prop);
+ object_property_register_global(prop);
}
/* Parse "+feature,-feature,feature=foo" CPU feature string */
@@ -94,7 +94,7 @@ static void register_global_list(GlobalProperty *props)
int i;
for (i = 0; props[i].driver != NULL; i++) {
- qdev_prop_register_global(props + i);
+ object_property_register_global(props + i);
}
}
@@ -233,7 +233,7 @@ static void test_dynamic_globalprop_subprocess(void)
g_assert_cmpuint(mt->prop1, ==, 101);
g_assert_cmpuint(mt->prop2, ==, 102);
- all_used = qdev_prop_check_globals();
+ all_used = object_property_check_globals();
g_assert_cmpuint(all_used, ==, 1);
g_assert(props[0].used);
g_assert(props[1].used);
@@ -278,7 +278,7 @@ static void test_dynamic_globalprop_nouser_subprocess(void)
g_assert_cmpuint(mt->prop1, ==, 101);
g_assert_cmpuint(mt->prop2, ==, 102);
- all_used = qdev_prop_check_globals();
+ all_used = object_property_check_globals();
g_assert_cmpuint(all_used, ==, 0);
g_assert(props[0].used);
g_assert(props[1].used);
@@ -903,7 +903,7 @@ static void configure_rtc(QemuOpts *opts)
.value = "slew",
};
- qdev_prop_register_global(&slew_lost_ticks);
+ object_property_register_global(&slew_lost_ticks);
} else if (!strcmp(value, "none")) {
/* discard is default */
} else {
@@ -2872,7 +2872,7 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
g->value = qemu_opt_get(opts, "value");
g->user_provided = true;
g->errp = &error_fatal;
- qdev_prop_register_global(g);
+ object_property_register_global(g);
return 0;
}
@@ -3564,7 +3564,7 @@ int main(int argc, char **argv, char **envp)
.value = "slew",
};
- qdev_prop_register_global(&slew_lost_ticks);
+ object_property_register_global(&slew_lost_ticks);
warn_report("This option is deprecated, "
"use '-rtc driftfix=slew' instead.");
break;
@@ -4623,7 +4623,7 @@ int main(int argc, char **argv, char **envp)
}
}
- qdev_prop_check_globals();
+ object_property_check_globals();
if (vmstate_dump_file) {
/* dump and exit */
dump_vmstate_json_to_file(vmstate_dump_file);
@@ -1,4 +1,4 @@
qom-obj-y = object.o container.o qom-qobject.o
-qom-obj-y += object_interfaces.o
+qom-obj-y += object_interfaces.o globals.o
common-obj-y = cpu.o
Move the global properties handling to QOM. For now, this is just a simple moving & renaming and the globals are only applied to TYPE_DEVICE. The following patches will generalize the global handling to other object types. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- include/hw/qdev-core.h | 20 --------- include/hw/qdev-properties.h | 4 +- include/qom/globals.h | 32 +++++++++++++++ accel/accel.c | 2 +- hw/core/machine.c | 2 +- hw/core/qdev-properties.c | 67 ------------------------------ hw/core/qdev.c | 2 +- qom/cpu.c | 2 +- qom/globals.c | 75 ++++++++++++++++++++++++++++++++++ target/i386/cpu.c | 2 +- target/sparc/cpu.c | 2 +- tests/test-qdev-global-props.c | 6 +-- vl.c | 8 ++-- qom/Makefile.objs | 2 +- 14 files changed, 122 insertions(+), 104 deletions(-) create mode 100644 include/qom/globals.h create mode 100644 qom/globals.c