From 32fea4025bfb80f2dbc5c3ce415703af28d85f63 Mon Sep 17 00:00:00 2001 From: Anthony Liguori Date: Fri, 16 Dec 2011 14:34:46 -0600 Subject: [PATCH] qdev: integrate with QEMU Object Model (v2) This is a very shallow integration. We register a TYPE_DEVICE but only use QOM as basically a memory allocator. This will make all devices show up as QOM objects but they will all carry the TYPE_DEVICE. Signed-off-by: Anthony Liguori --- v1 -> v2 - update for new location of object.h --- hw/qdev.c | 27 +++++++++++++++++++++++++-- hw/qdev.h | 10 ++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 5a7566850a..3bc9166814 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -47,9 +47,17 @@ static BusState *qbus_find(const char *path); /* Register a new device type. */ void qdev_register(DeviceInfo *info) { + TypeInfo type_info = {}; + assert(info->size >= sizeof(DeviceState)); assert(!info->next); + type_info.name = info->name; + type_info.parent = TYPE_DEVICE; + type_info.instance_size = info->size; + + type_register_static(&type_info); + info->next = device_info_list; device_info_list = info; } @@ -93,7 +101,7 @@ static DeviceState *qdev_create_from_info(BusState *bus, DeviceInfo *info) Property *prop; assert(bus->info == info->bus_info); - dev = g_malloc0(info->size); + dev = DEVICE(object_new(info->name)); dev->info = info; dev->parent_bus = bus; qdev_prop_set_defaults(dev, dev->info->props); @@ -519,7 +527,7 @@ void qdev_free(DeviceState *dev) if (dev->ref != 0) { qerror_report(QERR_DEVICE_IN_USE, dev->id?:""); } - g_free(dev); + object_delete(OBJECT(dev)); } void qdev_machine_creation_done(void) @@ -1572,3 +1580,18 @@ void qdev_machine_init(void) qdev_get_peripheral_anon(); qdev_get_peripheral(); } + +static TypeInfo device_type_info = { + .name = TYPE_DEVICE, + .parent = TYPE_OBJECT, + .instance_size = sizeof(DeviceState), + .abstract = true, + .class_size = sizeof(DeviceClass), +}; + +static void init_qdev(void) +{ + type_register_static(&device_type_info); +} + +device_init(init_qdev); diff --git a/hw/qdev.h b/hw/qdev.h index 6b58dd8aeb..1e01a042ce 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -6,6 +6,7 @@ #include "qemu-char.h" #include "qemu-option.h" #include "qapi/qapi-visit-core.h" +#include "qemu/object.h" typedef struct Property Property; @@ -66,9 +67,18 @@ typedef struct DeviceProperty QTAILQ_ENTRY(DeviceProperty) node; } DeviceProperty; +#define TYPE_DEVICE "device" +#define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE) + +typedef struct DeviceClass { + ObjectClass parent_class; +} DeviceClass; + /* This structure should not be accessed directly. We declare it here so that it can be embedded in individual device state structures. */ struct DeviceState { + Object parent_obj; + const char *id; enum DevState state; QemuOpts *opts; -- 2.11.0