2012-08-10 21:00:43 +04:00
|
|
|
#ifndef QEMU_QDEV_PROPERTIES_H
|
|
|
|
#define QEMU_QDEV_PROPERTIES_H
|
|
|
|
|
2013-02-04 18:40:22 +04:00
|
|
|
#include "hw/qdev-core.h"
|
2012-08-10 21:00:43 +04:00
|
|
|
|
2020-12-12 01:05:00 +03:00
|
|
|
/**
|
|
|
|
* 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;
|
2022-02-15 22:52:51 +03:00
|
|
|
uint64_t bitmask;
|
2020-12-12 01:05:00 +03:00
|
|
|
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;
|
2021-08-24 11:38:25 +03:00
|
|
|
bool realized_set_allowed; /* allow setting property on realized device */
|
2020-12-12 01:05:04 +03:00
|
|
|
int (*print)(Object *obj, Property *prop, char *dest, size_t len);
|
2020-12-12 01:05:00 +03:00
|
|
|
void (*set_default_value)(ObjectProperty *op, const Property *prop);
|
2020-12-12 01:05:21 +03:00
|
|
|
ObjectProperty *(*create)(ObjectClass *oc, const char *name,
|
|
|
|
Property *prop);
|
2020-12-12 01:05:00 +03:00
|
|
|
ObjectPropertyAccessor *get;
|
|
|
|
ObjectPropertyAccessor *set;
|
|
|
|
ObjectPropertyRelease *release;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2012-08-10 21:00:43 +04:00
|
|
|
/*** qdev-properties.c ***/
|
|
|
|
|
2017-07-14 05:14:54 +03:00
|
|
|
extern const PropertyInfo qdev_prop_bit;
|
|
|
|
extern const PropertyInfo qdev_prop_bit64;
|
|
|
|
extern const PropertyInfo qdev_prop_bool;
|
2020-09-30 19:49:44 +03:00
|
|
|
extern const PropertyInfo qdev_prop_enum;
|
2017-07-14 05:14:54 +03:00
|
|
|
extern const PropertyInfo qdev_prop_uint8;
|
|
|
|
extern const PropertyInfo qdev_prop_uint16;
|
|
|
|
extern const PropertyInfo qdev_prop_uint32;
|
|
|
|
extern const PropertyInfo qdev_prop_int32;
|
|
|
|
extern const PropertyInfo qdev_prop_uint64;
|
2022-02-15 22:52:51 +03:00
|
|
|
extern const PropertyInfo qdev_prop_uint64_checkmask;
|
2017-07-18 06:39:01 +03:00
|
|
|
extern const PropertyInfo qdev_prop_int64;
|
2017-07-14 05:14:54 +03:00
|
|
|
extern const PropertyInfo qdev_prop_size;
|
|
|
|
extern const PropertyInfo qdev_prop_string;
|
|
|
|
extern const PropertyInfo qdev_prop_on_off_auto;
|
2020-05-29 01:55:12 +03:00
|
|
|
extern const PropertyInfo qdev_prop_size32;
|
qdev: Rework array properties based on list visitor
Until now, array properties are actually implemented with a hack that
uses multiple properties on the QOM level: a static "foo-len" property
and after it is set, dynamically created "foo[i]" properties.
In external interfaces (-device on the command line and device_add in
QMP), this interface was broken by commit f3558b1b ('qdev: Base object
creation on QDict rather than QemuOpts') because QDicts are unordered
and therefore it could happen that QEMU tried to set the indexed
properties before setting the length, which fails and effectively makes
array properties inaccessible. In particular, this affects the 'ports'
property of the 'rocker' device, which used to be configured like this:
-device rocker,len-ports=2,ports[0]=dev0,ports[1]=dev1
This patch reworks the external interface so that instead of using a
separate top-level property for the length and for each element, we use
a single true array property that accepts a list value. In the external
interfaces, this is naturally expressed as a JSON list and makes array
properties accessible again. The new syntax looks like this:
-device '{"driver":"rocker","ports":["dev0","dev1"]}'
Creating an array property on the command line without using JSON format
is currently not possible. This could be fixed by switching from
QemuOpts to a keyval parser, which however requires consideration of the
compatibility implications.
All internal users of devices with array properties go through
qdev_prop_set_array() at this point, so updating it takes care of all of
them.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1090
Fixes: f3558b1b763683bb877f7dd5b282469cdadc65c3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20231109174240.72376-12-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2023-11-09 20:42:40 +03:00
|
|
|
extern const PropertyInfo qdev_prop_array;
|
2017-07-14 05:14:54 +03:00
|
|
|
extern const PropertyInfo qdev_prop_link;
|
2012-08-10 21:00:43 +04:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP(_name, _state, _field, _prop, _type, ...) { \
|
2012-08-10 21:00:43 +04:00
|
|
|
.name = (_name), \
|
|
|
|
.info = &(_prop), \
|
|
|
|
.offset = offsetof(_state, _field) \
|
2013-01-30 15:12:28 +04:00
|
|
|
+ type_check(_type, typeof_field(_state, _field)), \
|
2020-12-12 01:05:13 +03:00
|
|
|
__VA_ARGS__ \
|
2012-08-10 21:00:43 +04:00
|
|
|
}
|
2017-06-07 19:36:09 +03:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, _prop, _type, \
|
|
|
|
.set_default = true, \
|
|
|
|
.defval.i = (_type)_defval)
|
2017-06-07 19:36:09 +03:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, _prop, _type)
|
2017-07-17 15:36:06 +03:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, qdev_prop_bit, uint32_t, \
|
|
|
|
.bitnr = (_bit), \
|
|
|
|
.set_default = true, \
|
|
|
|
.defval.u = (bool)_defval)
|
2017-06-07 19:36:09 +03:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, _type) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, _prop, _type, \
|
|
|
|
.set_default = true, \
|
|
|
|
.defval.u = (_type)_defval)
|
2017-06-07 19:36:09 +03:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, _type) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, _prop, _type)
|
2017-07-17 15:36:06 +03:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, qdev_prop_bit64, uint64_t, \
|
|
|
|
.bitnr = (_bit), \
|
|
|
|
.set_default = true, \
|
|
|
|
.defval.u = (bool)_defval)
|
2012-08-10 21:00:43 +04:00
|
|
|
|
2020-12-12 01:05:13 +03:00
|
|
|
#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \
|
|
|
|
.set_default = true, \
|
|
|
|
.defval.u = (bool)_defval)
|
2013-03-07 20:16:18 +04:00
|
|
|
|
2022-02-15 22:52:51 +03:00
|
|
|
/**
|
|
|
|
* The DEFINE_PROP_UINT64_CHECKMASK macro checks a user-supplied value
|
|
|
|
* against corresponding bitmask, rejects the value if it violates.
|
|
|
|
* The default value is set in instance_init().
|
|
|
|
*/
|
|
|
|
#define DEFINE_PROP_UINT64_CHECKMASK(_name, _state, _field, _bitmask) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, qdev_prop_uint64_checkmask, uint64_t, \
|
|
|
|
.bitmask = (_bitmask), \
|
|
|
|
.set_default = false)
|
|
|
|
|
2013-03-15 20:41:57 +04:00
|
|
|
/**
|
|
|
|
* DEFINE_PROP_ARRAY:
|
|
|
|
* @_name: name of the array
|
|
|
|
* @_state: name of the device state structure type
|
|
|
|
* @_field: uint32_t field in @_state to hold the array length
|
|
|
|
* @_arrayfield: field in @_state (of type '@_arraytype *') which
|
|
|
|
* will point to the array
|
|
|
|
* @_arrayprop: PropertyInfo defining what property the array elements have
|
|
|
|
* @_arraytype: C type of the array elements
|
|
|
|
*
|
qdev: Rework array properties based on list visitor
Until now, array properties are actually implemented with a hack that
uses multiple properties on the QOM level: a static "foo-len" property
and after it is set, dynamically created "foo[i]" properties.
In external interfaces (-device on the command line and device_add in
QMP), this interface was broken by commit f3558b1b ('qdev: Base object
creation on QDict rather than QemuOpts') because QDicts are unordered
and therefore it could happen that QEMU tried to set the indexed
properties before setting the length, which fails and effectively makes
array properties inaccessible. In particular, this affects the 'ports'
property of the 'rocker' device, which used to be configured like this:
-device rocker,len-ports=2,ports[0]=dev0,ports[1]=dev1
This patch reworks the external interface so that instead of using a
separate top-level property for the length and for each element, we use
a single true array property that accepts a list value. In the external
interfaces, this is naturally expressed as a JSON list and makes array
properties accessible again. The new syntax looks like this:
-device '{"driver":"rocker","ports":["dev0","dev1"]}'
Creating an array property on the command line without using JSON format
is currently not possible. This could be fixed by switching from
QemuOpts to a keyval parser, which however requires consideration of the
compatibility implications.
All internal users of devices with array properties go through
qdev_prop_set_array() at this point, so updating it takes care of all of
them.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1090
Fixes: f3558b1b763683bb877f7dd5b282469cdadc65c3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20231109174240.72376-12-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2023-11-09 20:42:40 +03:00
|
|
|
* Define device properties for a variable-length array _name. The array is
|
|
|
|
* represented as a list in the visitor interface.
|
|
|
|
*
|
|
|
|
* @_arraytype is required to be movable with memcpy().
|
2013-03-15 20:41:57 +04:00
|
|
|
*
|
qdev: Rework array properties based on list visitor
Until now, array properties are actually implemented with a hack that
uses multiple properties on the QOM level: a static "foo-len" property
and after it is set, dynamically created "foo[i]" properties.
In external interfaces (-device on the command line and device_add in
QMP), this interface was broken by commit f3558b1b ('qdev: Base object
creation on QDict rather than QemuOpts') because QDicts are unordered
and therefore it could happen that QEMU tried to set the indexed
properties before setting the length, which fails and effectively makes
array properties inaccessible. In particular, this affects the 'ports'
property of the 'rocker' device, which used to be configured like this:
-device rocker,len-ports=2,ports[0]=dev0,ports[1]=dev1
This patch reworks the external interface so that instead of using a
separate top-level property for the length and for each element, we use
a single true array property that accepts a list value. In the external
interfaces, this is naturally expressed as a JSON list and makes array
properties accessible again. The new syntax looks like this:
-device '{"driver":"rocker","ports":["dev0","dev1"]}'
Creating an array property on the command line without using JSON format
is currently not possible. This could be fixed by switching from
QemuOpts to a keyval parser, which however requires consideration of the
compatibility implications.
All internal users of devices with array properties go through
qdev_prop_set_array() at this point, so updating it takes care of all of
them.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1090
Fixes: f3558b1b763683bb877f7dd5b282469cdadc65c3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20231109174240.72376-12-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2023-11-09 20:42:40 +03:00
|
|
|
* When the array property is set, the @_field member of the device
|
2013-03-15 20:41:57 +04:00
|
|
|
* struct is set to the array length, and @_arrayfield is set to point
|
qdev: Rework array properties based on list visitor
Until now, array properties are actually implemented with a hack that
uses multiple properties on the QOM level: a static "foo-len" property
and after it is set, dynamically created "foo[i]" properties.
In external interfaces (-device on the command line and device_add in
QMP), this interface was broken by commit f3558b1b ('qdev: Base object
creation on QDict rather than QemuOpts') because QDicts are unordered
and therefore it could happen that QEMU tried to set the indexed
properties before setting the length, which fails and effectively makes
array properties inaccessible. In particular, this affects the 'ports'
property of the 'rocker' device, which used to be configured like this:
-device rocker,len-ports=2,ports[0]=dev0,ports[1]=dev1
This patch reworks the external interface so that instead of using a
separate top-level property for the length and for each element, we use
a single true array property that accepts a list value. In the external
interfaces, this is naturally expressed as a JSON list and makes array
properties accessible again. The new syntax looks like this:
-device '{"driver":"rocker","ports":["dev0","dev1"]}'
Creating an array property on the command line without using JSON format
is currently not possible. This could be fixed by switching from
QemuOpts to a keyval parser, which however requires consideration of the
compatibility implications.
All internal users of devices with array properties go through
qdev_prop_set_array() at this point, so updating it takes care of all of
them.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1090
Fixes: f3558b1b763683bb877f7dd5b282469cdadc65c3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20231109174240.72376-12-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2023-11-09 20:42:40 +03:00
|
|
|
* to the memory allocated for the array.
|
|
|
|
*
|
2013-03-15 20:41:57 +04:00
|
|
|
* It is the responsibility of the device deinit code to free the
|
|
|
|
* @_arrayfield memory.
|
|
|
|
*/
|
qdev: Rework array properties based on list visitor
Until now, array properties are actually implemented with a hack that
uses multiple properties on the QOM level: a static "foo-len" property
and after it is set, dynamically created "foo[i]" properties.
In external interfaces (-device on the command line and device_add in
QMP), this interface was broken by commit f3558b1b ('qdev: Base object
creation on QDict rather than QemuOpts') because QDicts are unordered
and therefore it could happen that QEMU tried to set the indexed
properties before setting the length, which fails and effectively makes
array properties inaccessible. In particular, this affects the 'ports'
property of the 'rocker' device, which used to be configured like this:
-device rocker,len-ports=2,ports[0]=dev0,ports[1]=dev1
This patch reworks the external interface so that instead of using a
separate top-level property for the length and for each element, we use
a single true array property that accepts a list value. In the external
interfaces, this is naturally expressed as a JSON list and makes array
properties accessible again. The new syntax looks like this:
-device '{"driver":"rocker","ports":["dev0","dev1"]}'
Creating an array property on the command line without using JSON format
is currently not possible. This could be fixed by switching from
QemuOpts to a keyval parser, which however requires consideration of the
compatibility implications.
All internal users of devices with array properties go through
qdev_prop_set_array() at this point, so updating it takes care of all of
them.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1090
Fixes: f3558b1b763683bb877f7dd5b282469cdadc65c3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20231109174240.72376-12-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2023-11-09 20:42:40 +03:00
|
|
|
#define DEFINE_PROP_ARRAY(_name, _state, _field, \
|
|
|
|
_arrayfield, _arrayprop, _arraytype) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, qdev_prop_array, uint32_t, \
|
|
|
|
.set_default = true, \
|
|
|
|
.defval.u = 0, \
|
|
|
|
.arrayinfo = &(_arrayprop), \
|
|
|
|
.arrayfieldsize = sizeof(_arraytype), \
|
2020-12-12 01:05:13 +03:00
|
|
|
.arrayoffset = offsetof(_state, _arrayfield))
|
|
|
|
|
|
|
|
#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type) \
|
|
|
|
DEFINE_PROP(_name, _state, _field, qdev_prop_link, _ptr_type, \
|
|
|
|
.link_type = _type)
|
2017-07-14 05:14:52 +03:00
|
|
|
|
2012-08-10 21:00:43 +04:00
|
|
|
#define DEFINE_PROP_UINT8(_n, _s, _f, _d) \
|
2017-06-07 19:36:09 +03:00
|
|
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
|
2012-08-10 21:00:43 +04:00
|
|
|
#define DEFINE_PROP_UINT16(_n, _s, _f, _d) \
|
2017-06-07 19:36:09 +03:00
|
|
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint16, uint16_t)
|
2012-08-10 21:00:43 +04:00
|
|
|
#define DEFINE_PROP_UINT32(_n, _s, _f, _d) \
|
2017-06-07 19:36:09 +03:00
|
|
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint32, uint32_t)
|
2012-08-10 21:00:43 +04:00
|
|
|
#define DEFINE_PROP_INT32(_n, _s, _f, _d) \
|
2017-06-07 19:36:07 +03:00
|
|
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_int32, int32_t)
|
2012-08-10 21:00:43 +04:00
|
|
|
#define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
|
2017-06-07 19:36:09 +03:00
|
|
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
|
2017-07-18 06:39:01 +03:00
|
|
|
#define DEFINE_PROP_INT64(_n, _s, _f, _d) \
|
|
|
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_int64, int64_t)
|
2013-07-29 18:47:56 +04:00
|
|
|
#define DEFINE_PROP_SIZE(_n, _s, _f, _d) \
|
2017-06-07 19:36:09 +03:00
|
|
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size, uint64_t)
|
2012-08-10 21:00:43 +04:00
|
|
|
#define DEFINE_PROP_STRING(_n, _s, _f) \
|
|
|
|
DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
|
2016-03-15 21:34:49 +03:00
|
|
|
#define DEFINE_PROP_ON_OFF_AUTO(_n, _s, _f, _d) \
|
2017-06-07 19:36:07 +03:00
|
|
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)
|
2020-05-29 01:55:12 +03:00
|
|
|
#define DEFINE_PROP_SIZE32(_n, _s, _f, _d) \
|
|
|
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size32, uint32_t)
|
2018-11-08 01:33:09 +03:00
|
|
|
|
2012-08-10 21:00:43 +04:00
|
|
|
#define DEFINE_PROP_END_OF_LIST() \
|
|
|
|
{}
|
|
|
|
|
qdev: Make qdev_prop_set_drive() match the other helpers
qdev_prop_set_drive() can fail. None of the other qdev_prop_set_FOO()
can; they abort on error.
To clean up this inconsistency, rename qdev_prop_set_drive() to
qdev_prop_set_drive_err(), and create a qdev_prop_set_drive() that
aborts on error.
Coccinelle script to update callers:
@ depends on !(file in "hw/core/qdev-properties-system.c")@
expression dev, name, value;
symbol error_abort;
@@
- qdev_prop_set_drive(dev, name, value, &error_abort);
+ qdev_prop_set_drive(dev, name, value);
@@
expression dev, name, value, errp;
@@
- qdev_prop_set_drive(dev, name, value, errp);
+ qdev_prop_set_drive_err(dev, name, value, errp);
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200622094227.1271650-14-armbru@redhat.com>
2020-06-22 12:42:24 +03:00
|
|
|
/*
|
|
|
|
* Set properties between creation and realization.
|
2020-07-20 15:16:59 +03:00
|
|
|
*
|
|
|
|
* Returns: %true on success, %false on error.
|
qdev: Make qdev_prop_set_drive() match the other helpers
qdev_prop_set_drive() can fail. None of the other qdev_prop_set_FOO()
can; they abort on error.
To clean up this inconsistency, rename qdev_prop_set_drive() to
qdev_prop_set_drive_err(), and create a qdev_prop_set_drive() that
aborts on error.
Coccinelle script to update callers:
@ depends on !(file in "hw/core/qdev-properties-system.c")@
expression dev, name, value;
symbol error_abort;
@@
- qdev_prop_set_drive(dev, name, value, &error_abort);
+ qdev_prop_set_drive(dev, name, value);
@@
expression dev, name, value, errp;
@@
- qdev_prop_set_drive(dev, name, value, errp);
+ qdev_prop_set_drive_err(dev, name, value, errp);
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200622094227.1271650-14-armbru@redhat.com>
2020-06-22 12:42:24 +03:00
|
|
|
*/
|
2020-07-07 19:05:59 +03:00
|
|
|
bool qdev_prop_set_drive_err(DeviceState *dev, const char *name,
|
|
|
|
BlockBackend *value, Error **errp);
|
qdev: Make qdev_prop_set_drive() match the other helpers
qdev_prop_set_drive() can fail. None of the other qdev_prop_set_FOO()
can; they abort on error.
To clean up this inconsistency, rename qdev_prop_set_drive() to
qdev_prop_set_drive_err(), and create a qdev_prop_set_drive() that
aborts on error.
Coccinelle script to update callers:
@ depends on !(file in "hw/core/qdev-properties-system.c")@
expression dev, name, value;
symbol error_abort;
@@
- qdev_prop_set_drive(dev, name, value, &error_abort);
+ qdev_prop_set_drive(dev, name, value);
@@
expression dev, name, value, errp;
@@
- qdev_prop_set_drive(dev, name, value, errp);
+ qdev_prop_set_drive_err(dev, name, value, errp);
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200622094227.1271650-14-armbru@redhat.com>
2020-06-22 12:42:24 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Set properties between creation and realization.
|
|
|
|
* @value must be valid. Each property may be set at most once.
|
|
|
|
*/
|
2012-08-10 21:00:43 +04:00
|
|
|
void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value);
|
|
|
|
void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value);
|
|
|
|
void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value);
|
|
|
|
void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value);
|
|
|
|
void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value);
|
|
|
|
void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value);
|
|
|
|
void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value);
|
2016-12-07 16:20:22 +03:00
|
|
|
void qdev_prop_set_chr(DeviceState *dev, const char *name, Chardev *value);
|
2012-08-10 21:00:43 +04:00
|
|
|
void qdev_prop_set_netdev(DeviceState *dev, const char *name, NetClientState *value);
|
2015-03-09 21:17:26 +03:00
|
|
|
void qdev_prop_set_drive(DeviceState *dev, const char *name,
|
qdev: Make qdev_prop_set_drive() match the other helpers
qdev_prop_set_drive() can fail. None of the other qdev_prop_set_FOO()
can; they abort on error.
To clean up this inconsistency, rename qdev_prop_set_drive() to
qdev_prop_set_drive_err(), and create a qdev_prop_set_drive() that
aborts on error.
Coccinelle script to update callers:
@ depends on !(file in "hw/core/qdev-properties-system.c")@
expression dev, name, value;
symbol error_abort;
@@
- qdev_prop_set_drive(dev, name, value, &error_abort);
+ qdev_prop_set_drive(dev, name, value);
@@
expression dev, name, value, errp;
@@
- qdev_prop_set_drive(dev, name, value, errp);
+ qdev_prop_set_drive_err(dev, name, value, errp);
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200622094227.1271650-14-armbru@redhat.com>
2020-06-22 12:42:24 +03:00
|
|
|
BlockBackend *value);
|
2017-03-10 23:05:49 +03:00
|
|
|
void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
|
|
|
|
const uint8_t *value);
|
2012-08-10 21:00:43 +04:00
|
|
|
void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
|
|
|
|
|
2023-10-30 14:47:59 +03:00
|
|
|
/* Takes ownership of @values */
|
|
|
|
void qdev_prop_set_array(DeviceState *dev, const char *name, QList *values);
|
|
|
|
|
2020-12-12 01:05:27 +03:00
|
|
|
void *object_field_prop_ptr(Object *obj, Property *prop);
|
qdev: Make qdev_prop_set_drive() match the other helpers
qdev_prop_set_drive() can fail. None of the other qdev_prop_set_FOO()
can; they abort on error.
To clean up this inconsistency, rename qdev_prop_set_drive() to
qdev_prop_set_drive_err(), and create a qdev_prop_set_drive() that
aborts on error.
Coccinelle script to update callers:
@ depends on !(file in "hw/core/qdev-properties-system.c")@
expression dev, name, value;
symbol error_abort;
@@
- qdev_prop_set_drive(dev, name, value, &error_abort);
+ qdev_prop_set_drive(dev, name, value);
@@
expression dev, name, value, errp;
@@
- qdev_prop_set_drive(dev, name, value, errp);
+ qdev_prop_set_drive_err(dev, name, value, errp);
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200622094227.1271650-14-armbru@redhat.com>
2020-06-22 12:42:24 +03:00
|
|
|
|
2012-12-05 20:49:11 +04:00
|
|
|
void qdev_prop_register_global(GlobalProperty *prop);
|
2020-12-12 01:05:07 +03:00
|
|
|
const GlobalProperty *qdev_find_global_prop(Object *obj,
|
qdev: Improve netdev property override error a bit
qdev_prop_set_netdev() fails when the property already has a non-null
value. Seems to go back to commit 30c367ed44
"qdev-properties-system.c: Allow vlan or netdev for -device, not
both", v1.7.0. Board code doesn't expect failure, and crashes:
$ qemu-system-x86_64 --nodefaults -nic user -netdev user,id=nic0 -global e1000.netdev=nic0
Unexpected error in error_set_from_qdev_prop_error() at /work/armbru/qemu/hw/core/qdev-properties.c:1101:
qemu-system-x86_64: Property 'e1000.netdev' doesn't take value '__org.qemu.nic0
'
Aborted (core dumped)
-device and device_add handle the failure:
$ qemu-system-x86_64 -nodefaults -netdev user,id=net0 -netdev user,id=net1 -device e1000,netdev=net0,netdev=net1
qemu-system-x86_64: -device e1000,netdev=net0,netdev=net1: Property 'e1000.netdev' doesn't take value 'net1'
$ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -netdev user,id=net0 -netdev user,id=net1 -global e1000.netdev=net0
QEMU 5.0.50 monitor - type 'help' for more information
(qemu) qemu-system-x86_64: warning: netdev net0 has no peer
qemu-system-x86_64: warning: netdev net1 has no peer
device_add e1000,netdev=net1
Error: Property 'e1000.netdev' doesn't take value 'net1'
Perhaps netdev property override could be made to work. Perhaps it
should. I'm not the right guy to figure this out. What I can do is
improve the error message a bit:
(qemu) device_add e1000,netdev=net1
Error: -global e1000.netdev=... conflicts with netdev=net1
Cc: Jason Wang <jasowang@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20200622094227.1271650-11-armbru@redhat.com>
2020-06-22 12:42:21 +03:00
|
|
|
const char *name);
|
2014-08-08 23:03:30 +04:00
|
|
|
int qdev_prop_check_globals(void);
|
2015-01-20 12:04:07 +03:00
|
|
|
void qdev_prop_set_globals(DeviceState *dev);
|
2020-12-12 01:05:09 +03:00
|
|
|
void error_set_from_qdev_prop_error(Error **errp, int ret, Object *obj,
|
2020-12-12 01:05:15 +03:00
|
|
|
const char *name, const char *value);
|
2012-08-10 21:00:43 +04:00
|
|
|
|
|
|
|
/**
|
2016-04-17 10:45:54 +03:00
|
|
|
* qdev_property_add_static:
|
|
|
|
* @dev: Device to add the property to.
|
|
|
|
* @prop: The qdev property definition.
|
|
|
|
*
|
|
|
|
* Add a static QOM property to @dev for qdev property @prop.
|
|
|
|
* On error, store error in @errp. Static properties access data in a struct.
|
|
|
|
* The type of the QOM property is derived from prop->info.
|
2012-08-10 21:00:43 +04:00
|
|
|
*/
|
2020-01-10 18:30:16 +03:00
|
|
|
void qdev_property_add_static(DeviceState *dev, Property *prop);
|
2012-08-10 21:00:43 +04:00
|
|
|
|
2020-07-11 17:24:23 +03:00
|
|
|
/**
|
|
|
|
* qdev_alias_all_properties: Create aliases on source for all target properties
|
|
|
|
* @target: Device which has properties to be aliased
|
|
|
|
* @source: Object to add alias properties to
|
|
|
|
*
|
|
|
|
* Add alias properties to the @source object for all qdev properties on
|
|
|
|
* the @target DeviceState.
|
|
|
|
*
|
|
|
|
* This is useful when @target is an internal implementation object
|
|
|
|
* owned by @source, and you want to expose all the properties of that
|
|
|
|
* implementation object as properties on the @source object so that users
|
|
|
|
* of @source can set them.
|
|
|
|
*/
|
2014-06-18 13:58:32 +04:00
|
|
|
void qdev_alias_all_properties(DeviceState *target, Object *source);
|
|
|
|
|
2013-03-25 17:40:44 +04:00
|
|
|
/**
|
|
|
|
* @qdev_prop_set_after_realize:
|
|
|
|
* @dev: device
|
|
|
|
* @name: name of property
|
|
|
|
* @errp: indirect pointer to Error to be set
|
|
|
|
* Set the Error object to report that an attempt was made to set a property
|
|
|
|
* on a device after it has already been realized. This is a utility function
|
|
|
|
* which allows property-setter functions to easily report the error in
|
|
|
|
* a friendly format identifying both the device and the property.
|
|
|
|
*/
|
|
|
|
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
|
|
|
|
Error **errp);
|
2014-03-19 11:58:56 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* qdev_prop_allow_set_link_before_realize:
|
|
|
|
*
|
|
|
|
* Set the #Error object if an attempt is made to set the link after realize.
|
|
|
|
* This function should be used as the check() argument to
|
|
|
|
* object_property_add_link().
|
|
|
|
*/
|
2017-07-14 05:14:50 +03:00
|
|
|
void qdev_prop_allow_set_link_before_realize(const Object *obj,
|
|
|
|
const char *name,
|
2014-03-19 11:58:56 +04:00
|
|
|
Object *val, Error **errp);
|
|
|
|
|
2012-08-10 21:00:43 +04:00
|
|
|
#endif
|