[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 03/12] qdev: separate core from the code used on
From: |
Anthony Liguori |
Subject: |
Re: [Qemu-devel] [PATCH 03/12] qdev: separate core from the code used only by qemu-system-* |
Date: |
Wed, 17 Oct 2012 13:00:55 -0500 |
User-agent: |
Notmuch/0.13.2+93~ged93d79 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-pc-linux-gnu) |
Igor Mammedov <address@hidden> writes:
> From: Eduardo Habkost <address@hidden>
>
> This change should help on two things:
> - Allowing DeviceState to be used by *-user;
> - Writing qdev unit tests without pulling too many dependencies.
>
> Note that there are two parts that depend on code compiled only on
> qemu-system-*, but are still inside qdev.c:
> - vmstate handling
> - reset function registration.
>
> Those two parts will be handled later, by moving that code to
> qdev-system.c but keeping weak symbols for *-user.
>
> Signed-off-by: Eduardo Habkost <address@hidden>
> Signed-off-by: Igor Mammedov <address@hidden>
> ---
> [imammedo: keep qdev_get_child_bus() in hw/qdev.c]
> [imammedo: put qdev_set_nic_properties() in hw/qdev-properties-system.c]
> ---
> hw/Makefile.objs | 1 +
> hw/qdev-properties-system.c | 340
> ++++++++++++++++++++++++++++++++++++++++++++
> hw/qdev-properties.c | 320 +----------------------------------------
> hw/qdev-properties.h | 1 +
> hw/qdev-system.c | 68 +++++++++
> hw/qdev.c | 80 -----------
> 6 files changed, 411 insertions(+), 399 deletions(-)
> create mode 100644 hw/qdev-properties-system.c
> create mode 100644 hw/qdev-system.c
>
> diff --git a/hw/Makefile.objs b/hw/Makefile.objs
> index 854faa9..16f23c0 100644
> --- a/hw/Makefile.objs
> +++ b/hw/Makefile.objs
> @@ -181,6 +181,7 @@ common-obj-y += bt.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o
> common-obj-y += bt-hci-csr.o
> common-obj-y += msmouse.o ps2.o
> common-obj-y += qdev.o qdev-properties.o qdev-monitor.o
> +common-obj-y += qdev-system.o qdev-properties-system.o
> common-obj-$(CONFIG_BRLAPI) += baum.o
>
> # xen backend driver support
> diff --git a/hw/qdev-properties-system.c b/hw/qdev-properties-system.c
> new file mode 100644
> index 0000000..e3a21db
> --- /dev/null
> +++ b/hw/qdev-properties-system.c
> @@ -0,0 +1,340 @@
New files should carry copyright/licenses.
I don't really understand the split here and the 'system' suffix really
doesn't explain it for me. Could you at least add a comment to each of
these files explaining what belongs in them?
Regards,
Anthony Liguori
> +#include "net.h"
> +#include "qdev.h"
> +#include "qerror.h"
> +#include "blockdev.h"
> +#include "hw/block-common.h"
> +#include "net/hub.h"
> +#include "qapi/qapi-visit-core.h"
> +
> +static void get_pointer(Object *obj, Visitor *v, Property *prop,
> + const char *(*print)(void *ptr),
> + const char *name, Error **errp)
> +{
> + DeviceState *dev = DEVICE(obj);
> + void **ptr = qdev_get_prop_ptr(dev, prop);
> + char *p;
> +
> + p = (char *) (*ptr ? print(*ptr) : "");
> + visit_type_str(v, &p, name, errp);
> +}
> +
> +static void set_pointer(Object *obj, Visitor *v, Property *prop,
> + int (*parse)(DeviceState *dev, const char *str,
> + void **ptr),
> + const char *name, Error **errp)
> +{
> + DeviceState *dev = DEVICE(obj);
> + Error *local_err = NULL;
> + void **ptr = qdev_get_prop_ptr(dev, prop);
> + char *str;
> + int ret;
> +
> + if (dev->state != DEV_STATE_CREATED) {
> + 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 (!*str) {
> + g_free(str);
> + *ptr = NULL;
> + return;
> + }
> + ret = parse(dev, str, ptr);
> + error_set_from_qdev_prop_error(errp, ret, dev, prop, str);
> + g_free(str);
> +}
> +
> +/* --- drive --- */
> +
> +static int parse_drive(DeviceState *dev, const char *str, void **ptr)
> +{
> + BlockDriverState *bs;
> +
> + bs = bdrv_find(str);
> + if (bs == NULL)
> + return -ENOENT;
> + if (bdrv_attach_dev(bs, dev) < 0)
> + return -EEXIST;
> + *ptr = bs;
> + return 0;
> +}
> +
> +static void release_drive(Object *obj, const char *name, void *opaque)
> +{
> + DeviceState *dev = DEVICE(obj);
> + Property *prop = opaque;
> + BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
> +
> + if (*ptr) {
> + bdrv_detach_dev(*ptr, dev);
> + blockdev_auto_del(*ptr);
> + }
> +}
> +
> +static const char *print_drive(void *ptr)
> +{
> + return bdrv_get_device_name(ptr);
> +}
> +
> +static void get_drive(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + get_pointer(obj, v, opaque, print_drive, name, errp);
> +}
> +
> +static void set_drive(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + set_pointer(obj, v, opaque, parse_drive, name, errp);
> +}
> +
> +PropertyInfo qdev_prop_drive = {
> + .name = "drive",
> + .get = get_drive,
> + .set = set_drive,
> + .release = release_drive,
> +};
> +
> +/* --- character device --- */
> +
> +static int parse_chr(DeviceState *dev, const char *str, void **ptr)
> +{
> + CharDriverState *chr = qemu_chr_find(str);
> + if (chr == NULL) {
> + return -ENOENT;
> + }
> + if (chr->avail_connections < 1) {
> + return -EEXIST;
> + }
> + *ptr = chr;
> + --chr->avail_connections;
> + return 0;
> +}
> +
> +static void release_chr(Object *obj, const char *name, void *opaque)
> +{
> + DeviceState *dev = DEVICE(obj);
> + Property *prop = opaque;
> + CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
> +
> + if (*ptr) {
> + qemu_chr_add_handlers(*ptr, NULL, NULL, NULL, NULL);
> + }
> +}
> +
> +
> +static const char *print_chr(void *ptr)
> +{
> + CharDriverState *chr = ptr;
> +
> + return chr->label ? chr->label : "";
> +}
> +
> +static void get_chr(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + get_pointer(obj, v, opaque, print_chr, name, errp);
> +}
> +
> +static void set_chr(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + set_pointer(obj, v, opaque, parse_chr, name, errp);
> +}
> +
> +PropertyInfo qdev_prop_chr = {
> + .name = "chr",
> + .get = get_chr,
> + .set = set_chr,
> + .release = release_chr,
> +};
> +
> +/* --- netdev device --- */
> +
> +static int parse_netdev(DeviceState *dev, const char *str, void **ptr)
> +{
> + NetClientState *netdev = qemu_find_netdev(str);
> +
> + if (netdev == NULL) {
> + return -ENOENT;
> + }
> + if (netdev->peer) {
> + return -EEXIST;
> + }
> + *ptr = netdev;
> + return 0;
> +}
> +
> +static const char *print_netdev(void *ptr)
> +{
> + NetClientState *netdev = ptr;
> +
> + return netdev->name ? netdev->name : "";
> +}
> +
> +static void get_netdev(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + get_pointer(obj, v, opaque, print_netdev, name, errp);
> +}
> +
> +static void set_netdev(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + set_pointer(obj, v, opaque, parse_netdev, name, errp);
> +}
> +
> +PropertyInfo qdev_prop_netdev = {
> + .name = "netdev",
> + .get = get_netdev,
> + .set = set_netdev,
> +};
> +
> +void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
> +{
> + qdev_prop_set_macaddr(dev, "mac", nd->macaddr.a);
> + if (nd->netdev)
> + qdev_prop_set_netdev(dev, "netdev", nd->netdev);
> + if (nd->nvectors != DEV_NVECTORS_UNSPECIFIED &&
> + object_property_find(OBJECT(dev), "vectors", NULL)) {
> + qdev_prop_set_uint32(dev, "vectors", nd->nvectors);
> + }
> + nd->instantiated = 1;
> +}
> +
> +/* --- vlan --- */
> +
> +static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t
> len)
> +{
> + NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
> +
> + if (*ptr) {
> + int id;
> + if (!net_hub_id_for_client(*ptr, &id)) {
> + return snprintf(dest, len, "%d", id);
> + }
> + }
> +
> + return snprintf(dest, len, "<null>");
> +}
> +
> +static void get_vlan(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + DeviceState *dev = DEVICE(obj);
> + Property *prop = opaque;
> + NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
> + int32_t id = -1;
> +
> + if (*ptr) {
> + int hub_id;
> + if (!net_hub_id_for_client(*ptr, &hub_id)) {
> + id = hub_id;
> + }
> + }
> +
> + visit_type_int32(v, &id, name, errp);
> +}
> +
> +static void set_vlan(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + DeviceState *dev = DEVICE(obj);
> + Property *prop = opaque;
> + NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
> + Error *local_err = NULL;
> + int32_t id;
> + NetClientState *hubport;
> +
> + if (dev->state != DEV_STATE_CREATED) {
> + error_set(errp, QERR_PERMISSION_DENIED);
> + return;
> + }
> +
> + visit_type_int32(v, &id, name, &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + if (id == -1) {
> + *ptr = NULL;
> + return;
> + }
> +
> + hubport = net_hub_port_find(id);
> + if (!hubport) {
> + error_set(errp, QERR_INVALID_PARAMETER_VALUE,
> + name, prop->info->name);
> + return;
> + }
> + *ptr = hubport;
> +}
> +
> +PropertyInfo qdev_prop_vlan = {
> + .name = "vlan",
> + .print = print_vlan,
> + .get = get_vlan,
> + .set = set_vlan,
> +};
> +
> +
> +int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState
> *value)
> +{
> + Error *errp = NULL;
> + const char *bdrv_name = value ? bdrv_get_device_name(value) : "";
> + object_property_set_str(OBJECT(dev), bdrv_name,
> + name, &errp);
> + if (errp) {
> + qerror_report_err(errp);
> + error_free(errp);
> + return -1;
> + }
> + return 0;
> +}
> +
> +void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name,
> BlockDriverState *value)
> +{
> + if (qdev_prop_set_drive(dev, name, value) < 0) {
> + exit(1);
> + }
> +}
> +
> +void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState
> *value)
> +{
> + Error *errp = NULL;
> + assert(!value || value->label);
> + object_property_set_str(OBJECT(dev),
> + value ? value->label : "", name, &errp);
> + assert_no_error(errp);
> +}
> +
> +void qdev_prop_set_netdev(DeviceState *dev, const char *name, NetClientState
> *value)
> +{
> + Error *errp = NULL;
> + assert(!value || value->name);
> + object_property_set_str(OBJECT(dev),
> + value ? value->name : "", name, &errp);
> + assert_no_error(errp);
> +}
> +
> +static int qdev_add_one_global(QemuOpts *opts, void *opaque)
> +{
> + GlobalProperty *g;
> +
> + g = g_malloc0(sizeof(*g));
> + g->driver = qemu_opt_get(opts, "driver");
> + g->property = qemu_opt_get(opts, "property");
> + g->value = qemu_opt_get(opts, "value");
> + qdev_prop_register_global(g);
> + return 0;
> +}
> +
> +void qemu_add_globals(void)
> +{
> + qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global, NULL,
> 0);
> +}
> diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
> index 81d901c..917d986 100644
> --- a/hw/qdev-properties.c
> +++ b/hw/qdev-properties.c
> @@ -13,49 +13,6 @@ void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
> return ptr;
> }
>
> -static void get_pointer(Object *obj, Visitor *v, Property *prop,
> - const char *(*print)(void *ptr),
> - const char *name, Error **errp)
> -{
> - DeviceState *dev = DEVICE(obj);
> - void **ptr = qdev_get_prop_ptr(dev, prop);
> - char *p;
> -
> - p = (char *) (*ptr ? print(*ptr) : "");
> - visit_type_str(v, &p, name, errp);
> -}
> -
> -static void set_pointer(Object *obj, Visitor *v, Property *prop,
> - int (*parse)(DeviceState *dev, const char *str,
> - void **ptr),
> - const char *name, Error **errp)
> -{
> - DeviceState *dev = DEVICE(obj);
> - Error *local_err = NULL;
> - void **ptr = qdev_get_prop_ptr(dev, prop);
> - char *str;
> - int ret;
> -
> - if (dev->state != DEV_STATE_CREATED) {
> - 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 (!*str) {
> - g_free(str);
> - *ptr = NULL;
> - return;
> - }
> - ret = parse(dev, str, ptr);
> - error_set_from_qdev_prop_error(errp, ret, dev, prop, str);
> - g_free(str);
> -}
> -
> static void get_enum(Object *obj, Visitor *v, void *opaque,
> const char *name, Error **errp)
> {
> @@ -476,227 +433,6 @@ PropertyInfo qdev_prop_string = {
> .set = set_string,
> };
>
> -/* --- drive --- */
> -
> -static int parse_drive(DeviceState *dev, const char *str, void **ptr)
> -{
> - BlockDriverState *bs;
> -
> - bs = bdrv_find(str);
> - if (bs == NULL)
> - return -ENOENT;
> - if (bdrv_attach_dev(bs, dev) < 0)
> - return -EEXIST;
> - *ptr = bs;
> - return 0;
> -}
> -
> -static void release_drive(Object *obj, const char *name, void *opaque)
> -{
> - DeviceState *dev = DEVICE(obj);
> - Property *prop = opaque;
> - BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
> -
> - if (*ptr) {
> - bdrv_detach_dev(*ptr, dev);
> - blockdev_auto_del(*ptr);
> - }
> -}
> -
> -static const char *print_drive(void *ptr)
> -{
> - return bdrv_get_device_name(ptr);
> -}
> -
> -static void get_drive(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - get_pointer(obj, v, opaque, print_drive, name, errp);
> -}
> -
> -static void set_drive(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - set_pointer(obj, v, opaque, parse_drive, name, errp);
> -}
> -
> -PropertyInfo qdev_prop_drive = {
> - .name = "drive",
> - .get = get_drive,
> - .set = set_drive,
> - .release = release_drive,
> -};
> -
> -/* --- character device --- */
> -
> -static int parse_chr(DeviceState *dev, const char *str, void **ptr)
> -{
> - CharDriverState *chr = qemu_chr_find(str);
> - if (chr == NULL) {
> - return -ENOENT;
> - }
> - if (chr->avail_connections < 1) {
> - return -EEXIST;
> - }
> - *ptr = chr;
> - --chr->avail_connections;
> - return 0;
> -}
> -
> -static void release_chr(Object *obj, const char *name, void *opaque)
> -{
> - DeviceState *dev = DEVICE(obj);
> - Property *prop = opaque;
> - CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
> -
> - if (*ptr) {
> - qemu_chr_add_handlers(*ptr, NULL, NULL, NULL, NULL);
> - }
> -}
> -
> -
> -static const char *print_chr(void *ptr)
> -{
> - CharDriverState *chr = ptr;
> -
> - return chr->label ? chr->label : "";
> -}
> -
> -static void get_chr(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - get_pointer(obj, v, opaque, print_chr, name, errp);
> -}
> -
> -static void set_chr(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - set_pointer(obj, v, opaque, parse_chr, name, errp);
> -}
> -
> -PropertyInfo qdev_prop_chr = {
> - .name = "chr",
> - .get = get_chr,
> - .set = set_chr,
> - .release = release_chr,
> -};
> -
> -/* --- netdev device --- */
> -
> -static int parse_netdev(DeviceState *dev, const char *str, void **ptr)
> -{
> - NetClientState *netdev = qemu_find_netdev(str);
> -
> - if (netdev == NULL) {
> - return -ENOENT;
> - }
> - if (netdev->peer) {
> - return -EEXIST;
> - }
> - *ptr = netdev;
> - return 0;
> -}
> -
> -static const char *print_netdev(void *ptr)
> -{
> - NetClientState *netdev = ptr;
> -
> - return netdev->name ? netdev->name : "";
> -}
> -
> -static void get_netdev(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - get_pointer(obj, v, opaque, print_netdev, name, errp);
> -}
> -
> -static void set_netdev(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - set_pointer(obj, v, opaque, parse_netdev, name, errp);
> -}
> -
> -PropertyInfo qdev_prop_netdev = {
> - .name = "netdev",
> - .get = get_netdev,
> - .set = set_netdev,
> -};
> -
> -/* --- vlan --- */
> -
> -static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t
> len)
> -{
> - NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
> -
> - if (*ptr) {
> - int id;
> - if (!net_hub_id_for_client(*ptr, &id)) {
> - return snprintf(dest, len, "%d", id);
> - }
> - }
> -
> - return snprintf(dest, len, "<null>");
> -}
> -
> -static void get_vlan(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - DeviceState *dev = DEVICE(obj);
> - Property *prop = opaque;
> - NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
> - int32_t id = -1;
> -
> - if (*ptr) {
> - int hub_id;
> - if (!net_hub_id_for_client(*ptr, &hub_id)) {
> - id = hub_id;
> - }
> - }
> -
> - visit_type_int32(v, &id, name, errp);
> -}
> -
> -static void set_vlan(Object *obj, Visitor *v, void *opaque,
> - const char *name, Error **errp)
> -{
> - DeviceState *dev = DEVICE(obj);
> - Property *prop = opaque;
> - NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
> - Error *local_err = NULL;
> - int32_t id;
> - NetClientState *hubport;
> -
> - if (dev->state != DEV_STATE_CREATED) {
> - error_set(errp, QERR_PERMISSION_DENIED);
> - return;
> - }
> -
> - visit_type_int32(v, &id, name, &local_err);
> - if (local_err) {
> - error_propagate(errp, local_err);
> - return;
> - }
> - if (id == -1) {
> - *ptr = NULL;
> - return;
> - }
> -
> - hubport = net_hub_port_find(id);
> - if (!hubport) {
> - error_set(errp, QERR_INVALID_PARAMETER_VALUE,
> - name, prop->info->name);
> - return;
> - }
> - *ptr = hubport;
> -}
> -
> -PropertyInfo qdev_prop_vlan = {
> - .name = "vlan",
> - .print = print_vlan,
> - .get = get_vlan,
> - .set = set_vlan,
> -};
> -
> /* --- pointer --- */
>
> /* Not a proper property, just for dirty hacks. TODO Remove it! */
> @@ -1158,44 +894,6 @@ void qdev_prop_set_string(DeviceState *dev, const char
> *name, const char *value)
> assert_no_error(errp);
> }
>
> -int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState
> *value)
> -{
> - Error *errp = NULL;
> - const char *bdrv_name = value ? bdrv_get_device_name(value) : "";
> - object_property_set_str(OBJECT(dev), bdrv_name,
> - name, &errp);
> - if (errp) {
> - qerror_report_err(errp);
> - error_free(errp);
> - return -1;
> - }
> - return 0;
> -}
> -
> -void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name,
> BlockDriverState *value)
> -{
> - if (qdev_prop_set_drive(dev, name, value) < 0) {
> - exit(1);
> - }
> -}
> -void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState
> *value)
> -{
> - Error *errp = NULL;
> - assert(!value || value->label);
> - object_property_set_str(OBJECT(dev),
> - value ? value->label : "", name, &errp);
> - assert_no_error(errp);
> -}
> -
> -void qdev_prop_set_netdev(DeviceState *dev, const char *name, NetClientState
> *value)
> -{
> - Error *errp = NULL;
> - assert(!value || value->name);
> - object_property_set_str(OBJECT(dev),
> - value ? value->name : "", name, &errp);
> - assert_no_error(errp);
> -}
> -
> void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t
> *value)
> {
> Error *errp = NULL;
> @@ -1231,7 +929,7 @@ void qdev_prop_set_ptr(DeviceState *dev, const char
> *name, void *value)
>
> static QTAILQ_HEAD(, GlobalProperty) global_props =
> QTAILQ_HEAD_INITIALIZER(global_props);
>
> -static void qdev_prop_register_global(GlobalProperty *prop)
> +void qdev_prop_register_global(GlobalProperty *prop)
> {
> QTAILQ_INSERT_TAIL(&global_props, prop, next);
> }
> @@ -1263,19 +961,3 @@ void qdev_prop_set_globals(DeviceState *dev)
> } while (class);
> }
>
> -static int qdev_add_one_global(QemuOpts *opts, void *opaque)
> -{
> - GlobalProperty *g;
> -
> - g = g_malloc0(sizeof(*g));
> - g->driver = qemu_opt_get(opts, "driver");
> - g->property = qemu_opt_get(opts, "property");
> - g->value = qemu_opt_get(opts, "value");
> - qdev_prop_register_global(g);
> - return 0;
> -}
> -
> -void qemu_add_globals(void)
> -{
> - qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global, NULL,
> 0);
> -}
> diff --git a/hw/qdev-properties.h b/hw/qdev-properties.h
> index 5b046ab..ddcf774 100644
> --- a/hw/qdev-properties.h
> +++ b/hw/qdev-properties.h
> @@ -116,6 +116,7 @@ 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);
> void qdev_prop_register_global_list(GlobalProperty *props);
> void qdev_prop_set_globals(DeviceState *dev);
> void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
> diff --git a/hw/qdev-system.c b/hw/qdev-system.c
> new file mode 100644
> index 0000000..490821f
> --- /dev/null
> +++ b/hw/qdev-system.c
> @@ -0,0 +1,68 @@
> +#include "qdev.h"
> +
> +void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
> +{
> + assert(dev->num_gpio_in == 0);
> + dev->num_gpio_in = n;
> + dev->gpio_in = qemu_allocate_irqs(handler, dev, n);
> +}
> +
> +void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
> +{
> + assert(dev->num_gpio_out == 0);
> + dev->num_gpio_out = n;
> + dev->gpio_out = pins;
> +}
> +
> +qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
> +{
> + assert(n >= 0 && n < dev->num_gpio_in);
> + return dev->gpio_in[n];
> +}
> +
> +void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
> +{
> + assert(n >= 0 && n < dev->num_gpio_out);
> + dev->gpio_out[n] = pin;
> +}
> +
> +/* Create a new device. This only initializes the device state structure
> + and allows properties to be set. qdev_init should be called to
> + initialize the actual device emulation. */
> +DeviceState *qdev_create(BusState *bus, const char *name)
> +{
> + DeviceState *dev;
> +
> + dev = qdev_try_create(bus, name);
> + if (!dev) {
> + if (bus) {
> + hw_error("Unknown device '%s' for bus '%s'\n", name,
> + object_get_typename(OBJECT(bus)));
> + } else {
> + hw_error("Unknown device '%s' for default sysbus\n", name);
> + }
> + }
> +
> + return dev;
> +}
> +
> +DeviceState *qdev_try_create(BusState *bus, const char *type)
> +{
> + DeviceState *dev;
> +
> + if (object_class_by_name(type) == NULL) {
> + return NULL;
> + }
> + dev = DEVICE(object_new(type));
> + if (!dev) {
> + return NULL;
> + }
> +
> + if (!bus) {
> + bus = sysbus_get_default();
> + }
> +
> + qdev_set_parent_bus(dev, bus);
> +
> + return dev;
> +}
> diff --git a/hw/qdev.c b/hw/qdev.c
> index 7ddcd24..ee19dd5 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -25,7 +25,6 @@
> inherit from a particular bus (e.g. PCI or I2C) rather than
> this API directly. */
>
> -#include "net.h"
> #include "qdev.h"
> #include "sysemu.h"
> #include "error.h"
> @@ -99,47 +98,6 @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
> bus_add_child(bus, dev);
> }
>
> -/* Create a new device. This only initializes the device state structure
> - and allows properties to be set. qdev_init should be called to
> - initialize the actual device emulation. */
> -DeviceState *qdev_create(BusState *bus, const char *name)
> -{
> - DeviceState *dev;
> -
> - dev = qdev_try_create(bus, name);
> - if (!dev) {
> - if (bus) {
> - hw_error("Unknown device '%s' for bus '%s'\n", name,
> - object_get_typename(OBJECT(bus)));
> - } else {
> - hw_error("Unknown device '%s' for default sysbus\n", name);
> - }
> - }
> -
> - return dev;
> -}
> -
> -DeviceState *qdev_try_create(BusState *bus, const char *type)
> -{
> - DeviceState *dev;
> -
> - if (object_class_by_name(type) == NULL) {
> - return NULL;
> - }
> - dev = DEVICE(object_new(type));
> - if (!dev) {
> - return NULL;
> - }
> -
> - if (!bus) {
> - bus = sysbus_get_default();
> - }
> -
> - qdev_set_parent_bus(dev, bus);
> -
> - return dev;
> -}
> -
> /* Initialize a device. Device properties should be set before calling
> this function. IRQs and MMIO regions should be connected/mapped after
> calling this function.
> @@ -284,44 +242,6 @@ BusState *qdev_get_parent_bus(DeviceState *dev)
> return dev->parent_bus;
> }
>
> -void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
> -{
> - dev->gpio_in = qemu_extend_irqs(dev->gpio_in, dev->num_gpio_in, handler,
> - dev, n);
> - dev->num_gpio_in += n;
> -}
> -
> -void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
> -{
> - assert(dev->num_gpio_out == 0);
> - dev->num_gpio_out = n;
> - dev->gpio_out = pins;
> -}
> -
> -qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
> -{
> - assert(n >= 0 && n < dev->num_gpio_in);
> - return dev->gpio_in[n];
> -}
> -
> -void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
> -{
> - assert(n >= 0 && n < dev->num_gpio_out);
> - dev->gpio_out[n] = pin;
> -}
> -
> -void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
> -{
> - qdev_prop_set_macaddr(dev, "mac", nd->macaddr.a);
> - if (nd->netdev)
> - qdev_prop_set_netdev(dev, "netdev", nd->netdev);
> - if (nd->nvectors != DEV_NVECTORS_UNSPECIFIED &&
> - object_property_find(OBJECT(dev), "vectors", NULL)) {
> - qdev_prop_set_uint32(dev, "vectors", nd->nvectors);
> - }
> - nd->instantiated = 1;
> -}
> -
> BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
> {
> BusState *bus;
> --
> 1.7.11.7
[Qemu-devel] [PATCH 05/12] qdev-core: isolate vmstate handling into separate functions, Igor Mammedov, 2012/10/15
[Qemu-devel] [PATCH 06/12] qdev: move vmstate handling to qdev-system.c, Igor Mammedov, 2012/10/15
[Qemu-devel] [PATCH 04/12] qdev: rename qdev.c to qdev-core.c, Igor Mammedov, 2012/10/15
[Qemu-devel] [PATCH 07/12] qdev-core: isolate reset register/unregister code, Igor Mammedov, 2012/10/15
[Qemu-devel] [PATCH 09/12] move qemu_irq typedef out of cpu-common.h, Igor Mammedov, 2012/10/15
[Qemu-devel] [PATCH 10/12] qdev: use full qdev.h include path on qdev*.c, Igor Mammedov, 2012/10/15
[Qemu-devel] [PATCH 08/12] qdev: move reset register/unregister code to qdev-system.c, Igor Mammedov, 2012/10/15