[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 04/34] qdev: Prepare "realized" property
From: |
Andreas Färber |
Subject: |
[Qemu-devel] [RFC 04/34] qdev: Prepare "realized" property |
Date: |
Mon, 26 Nov 2012 01:12:16 +0100 |
Based on earlier patches by Paolo and me, introduce the QOM realizefn at
device level only, as requested by Anthony.
For now this just wraps the qdev initfn.
Signed-off-by: Paolo Bonzini <address@hidden>
Signed-off-by: Andreas Färber <address@hidden>
Cc: Anthony Liguori <address@hidden>
---
hw/qdev-core.h | 4 +++
hw/qdev.c | 100 ++++++++++++++++++++++++++++++++++++++++++--------------
2 Dateien geändert, 80 Zeilen hinzugefügt(+), 24 Zeilen entfernt(-)
diff --git a/hw/qdev-core.h b/hw/qdev-core.h
index f0d3a5e..580a811 100644
--- a/hw/qdev-core.h
+++ b/hw/qdev-core.h
@@ -29,6 +29,8 @@ enum {
typedef int (*qdev_initfn)(DeviceState *dev);
typedef int (*qdev_event)(DeviceState *dev);
typedef void (*qdev_resetfn)(DeviceState *dev);
+typedef void (*DeviceRealize)(DeviceState *dev, Error **err);
+typedef void (*DeviceUnrealize)(DeviceState *dev, Error **err);
struct VMStateDescription;
@@ -47,6 +49,8 @@ typedef struct DeviceClass {
const struct VMStateDescription *vmsd;
/* Private to qdev / bus. */
+ DeviceRealize realize;
+ DeviceUnrealize unrealize;
qdev_initfn init;
qdev_event unplug;
qdev_event exit;
diff --git a/hw/qdev.c b/hw/qdev.c
index bce6ad5..d7b6320 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -147,37 +147,30 @@ DeviceState *qdev_try_create(BusState *bus, const char
*type)
Return 0 on success. */
int qdev_init(DeviceState *dev)
{
- DeviceClass *dc = DEVICE_GET_CLASS(dev);
- int rc;
+ Error *local_err = NULL;
assert(!dev->realized);
- rc = dc->init(dev);
- if (rc < 0) {
+ object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
+ if (local_err != NULL) {
+ error_free(local_err);
object_delete(OBJECT(dev));
- return rc;
+ return -1;
}
+ return 0;
+}
- if (!OBJECT(dev)->parent) {
- static int unattached_count = 0;
- gchar *name = g_strdup_printf("device[%d]", unattached_count++);
-
- object_property_add_child(container_get(qdev_get_machine(),
- "/unattached"),
- name, OBJECT(dev), NULL);
- g_free(name);
- }
+static void device_realize(DeviceState *dev, Error **err)
+{
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
- if (qdev_get_vmsd(dev)) {
- vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
- dev->instance_id_alias,
- dev->alias_required_for_version);
- }
- dev->realized = true;
- if (dev->hotplugged) {
- device_reset(dev);
+ if (dc->init) {
+ int rc = dc->init(dev);
+ if (rc < 0) {
+ error_setg(err, "Device initialization failed.");
+ return;
+ }
}
- return 0;
}
void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
@@ -649,6 +642,55 @@ void qdev_property_add_static(DeviceState *dev, Property
*prop,
assert_no_error(local_err);
}
+static bool device_get_realized(Object *obj, Error **err)
+{
+ DeviceState *dev = DEVICE(obj);
+ return dev->realized;
+}
+
+static void device_set_realized(Object *obj, bool value, Error **err)
+{
+ DeviceState *dev = DEVICE(obj);
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+ Error *local_err = NULL;
+
+ if (value && !dev->realized) {
+ if (dc->realize) {
+ dc->realize(dev, &local_err);
+ }
+
+ if (!obj->parent && local_err == NULL) {
+ static int unattached_count;
+ gchar *name = g_strdup_printf("device[%d]", unattached_count++);
+
+ object_property_add_child(container_get(qdev_get_machine(),
+ "/unattached"),
+ name, obj, &local_err);
+ g_free(name);
+ }
+
+ if (qdev_get_vmsd(dev) && local_err == NULL) {
+ vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
+ dev->instance_id_alias,
+ dev->alias_required_for_version);
+ }
+ if (dev->hotplugged && local_err == NULL) {
+ device_reset(dev);
+ }
+ } else if (!value && dev->realized) {
+ if (dc->unrealize) {
+ dc->unrealize(dev, &local_err);
+ }
+ }
+
+ if (local_err != NULL) {
+ error_propagate(err, local_err);
+ return;
+ }
+
+ dev->realized = value;
+}
+
static void device_initfn(Object *obj)
{
DeviceState *dev = DEVICE(obj);
@@ -663,6 +705,9 @@ static void device_initfn(Object *obj)
dev->instance_id_alias = -1;
dev->realized = false;
+ object_property_add_bool(obj, "realized",
+ device_get_realized, device_set_realized, NULL);
+
class = object_get_class(OBJECT(dev));
do {
for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
@@ -714,6 +759,12 @@ static void device_class_base_init(ObjectClass *class,
void *data)
klass->props = NULL;
}
+static void device_class_init(ObjectClass *oc, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(oc);
+ dc->realize = device_realize;
+}
+
void device_reset(DeviceState *dev)
{
DeviceClass *klass = DEVICE_GET_CLASS(dev);
@@ -734,13 +785,14 @@ Object *qdev_get_machine(void)
return dev;
}
-static TypeInfo device_type_info = {
+static const TypeInfo device_type_info = {
.name = TYPE_DEVICE,
.parent = TYPE_OBJECT,
.instance_size = sizeof(DeviceState),
.instance_init = device_initfn,
.instance_finalize = device_finalize,
.class_base_init = device_class_base_init,
+ .class_init = device_class_init,
.abstract = true,
.class_size = sizeof(DeviceClass),
};
--
1.7.10.4
- [Qemu-devel] [PATCH 01/34] qdev: Eliminate qdev_free() in favor of QOM, (continued)
- [Qemu-devel] [PATCH 01/34] qdev: Eliminate qdev_free() in favor of QOM, Andreas Färber, 2012/11/25
- [Qemu-devel] [PATCH 11/34] i8259: Fix PIC_COMMON() macro, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 03/34] qdev: Fold state enum into bool realized, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 30/34] kvm/i8254: QOM'ify some more, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 33/34] kvm/i8259: QOM'ify some more, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 34/34] i8259: Convert PICCommonState to use QOM realizefn, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 19/34] pckbd: QOM'ify, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 31/34] i8254: Convert PITCommonState to QOM realizefn, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 27/34] wdt_ib700: QOM'ify, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 16/34] ne2000-isa: QOM'ify, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 04/34] qdev: Prepare "realized" property,
Andreas Färber <=
- [Qemu-devel] [RFC 20/34] pcspk: QOM'ify, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 26/34] vmport: QOM'ify, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 25/34] vmmouse: QOM'ify, Andreas Färber, 2012/11/25
- [Qemu-devel] [RFC 28/34] isa: Use realizefn for ISADevice, Andreas Färber, 2012/11/25