mirror of https://github.com/xemu-project/xemu.git
Machine queue, 2020-12-15
* qdev code cleanup * Convert some QOM instance properties to class properties * Update git URLs on MAINTAINERS -----BEGIN PGP SIGNATURE----- iQJIBAABCAAyFiEEWjIv1avE09usz9GqKAeTb5hNxaYFAl/Y09cUHGVoYWJrb3N0 QHJlZGhhdC5jb20ACgkQKAeTb5hNxaaJXRAAueMM4w9la/JTSF84GR5AmbJx1pGA YlOxP74Kae35UbrgygZhcb0FvBLRKHcpvGL7ZxWW9CfPFOstHf9i5IkFqU+mHGvU 7en9oHCTgepnqSeBt+cdI2mHD+aOwqapeR8Lw/8xiol9AmbxkZDJWpPWQHuvR1qM SSUZtJF79LLI68EI67AHDMzb4f34Ug7rmvXflWqw8RpDnE25IO/L9Pd59+JbcTI0 LndRf38M9RZTcPG1RX3QDvmBGhsX2QTZ1eY7buzfXsDIb4BofOTZBKp/IAc4mbUy ngqdKjeFPVrWdXIn+mEOGI6/uRCujpFPMLmVk+fnCYB+WJ9EGRv4v17AWFJryVFn 0NFwmRbwJvHAy0Tz1T1Bq6GrRFFjbMTxubjjnsW7YB0V0Y2OHYCtjTSQ5bXkwpw+ JiOL5q6NTwPctrqYaiUHRevYFUOF9Ywr2TroDt2PeEkSaxpptMQTvmaDlhwdS/MK t0nb3PoaztldAc8KV/mJX6zRNMR8J1li/hIXykMOrYOgpNN4Oz0Clo0VJ+7vIWjE IEyV7NXLEET592poWNYABMXiPrLFuaosZLWpM0TR2jugOOTsmNNa6xKoj03qE58S cUBoGIyfC4Up5eOE8CDK804T0LgcykDnCEqjOnNvLtTNoq483+WrhHkmFGiieHh3 uj6SVW7ETxvh6Og= =rzsJ -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/ehabkost/tags/machine-next-pull-request' into staging Machine queue, 2020-12-15 * qdev code cleanup * Convert some QOM instance properties to class properties * Update git URLs on MAINTAINERS # gpg: Signature made Tue 15 Dec 2020 15:18:47 GMT # gpg: using RSA key 5A322FD5ABC4D3DBACCFD1AA2807936F984DC5A6 # gpg: issuer "ehabkost@redhat.com" # gpg: Good signature from "Eduardo Habkost <ehabkost@redhat.com>" [full] # Primary key fingerprint: 5A32 2FD5 ABC4 D3DB ACCF D1AA 2807 936F 984D C5A6 * remotes/ehabkost/tags/machine-next-pull-request: (25 commits) MAINTAINERS: Update my git repository URLs qdev: Move UUID property to qdev-properties-system.c qdev: Make qdev_propinfo_get_uint16() static qdev: Make error_set_from_qdev_prop_error() get Object* argument qdev: Make check_prop_still_unset() get Object* argument qdev: Make qdev_find_global_prop() get Object* argument qdev: Make qdev_get_prop_ptr() get Object* arg qdev: Make bit_prop_set() get Object* argument qdev: Make PropertyInfo.print method get Object* argument qdev: Don't use dev->id on set_size32() error message sparc: Check dev->realized at sparc_set_nwindows() qdev: Check dev->realized at set_size() qdev: Move property code to qdev-properties.[ch] cpu: Move cpu_common_props to hw/core/cpu.c cs4231: Get rid of empty property array netfilter: Use class properties netfilter: Reorder functions can_host: Use class properties arm/cpu64: Register "aarch64" as class property virt: Register "its" as class property ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
69e92bd558
|
@ -344,7 +344,7 @@ F: tests/tcg/x86_64/
|
|||
F: hw/i386/
|
||||
F: disas/i386.c
|
||||
F: docs/system/cpu-models-x86.rst.inc
|
||||
T: git https://github.com/ehabkost/qemu.git x86-next
|
||||
T: git https://gitlab.com/ehabkost/qemu.git x86-next
|
||||
|
||||
Xtensa TCG CPUs
|
||||
M: Max Filippov <jcmvbkbc@gmail.com>
|
||||
|
@ -1557,7 +1557,7 @@ F: include/hw/boards.h
|
|||
F: include/hw/core/cpu.h
|
||||
F: include/hw/cpu/cluster.h
|
||||
F: include/sysemu/numa.h
|
||||
T: git https://github.com/ehabkost/qemu.git machine-next
|
||||
T: git https://gitlab.com/ehabkost/qemu.git machine-next
|
||||
|
||||
Xtensa Machines
|
||||
---------------
|
||||
|
@ -2412,7 +2412,7 @@ M: Igor Mammedov <imammedo@redhat.com>
|
|||
S: Maintained
|
||||
F: backends/hostmem*.c
|
||||
F: include/sysemu/hostmem.h
|
||||
T: git https://github.com/ehabkost/qemu.git machine-next
|
||||
T: git https://gitlab.com/ehabkost/qemu.git machine-next
|
||||
|
||||
Cryptodev Backends
|
||||
M: Gonglei <arei.gonglei@huawei.com>
|
||||
|
|
|
@ -35,8 +35,7 @@
|
|||
static void get_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
TPMBackend **be = qdev_get_prop_ptr(dev, opaque);
|
||||
TPMBackend **be = qdev_get_prop_ptr(obj, opaque);
|
||||
char *p;
|
||||
|
||||
p = g_strdup(*be ? (*be)->id : "");
|
||||
|
@ -49,7 +48,7 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
TPMBackend *s, **be = qdev_get_prop_ptr(dev, prop);
|
||||
TPMBackend *s, **be = qdev_get_prop_ptr(obj, prop);
|
||||
char *str;
|
||||
|
||||
if (dev->realized) {
|
||||
|
@ -73,9 +72,8 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
|
||||
static void release_tpm(Object *obj, const char *name, void *opaque)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
TPMBackend **be = qdev_get_prop_ptr(dev, prop);
|
||||
TPMBackend **be = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (*be) {
|
||||
tpm_backend_reset(*be);
|
||||
|
|
15
cpu.c
15
cpu.c
|
@ -144,21 +144,6 @@ void cpu_exec_unrealizefn(CPUState *cpu)
|
|||
#endif
|
||||
}
|
||||
|
||||
Property cpu_common_props[] = {
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
/* Create a memory property for softmmu CPU object,
|
||||
* so users can wire up its memory. (This can't go in hw/core/cpu.c
|
||||
* because that file is compiled only once for both user-mode
|
||||
* and system builds.) The default if no link is set up is to use
|
||||
* the system address space.
|
||||
*/
|
||||
DEFINE_PROP_LINK("memory", CPUState, memory, TYPE_MEMORY_REGION,
|
||||
MemoryRegion *),
|
||||
#endif
|
||||
DEFINE_PROP_BOOL("start-powered-off", CPUState, start_powered_off, false),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
void cpu_exec_initfn(CPUState *cpu)
|
||||
{
|
||||
cpu->as = NULL;
|
||||
|
|
|
@ -756,11 +756,6 @@ static void vexpress_instance_init(Object *obj)
|
|||
|
||||
/* EL3 is enabled by default on vexpress */
|
||||
vms->secure = true;
|
||||
object_property_add_bool(obj, "secure", vexpress_get_secure,
|
||||
vexpress_set_secure);
|
||||
object_property_set_description(obj, "secure",
|
||||
"Set on/off to enable/disable the ARM "
|
||||
"Security Extensions (TrustZone)");
|
||||
}
|
||||
|
||||
static void vexpress_a15_instance_init(Object *obj)
|
||||
|
@ -772,12 +767,6 @@ static void vexpress_a15_instance_init(Object *obj)
|
|||
* but can also be specifically set to on or off.
|
||||
*/
|
||||
vms->virt = true;
|
||||
object_property_add_bool(obj, "virtualization", vexpress_get_virt,
|
||||
vexpress_set_virt);
|
||||
object_property_set_description(obj, "virtualization",
|
||||
"Set on/off to enable/disable the ARM "
|
||||
"Virtualization Extensions "
|
||||
"(defaults to same as 'secure')");
|
||||
}
|
||||
|
||||
static void vexpress_a9_instance_init(Object *obj)
|
||||
|
@ -797,6 +786,12 @@ static void vexpress_class_init(ObjectClass *oc, void *data)
|
|||
mc->max_cpus = 4;
|
||||
mc->ignore_memory_transaction_failures = true;
|
||||
mc->default_ram_id = "vexpress.highmem";
|
||||
|
||||
object_class_property_add_bool(oc, "secure", vexpress_get_secure,
|
||||
vexpress_set_secure);
|
||||
object_class_property_set_description(oc, "secure",
|
||||
"Set on/off to enable/disable the ARM "
|
||||
"Security Extensions (TrustZone)");
|
||||
}
|
||||
|
||||
static void vexpress_a9_class_init(ObjectClass *oc, void *data)
|
||||
|
@ -819,6 +814,14 @@ static void vexpress_a15_class_init(ObjectClass *oc, void *data)
|
|||
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
|
||||
|
||||
vmc->daughterboard = &a15_daughterboard;
|
||||
|
||||
object_class_property_add_bool(oc, "virtualization", vexpress_get_virt,
|
||||
vexpress_set_virt);
|
||||
object_class_property_set_description(oc, "virtualization",
|
||||
"Set on/off to enable/disable the ARM "
|
||||
"Virtualization Extensions "
|
||||
"(defaults to same as 'secure')");
|
||||
|
||||
}
|
||||
|
||||
static const TypeInfo vexpress_info = {
|
||||
|
|
|
@ -2490,6 +2490,54 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
|||
NULL, NULL);
|
||||
object_class_property_set_description(oc, "acpi",
|
||||
"Enable ACPI");
|
||||
object_class_property_add_bool(oc, "secure", virt_get_secure,
|
||||
virt_set_secure);
|
||||
object_class_property_set_description(oc, "secure",
|
||||
"Set on/off to enable/disable the ARM "
|
||||
"Security Extensions (TrustZone)");
|
||||
|
||||
object_class_property_add_bool(oc, "virtualization", virt_get_virt,
|
||||
virt_set_virt);
|
||||
object_class_property_set_description(oc, "virtualization",
|
||||
"Set on/off to enable/disable emulating a "
|
||||
"guest CPU which implements the ARM "
|
||||
"Virtualization Extensions");
|
||||
|
||||
object_class_property_add_bool(oc, "highmem", virt_get_highmem,
|
||||
virt_set_highmem);
|
||||
object_class_property_set_description(oc, "highmem",
|
||||
"Set on/off to enable/disable using "
|
||||
"physical address space above 32 bits");
|
||||
|
||||
object_class_property_add_str(oc, "gic-version", virt_get_gic_version,
|
||||
virt_set_gic_version);
|
||||
object_class_property_set_description(oc, "gic-version",
|
||||
"Set GIC version. "
|
||||
"Valid values are 2, 3, host and max");
|
||||
|
||||
object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu);
|
||||
object_class_property_set_description(oc, "iommu",
|
||||
"Set the IOMMU type. "
|
||||
"Valid values are none and smmuv3");
|
||||
|
||||
object_class_property_add_bool(oc, "ras", virt_get_ras,
|
||||
virt_set_ras);
|
||||
object_class_property_set_description(oc, "ras",
|
||||
"Set on/off to enable/disable reporting host memory errors "
|
||||
"to a KVM guest using ACPI and guest external abort exceptions");
|
||||
|
||||
object_class_property_add_bool(oc, "mte", virt_get_mte, virt_set_mte);
|
||||
object_class_property_set_description(oc, "mte",
|
||||
"Set on/off to enable/disable emulating a "
|
||||
"guest CPU which implements the ARM "
|
||||
"Memory Tagging Extension");
|
||||
|
||||
object_class_property_add_bool(oc, "its", virt_get_its,
|
||||
virt_set_its);
|
||||
object_class_property_set_description(oc, "its",
|
||||
"Set on/off to enable/disable "
|
||||
"ITS instantiation");
|
||||
|
||||
}
|
||||
|
||||
static void virt_instance_init(Object *obj)
|
||||
|
@ -2502,34 +2550,13 @@ static void virt_instance_init(Object *obj)
|
|||
* boot UEFI blobs which assume no TrustZone support.
|
||||
*/
|
||||
vms->secure = false;
|
||||
object_property_add_bool(obj, "secure", virt_get_secure,
|
||||
virt_set_secure);
|
||||
object_property_set_description(obj, "secure",
|
||||
"Set on/off to enable/disable the ARM "
|
||||
"Security Extensions (TrustZone)");
|
||||
|
||||
/* EL2 is also disabled by default, for similar reasons */
|
||||
vms->virt = false;
|
||||
object_property_add_bool(obj, "virtualization", virt_get_virt,
|
||||
virt_set_virt);
|
||||
object_property_set_description(obj, "virtualization",
|
||||
"Set on/off to enable/disable emulating a "
|
||||
"guest CPU which implements the ARM "
|
||||
"Virtualization Extensions");
|
||||
|
||||
/* High memory is enabled by default */
|
||||
vms->highmem = true;
|
||||
object_property_add_bool(obj, "highmem", virt_get_highmem,
|
||||
virt_set_highmem);
|
||||
object_property_set_description(obj, "highmem",
|
||||
"Set on/off to enable/disable using "
|
||||
"physical address space above 32 bits");
|
||||
vms->gic_version = VIRT_GIC_VERSION_NOSEL;
|
||||
object_property_add_str(obj, "gic-version", virt_get_gic_version,
|
||||
virt_set_gic_version);
|
||||
object_property_set_description(obj, "gic-version",
|
||||
"Set GIC version. "
|
||||
"Valid values are 2, 3, host and max");
|
||||
|
||||
vms->highmem_ecam = !vmc->no_highmem_ecam;
|
||||
|
||||
|
@ -2538,35 +2565,16 @@ static void virt_instance_init(Object *obj)
|
|||
} else {
|
||||
/* Default allows ITS instantiation */
|
||||
vms->its = true;
|
||||
object_property_add_bool(obj, "its", virt_get_its,
|
||||
virt_set_its);
|
||||
object_property_set_description(obj, "its",
|
||||
"Set on/off to enable/disable "
|
||||
"ITS instantiation");
|
||||
}
|
||||
|
||||
/* Default disallows iommu instantiation */
|
||||
vms->iommu = VIRT_IOMMU_NONE;
|
||||
object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu);
|
||||
object_property_set_description(obj, "iommu",
|
||||
"Set the IOMMU type. "
|
||||
"Valid values are none and smmuv3");
|
||||
|
||||
/* Default disallows RAS instantiation */
|
||||
vms->ras = false;
|
||||
object_property_add_bool(obj, "ras", virt_get_ras,
|
||||
virt_set_ras);
|
||||
object_property_set_description(obj, "ras",
|
||||
"Set on/off to enable/disable reporting host memory errors "
|
||||
"to a KVM guest using ACPI and guest external abort exceptions");
|
||||
|
||||
/* MTE is disabled by default. */
|
||||
vms->mte = false;
|
||||
object_property_add_bool(obj, "mte", virt_get_mte, virt_set_mte);
|
||||
object_property_set_description(obj, "mte",
|
||||
"Set on/off to enable/disable emulating a "
|
||||
"guest CPU which implements the ARM "
|
||||
"Memory Tagging Extension");
|
||||
|
||||
vms->irqmap = a15irqmap;
|
||||
|
||||
|
|
|
@ -335,9 +335,8 @@ static char *disk_to_vbd_name(unsigned int disk)
|
|||
static void xen_block_get_vdev(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
XenBlockVdev *vdev = qdev_get_prop_ptr(dev, prop);
|
||||
XenBlockVdev *vdev = qdev_get_prop_ptr(obj, prop);
|
||||
char *str;
|
||||
|
||||
switch (vdev->type) {
|
||||
|
@ -398,7 +397,7 @@ static void xen_block_set_vdev(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
XenBlockVdev *vdev = qdev_get_prop_ptr(dev, prop);
|
||||
XenBlockVdev *vdev = qdev_get_prop_ptr(obj, prop);
|
||||
char *str, *p;
|
||||
const char *end;
|
||||
|
||||
|
|
|
@ -393,6 +393,21 @@ static vaddr cpu_adjust_watchpoint_address(CPUState *cpu, vaddr addr, int len)
|
|||
return addr;
|
||||
}
|
||||
|
||||
static Property cpu_common_props[] = {
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
/* Create a memory property for softmmu CPU object,
|
||||
* so users can wire up its memory. (This can't go in hw/core/cpu.c
|
||||
* because that file is compiled only once for both user-mode
|
||||
* and system builds.) The default if no link is set up is to use
|
||||
* the system address space.
|
||||
*/
|
||||
DEFINE_PROP_LINK("memory", CPUState, memory, TYPE_MEMORY_REGION,
|
||||
MemoryRegion *),
|
||||
#endif
|
||||
DEFINE_PROP_BOOL("start-powered-off", CPUState, start_powered_off, false),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static void cpu_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
|
|
@ -20,8 +20,6 @@ void qdev_propinfo_set_default_value_int(ObjectProperty *op,
|
|||
void qdev_propinfo_set_default_value_uint(ObjectProperty *op,
|
||||
const Property *prop);
|
||||
|
||||
void qdev_propinfo_get_uint16(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp);
|
||||
void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp);
|
||||
void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "qemu/ctype.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/uuid.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qdev-prop-internal.h"
|
||||
|
||||
|
@ -32,11 +33,11 @@
|
|||
#include "hw/pci/pci.h"
|
||||
#include "util/block-helpers.h"
|
||||
|
||||
static bool check_prop_still_unset(DeviceState *dev, const char *name,
|
||||
static bool check_prop_still_unset(Object *obj, const char *name,
|
||||
const void *old_val, const char *new_val,
|
||||
Error **errp)
|
||||
{
|
||||
const GlobalProperty *prop = qdev_find_global_prop(dev, name);
|
||||
const GlobalProperty *prop = qdev_find_global_prop(obj, name);
|
||||
|
||||
if (!old_val) {
|
||||
return true;
|
||||
|
@ -59,9 +60,8 @@ static bool check_prop_still_unset(DeviceState *dev, const char *name,
|
|||
static void get_drive(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
void **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
void **ptr = qdev_get_prop_ptr(obj, prop);
|
||||
const char *value;
|
||||
char *p;
|
||||
|
||||
|
@ -87,7 +87,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
void **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
void **ptr = qdev_get_prop_ptr(obj, prop);
|
||||
char *str;
|
||||
BlockBackend *blk;
|
||||
bool blk_created = false;
|
||||
|
@ -106,7 +106,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,
|
|||
* TODO Should this really be an error? If no, the old value
|
||||
* needs to be released before we store the new one.
|
||||
*/
|
||||
if (!check_prop_still_unset(dev, name, *ptr, str, errp)) {
|
||||
if (!check_prop_still_unset(obj, name, *ptr, str, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -185,7 +185,7 @@ static void release_drive(Object *obj, const char *name, void *opaque)
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
BlockBackend **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
BlockBackend **ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (*ptr) {
|
||||
AioContext *ctx = blk_get_aio_context(*ptr);
|
||||
|
@ -218,8 +218,7 @@ const PropertyInfo qdev_prop_drive_iothread = {
|
|||
static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
CharBackend *be = qdev_get_prop_ptr(dev, opaque);
|
||||
CharBackend *be = qdev_get_prop_ptr(obj, opaque);
|
||||
char *p;
|
||||
|
||||
p = g_strdup(be->chr && be->chr->label ? be->chr->label : "");
|
||||
|
@ -232,7 +231,7 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
CharBackend *be = qdev_get_prop_ptr(dev, prop);
|
||||
CharBackend *be = qdev_get_prop_ptr(obj, prop);
|
||||
Chardev *s;
|
||||
char *str;
|
||||
|
||||
|
@ -249,7 +248,7 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
* TODO Should this really be an error? If no, the old value
|
||||
* needs to be released before we store the new one.
|
||||
*/
|
||||
if (!check_prop_still_unset(dev, name, be->chr, str, errp)) {
|
||||
if (!check_prop_still_unset(obj, name, be->chr, str, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -272,9 +271,8 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
|
||||
static void release_chr(Object *obj, const char *name, void *opaque)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
CharBackend *be = qdev_get_prop_ptr(dev, prop);
|
||||
CharBackend *be = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
qemu_chr_fe_deinit(be, false);
|
||||
}
|
||||
|
@ -297,9 +295,8 @@ const PropertyInfo qdev_prop_chr = {
|
|||
static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
MACAddr *mac = qdev_get_prop_ptr(dev, prop);
|
||||
MACAddr *mac = qdev_get_prop_ptr(obj, prop);
|
||||
char buffer[2 * 6 + 5 + 1];
|
||||
char *p = buffer;
|
||||
|
||||
|
@ -315,7 +312,7 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
MACAddr *mac = qdev_get_prop_ptr(dev, prop);
|
||||
MACAddr *mac = qdev_get_prop_ptr(obj, prop);
|
||||
int i, pos;
|
||||
char *str;
|
||||
const char *p;
|
||||
|
@ -356,7 +353,7 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
return;
|
||||
|
||||
inval:
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, obj, prop, str);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
|
@ -381,9 +378,8 @@ void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
|
|||
static void get_netdev(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
|
||||
NICPeers *peers_ptr = qdev_get_prop_ptr(obj, prop);
|
||||
char *p = g_strdup(peers_ptr->ncs[0] ? peers_ptr->ncs[0]->name : "");
|
||||
|
||||
visit_type_str(v, name, &p, errp);
|
||||
|
@ -395,7 +391,7 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
|
||||
NICPeers *peers_ptr = qdev_get_prop_ptr(obj, prop);
|
||||
NetClientState **ncs = peers_ptr->ncs;
|
||||
NetClientState *peers[MAX_QUEUE_NUM];
|
||||
int queues, err = 0, i = 0;
|
||||
|
@ -434,7 +430,7 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
|
|||
* TODO Should this really be an error? If no, the old value
|
||||
* needs to be released before we store the new one.
|
||||
*/
|
||||
if (!check_prop_still_unset(dev, name, ncs[i], str, errp)) {
|
||||
if (!check_prop_still_unset(obj, name, ncs[i], str, errp)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -445,7 +441,7 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
|
|||
peers_ptr->queues = queues;
|
||||
|
||||
out:
|
||||
error_set_from_qdev_prop_error(errp, err, dev, prop, str);
|
||||
error_set_from_qdev_prop_error(errp, err, obj, prop, str);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
|
@ -461,9 +457,8 @@ const PropertyInfo qdev_prop_netdev = {
|
|||
static void get_audiodev(Object *obj, Visitor *v, const char* name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop);
|
||||
QEMUSoundCard *card = qdev_get_prop_ptr(obj, prop);
|
||||
char *p = g_strdup(audio_get_id(card));
|
||||
|
||||
visit_type_str(v, name, &p, errp);
|
||||
|
@ -475,7 +470,7 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop);
|
||||
QEMUSoundCard *card = qdev_get_prop_ptr(obj, prop);
|
||||
AudioState *state;
|
||||
int err = 0;
|
||||
char *str;
|
||||
|
@ -498,7 +493,7 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,
|
|||
card->state = state;
|
||||
|
||||
out:
|
||||
error_set_from_qdev_prop_error(errp, err, dev, prop, str);
|
||||
error_set_from_qdev_prop_error(errp, err, obj, prop, str);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
|
@ -582,7 +577,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
uint64_t value;
|
||||
Error *local_err = NULL;
|
||||
|
||||
|
@ -674,9 +669,8 @@ const PropertyInfo qdev_prop_multifd_compression = {
|
|||
static void get_reserved_region(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
|
||||
ReservedRegion *rr = qdev_get_prop_ptr(obj, prop);
|
||||
char buffer[64];
|
||||
char *p = buffer;
|
||||
int rc;
|
||||
|
@ -693,7 +687,7 @@ static void set_reserved_region(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
|
||||
ReservedRegion *rr = qdev_get_prop_ptr(obj, prop);
|
||||
Error *local_err = NULL;
|
||||
const char *endptr;
|
||||
char *str;
|
||||
|
@ -761,7 +755,7 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int32_t value, *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
unsigned int slot, fn, n;
|
||||
char *str;
|
||||
|
||||
|
@ -797,14 +791,14 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
|
|||
return;
|
||||
|
||||
invalid:
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, obj, prop, str);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest,
|
||||
static int print_pci_devfn(Object *obj, Property *prop, char *dest,
|
||||
size_t len)
|
||||
{
|
||||
int32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (*ptr == -1) {
|
||||
return snprintf(dest, len, "<unset>");
|
||||
|
@ -827,9 +821,8 @@ const PropertyInfo qdev_prop_pci_devfn = {
|
|||
static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
|
||||
PCIHostDeviceAddress *addr = qdev_get_prop_ptr(obj, prop);
|
||||
char buffer[] = "ffff:ff:ff.f";
|
||||
char *p = buffer;
|
||||
int rc = 0;
|
||||
|
@ -856,7 +849,7 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
|
||||
PCIHostDeviceAddress *addr = qdev_get_prop_ptr(obj, prop);
|
||||
char *str, *p;
|
||||
char *e;
|
||||
unsigned long val;
|
||||
|
@ -922,7 +915,7 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
|
|||
return;
|
||||
|
||||
inval:
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, obj, prop, str);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
|
@ -950,9 +943,8 @@ const PropertyInfo qdev_prop_off_auto_pcibar = {
|
|||
static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
|
||||
PCIExpLinkSpeed *p = qdev_get_prop_ptr(obj, prop);
|
||||
int speed;
|
||||
|
||||
switch (*p) {
|
||||
|
@ -981,7 +973,7 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
|
||||
PCIExpLinkSpeed *p = qdev_get_prop_ptr(obj, prop);
|
||||
int speed;
|
||||
|
||||
if (dev->realized) {
|
||||
|
@ -1027,9 +1019,8 @@ const PropertyInfo qdev_prop_pcie_link_speed = {
|
|||
static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
|
||||
PCIExpLinkWidth *p = qdev_get_prop_ptr(obj, prop);
|
||||
int width;
|
||||
|
||||
switch (*p) {
|
||||
|
@ -1067,7 +1058,7 @@ static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
|
||||
PCIExpLinkWidth *p = qdev_get_prop_ptr(obj, prop);
|
||||
int width;
|
||||
|
||||
if (dev->realized) {
|
||||
|
@ -1116,3 +1107,59 @@ const PropertyInfo qdev_prop_pcie_link_width = {
|
|||
.set = set_prop_pcielinkwidth,
|
||||
.set_default_value = qdev_propinfo_set_default_value_enum,
|
||||
};
|
||||
|
||||
/* --- UUID --- */
|
||||
|
||||
static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
Property *prop = opaque;
|
||||
QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);
|
||||
char buffer[UUID_FMT_LEN + 1];
|
||||
char *p = buffer;
|
||||
|
||||
qemu_uuid_unparse(uuid, buffer);
|
||||
|
||||
visit_type_str(v, name, &p, errp);
|
||||
}
|
||||
|
||||
#define UUID_VALUE_AUTO "auto"
|
||||
|
||||
static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);
|
||||
char *str;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!visit_type_str(v, name, &str, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(str, UUID_VALUE_AUTO)) {
|
||||
qemu_uuid_generate(uuid);
|
||||
} else if (qemu_uuid_parse(str, uuid) < 0) {
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, obj, prop, str);
|
||||
}
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
static void set_default_uuid_auto(ObjectProperty *op, const Property *prop)
|
||||
{
|
||||
object_property_set_default_str(op, UUID_VALUE_AUTO);
|
||||
}
|
||||
|
||||
const PropertyInfo qdev_prop_uuid = {
|
||||
.name = "str",
|
||||
.description = "UUID (aka GUID) or \"" UUID_VALUE_AUTO
|
||||
"\" for random value (default)",
|
||||
.get = get_uuid,
|
||||
.set = set_uuid,
|
||||
.set_default_value = set_default_uuid_auto,
|
||||
};
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
#include "qemu/ctype.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qapi/visitor.h"
|
||||
#include "qemu/uuid.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qdev-prop-internal.h"
|
||||
|
@ -38,9 +37,9 @@ void qdev_prop_allow_set_link_before_realize(const Object *obj,
|
|||
}
|
||||
}
|
||||
|
||||
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
|
||||
void *qdev_get_prop_ptr(Object *obj, Property *prop)
|
||||
{
|
||||
void *ptr = dev;
|
||||
void *ptr = obj;
|
||||
ptr += prop->offset;
|
||||
return ptr;
|
||||
}
|
||||
|
@ -48,9 +47,8 @@ void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
|
|||
void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
|
||||
}
|
||||
|
@ -60,7 +58,7 @@ void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -92,9 +90,9 @@ static uint32_t qdev_get_prop_mask(Property *prop)
|
|||
return 0x1 << prop->bitnr;
|
||||
}
|
||||
|
||||
static void bit_prop_set(DeviceState *dev, Property *props, bool val)
|
||||
static void bit_prop_set(Object *obj, Property *props, bool val)
|
||||
{
|
||||
uint32_t *p = qdev_get_prop_ptr(dev, props);
|
||||
uint32_t *p = qdev_get_prop_ptr(obj, props);
|
||||
uint32_t mask = qdev_get_prop_mask(props);
|
||||
if (val) {
|
||||
*p |= mask;
|
||||
|
@ -106,9 +104,8 @@ static void bit_prop_set(DeviceState *dev, Property *props, bool val)
|
|||
static void prop_get_bit(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *p = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *p = qdev_get_prop_ptr(obj, prop);
|
||||
bool value = (*p & qdev_get_prop_mask(prop)) != 0;
|
||||
|
||||
visit_type_bool(v, name, &value, errp);
|
||||
|
@ -129,7 +126,7 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
|
|||
if (!visit_type_bool(v, name, &value, errp)) {
|
||||
return;
|
||||
}
|
||||
bit_prop_set(dev, prop, value);
|
||||
bit_prop_set(obj, prop, value);
|
||||
}
|
||||
|
||||
static void set_default_value_bool(ObjectProperty *op, const Property *prop)
|
||||
|
@ -153,9 +150,9 @@ static uint64_t qdev_get_prop_mask64(Property *prop)
|
|||
return 0x1ull << prop->bitnr;
|
||||
}
|
||||
|
||||
static void bit64_prop_set(DeviceState *dev, Property *props, bool val)
|
||||
static void bit64_prop_set(Object *obj, Property *props, bool val)
|
||||
{
|
||||
uint64_t *p = qdev_get_prop_ptr(dev, props);
|
||||
uint64_t *p = qdev_get_prop_ptr(obj, props);
|
||||
uint64_t mask = qdev_get_prop_mask64(props);
|
||||
if (val) {
|
||||
*p |= mask;
|
||||
|
@ -167,9 +164,8 @@ static void bit64_prop_set(DeviceState *dev, Property *props, bool val)
|
|||
static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint64_t *p = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t *p = qdev_get_prop_ptr(obj, prop);
|
||||
bool value = (*p & qdev_get_prop_mask64(prop)) != 0;
|
||||
|
||||
visit_type_bool(v, name, &value, errp);
|
||||
|
@ -190,7 +186,7 @@ static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
|
|||
if (!visit_type_bool(v, name, &value, errp)) {
|
||||
return;
|
||||
}
|
||||
bit64_prop_set(dev, prop, value);
|
||||
bit64_prop_set(obj, prop, value);
|
||||
}
|
||||
|
||||
const PropertyInfo qdev_prop_bit64 = {
|
||||
|
@ -206,9 +202,8 @@ const PropertyInfo qdev_prop_bit64 = {
|
|||
static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
bool *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
bool *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_bool(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -218,7 +213,7 @@ static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
bool *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
bool *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -240,9 +235,8 @@ const PropertyInfo qdev_prop_bool = {
|
|||
static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint8_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_uint8(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -252,7 +246,7 @@ static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint8_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -283,12 +277,11 @@ const PropertyInfo qdev_prop_uint8 = {
|
|||
|
||||
/* --- 16bit integer --- */
|
||||
|
||||
void qdev_propinfo_get_uint16(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
static void get_uint16(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint16_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_uint16(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -298,7 +291,7 @@ static void set_uint16(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint16_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -310,7 +303,7 @@ static void set_uint16(Object *obj, Visitor *v, const char *name,
|
|||
|
||||
const PropertyInfo qdev_prop_uint16 = {
|
||||
.name = "uint16",
|
||||
.get = qdev_propinfo_get_uint16,
|
||||
.get = get_uint16,
|
||||
.set = set_uint16,
|
||||
.set_default_value = qdev_propinfo_set_default_value_uint,
|
||||
};
|
||||
|
@ -320,9 +313,8 @@ const PropertyInfo qdev_prop_uint16 = {
|
|||
static void get_uint32(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_uint32(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -332,7 +324,7 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -345,9 +337,8 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,
|
|||
void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_int32(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -357,7 +348,7 @@ static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -386,9 +377,8 @@ const PropertyInfo qdev_prop_int32 = {
|
|||
static void get_uint64(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_uint64(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -398,7 +388,7 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -411,9 +401,8 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,
|
|||
static void get_int64(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int64_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_int64(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -423,7 +412,7 @@ static void set_int64(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
int64_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
@ -452,15 +441,14 @@ const PropertyInfo qdev_prop_int64 = {
|
|||
static void release_string(Object *obj, const char *name, void *opaque)
|
||||
{
|
||||
Property *prop = opaque;
|
||||
g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
|
||||
g_free(*(char **)qdev_get_prop_ptr(obj, prop));
|
||||
}
|
||||
|
||||
static void get_string(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
char **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
char **ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (!*ptr) {
|
||||
char *str = (char *)"";
|
||||
|
@ -475,7 +463,7 @@ static void set_string(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
char **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
char **ptr = qdev_get_prop_ptr(obj, prop);
|
||||
char *str;
|
||||
|
||||
if (dev->realized) {
|
||||
|
@ -513,9 +501,8 @@ const PropertyInfo qdev_prop_on_off_auto = {
|
|||
void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
uint64_t value = *ptr;
|
||||
|
||||
visit_type_size(v, name, &value, errp);
|
||||
|
@ -526,7 +513,7 @@ static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
uint64_t value;
|
||||
|
||||
if (dev->realized) {
|
||||
|
@ -542,7 +529,7 @@ static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
error_setg(errp,
|
||||
"Property %s.%s doesn't take value %" PRIu64
|
||||
" (maximum: %u)",
|
||||
dev->id ? : "", name, value, UINT32_MAX);
|
||||
object_get_typename(obj), name, value, UINT32_MAX);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -556,63 +543,6 @@ const PropertyInfo qdev_prop_size32 = {
|
|||
.set_default_value = qdev_propinfo_set_default_value_uint,
|
||||
};
|
||||
|
||||
/* --- UUID --- */
|
||||
|
||||
static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);
|
||||
char buffer[UUID_FMT_LEN + 1];
|
||||
char *p = buffer;
|
||||
|
||||
qemu_uuid_unparse(uuid, buffer);
|
||||
|
||||
visit_type_str(v, name, &p, errp);
|
||||
}
|
||||
|
||||
#define UUID_VALUE_AUTO "auto"
|
||||
|
||||
static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);
|
||||
char *str;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!visit_type_str(v, name, &str, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(str, UUID_VALUE_AUTO)) {
|
||||
qemu_uuid_generate(uuid);
|
||||
} else if (qemu_uuid_parse(str, uuid) < 0) {
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
|
||||
}
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
static void set_default_uuid_auto(ObjectProperty *op, const Property *prop)
|
||||
{
|
||||
object_property_set_default_str(op, UUID_VALUE_AUTO);
|
||||
}
|
||||
|
||||
const PropertyInfo qdev_prop_uuid = {
|
||||
.name = "str",
|
||||
.description = "UUID (aka GUID) or \"" UUID_VALUE_AUTO
|
||||
"\" for random value (default)",
|
||||
.get = get_uuid,
|
||||
.set = set_uuid,
|
||||
.set_default_value = set_default_uuid_auto,
|
||||
};
|
||||
|
||||
/* --- support for array properties --- */
|
||||
|
||||
/* Used as an opaque for the object properties we add for each
|
||||
|
@ -651,7 +581,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
|
|||
*/
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *alenptr = qdev_get_prop_ptr(obj, prop);
|
||||
void **arrayptr = (void *)dev + prop->arrayoffset;
|
||||
void *eltptr;
|
||||
const char *arrayname;
|
||||
|
@ -697,7 +627,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
|
|||
* being inside the device struct.
|
||||
*/
|
||||
arrayprop->prop.offset = eltptr - (void *)dev;
|
||||
assert(qdev_get_prop_ptr(dev, &arrayprop->prop) == eltptr);
|
||||
assert(qdev_get_prop_ptr(obj, &arrayprop->prop) == eltptr);
|
||||
object_property_add(obj, propname,
|
||||
arrayprop->prop.info->name,
|
||||
arrayprop->prop.info->get,
|
||||
|
@ -748,22 +678,22 @@ static Property *qdev_prop_find(DeviceState *dev, const char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
|
||||
void error_set_from_qdev_prop_error(Error **errp, int ret, Object *obj,
|
||||
Property *prop, const char *value)
|
||||
{
|
||||
switch (ret) {
|
||||
case -EEXIST:
|
||||
error_setg(errp, "Property '%s.%s' can't take value '%s', it's in use",
|
||||
object_get_typename(OBJECT(dev)), prop->name, value);
|
||||
object_get_typename(obj), prop->name, value);
|
||||
break;
|
||||
default:
|
||||
case -EINVAL:
|
||||
error_setg(errp, QERR_PROPERTY_VALUE_BAD,
|
||||
object_get_typename(OBJECT(dev)), prop->name, value);
|
||||
object_get_typename(obj), prop->name, value);
|
||||
break;
|
||||
case -ENOENT:
|
||||
error_setg(errp, "Property '%s.%s' can't find value '%s'",
|
||||
object_get_typename(OBJECT(dev)), prop->name, value);
|
||||
object_get_typename(obj), prop->name, value);
|
||||
break;
|
||||
case 0:
|
||||
break;
|
||||
|
@ -831,7 +761,7 @@ void qdev_prop_register_global(GlobalProperty *prop)
|
|||
g_ptr_array_add(global_props(), prop);
|
||||
}
|
||||
|
||||
const GlobalProperty *qdev_find_global_prop(DeviceState *dev,
|
||||
const GlobalProperty *qdev_find_global_prop(Object *obj,
|
||||
const char *name)
|
||||
{
|
||||
GPtrArray *props = global_props();
|
||||
|
@ -840,7 +770,7 @@ const GlobalProperty *qdev_find_global_prop(DeviceState *dev,
|
|||
|
||||
for (i = 0; i < props->len; i++) {
|
||||
p = g_ptr_array_index(props, i);
|
||||
if (object_dynamic_cast(OBJECT(dev), p->driver)
|
||||
if (object_dynamic_cast(obj, p->driver)
|
||||
&& !strcmp(p->property, name)) {
|
||||
return p;
|
||||
}
|
||||
|
@ -891,9 +821,8 @@ void qdev_prop_set_globals(DeviceState *dev)
|
|||
static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_size(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -903,7 +832,12 @@ static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_size(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -929,3 +863,122 @@ const PropertyInfo qdev_prop_link = {
|
|||
.name = "link",
|
||||
.create = create_link_property,
|
||||
};
|
||||
|
||||
void qdev_property_add_static(DeviceState *dev, Property *prop)
|
||||
{
|
||||
Object *obj = OBJECT(dev);
|
||||
ObjectProperty *op;
|
||||
|
||||
assert(!prop->info->create);
|
||||
|
||||
op = object_property_add(obj, prop->name, prop->info->name,
|
||||
prop->info->get, prop->info->set,
|
||||
prop->info->release,
|
||||
prop);
|
||||
|
||||
object_property_set_description(obj, prop->name,
|
||||
prop->info->description);
|
||||
|
||||
if (prop->set_default) {
|
||||
prop->info->set_default_value(op, prop);
|
||||
if (op->init) {
|
||||
op->init(obj, op);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void qdev_class_add_property(DeviceClass *klass, Property *prop)
|
||||
{
|
||||
ObjectClass *oc = OBJECT_CLASS(klass);
|
||||
|
||||
if (prop->info->create) {
|
||||
prop->info->create(oc, prop);
|
||||
} else {
|
||||
ObjectProperty *op;
|
||||
|
||||
op = object_class_property_add(oc,
|
||||
prop->name, prop->info->name,
|
||||
prop->info->get, prop->info->set,
|
||||
prop->info->release,
|
||||
prop);
|
||||
if (prop->set_default) {
|
||||
prop->info->set_default_value(op, prop);
|
||||
}
|
||||
}
|
||||
object_class_property_set_description(oc, prop->name,
|
||||
prop->info->description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Legacy property handling
|
||||
*/
|
||||
|
||||
static void qdev_get_legacy_property(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
Property *prop = opaque;
|
||||
|
||||
char buffer[1024];
|
||||
char *ptr = buffer;
|
||||
|
||||
prop->info->print(obj, prop, buffer, sizeof(buffer));
|
||||
visit_type_str(v, name, &ptr, errp);
|
||||
}
|
||||
|
||||
/**
|
||||
* qdev_class_add_legacy_property:
|
||||
* @dev: Device to add the property to.
|
||||
* @prop: The qdev property definition.
|
||||
*
|
||||
* Add a legacy QOM property to @dev for qdev property @prop.
|
||||
*
|
||||
* Legacy properties are string versions of QOM properties. The format of
|
||||
* the string depends on the property type. Legacy properties are only
|
||||
* needed for "info qtree".
|
||||
*
|
||||
* Do not use this in new code! QOM Properties added through this interface
|
||||
* will be given names in the "legacy" namespace.
|
||||
*/
|
||||
static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
|
||||
{
|
||||
g_autofree char *name = NULL;
|
||||
|
||||
/* Register pointer properties as legacy properties */
|
||||
if (!prop->info->print && prop->info->get) {
|
||||
return;
|
||||
}
|
||||
|
||||
name = g_strdup_printf("legacy-%s", prop->name);
|
||||
object_class_property_add(OBJECT_CLASS(dc), name, "str",
|
||||
prop->info->print ? qdev_get_legacy_property : prop->info->get,
|
||||
NULL, NULL, prop);
|
||||
}
|
||||
|
||||
void device_class_set_props(DeviceClass *dc, Property *props)
|
||||
{
|
||||
Property *prop;
|
||||
|
||||
dc->props_ = props;
|
||||
for (prop = props; prop && prop->name; prop++) {
|
||||
qdev_class_add_legacy_property(dc, prop);
|
||||
qdev_class_add_property(dc, prop);
|
||||
}
|
||||
}
|
||||
|
||||
void qdev_alias_all_properties(DeviceState *target, Object *source)
|
||||
{
|
||||
ObjectClass *class;
|
||||
Property *prop;
|
||||
|
||||
class = object_get_class(OBJECT(target));
|
||||
do {
|
||||
DeviceClass *dc = DEVICE_CLASS(class);
|
||||
|
||||
for (prop = dc->props_; prop && prop->name; prop++) {
|
||||
object_property_add_alias(source, prop->name,
|
||||
OBJECT(target), prop->name);
|
||||
}
|
||||
class = object_class_get_parent(class);
|
||||
} while (class != object_class_by_name(TYPE_DEVICE));
|
||||
}
|
||||
|
|
120
hw/core/qdev.c
120
hw/core/qdev.c
|
@ -705,115 +705,6 @@ char *qdev_get_dev_path(DeviceState *dev)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Legacy property handling
|
||||
*/
|
||||
|
||||
static void qdev_get_legacy_property(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
|
||||
char buffer[1024];
|
||||
char *ptr = buffer;
|
||||
|
||||
prop->info->print(dev, prop, buffer, sizeof(buffer));
|
||||
visit_type_str(v, name, &ptr, errp);
|
||||
}
|
||||
|
||||
/**
|
||||
* qdev_class_add_legacy_property:
|
||||
* @dev: Device to add the property to.
|
||||
* @prop: The qdev property definition.
|
||||
*
|
||||
* Add a legacy QOM property to @dev for qdev property @prop.
|
||||
*
|
||||
* Legacy properties are string versions of QOM properties. The format of
|
||||
* the string depends on the property type. Legacy properties are only
|
||||
* needed for "info qtree".
|
||||
*
|
||||
* Do not use this in new code! QOM Properties added through this interface
|
||||
* will be given names in the "legacy" namespace.
|
||||
*/
|
||||
static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
|
||||
{
|
||||
g_autofree char *name = NULL;
|
||||
|
||||
/* Register pointer properties as legacy properties */
|
||||
if (!prop->info->print && prop->info->get) {
|
||||
return;
|
||||
}
|
||||
|
||||
name = g_strdup_printf("legacy-%s", prop->name);
|
||||
object_class_property_add(OBJECT_CLASS(dc), name, "str",
|
||||
prop->info->print ? qdev_get_legacy_property : prop->info->get,
|
||||
NULL, NULL, prop);
|
||||
}
|
||||
|
||||
void qdev_property_add_static(DeviceState *dev, Property *prop)
|
||||
{
|
||||
Object *obj = OBJECT(dev);
|
||||
ObjectProperty *op;
|
||||
|
||||
assert(!prop->info->create);
|
||||
|
||||
op = object_property_add(obj, prop->name, prop->info->name,
|
||||
prop->info->get, prop->info->set,
|
||||
prop->info->release,
|
||||
prop);
|
||||
|
||||
object_property_set_description(obj, prop->name,
|
||||
prop->info->description);
|
||||
|
||||
if (prop->set_default) {
|
||||
prop->info->set_default_value(op, prop);
|
||||
if (op->init) {
|
||||
op->init(obj, op);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void qdev_class_add_property(DeviceClass *klass, Property *prop)
|
||||
{
|
||||
ObjectClass *oc = OBJECT_CLASS(klass);
|
||||
|
||||
if (prop->info->create) {
|
||||
prop->info->create(oc, prop);
|
||||
} else {
|
||||
ObjectProperty *op;
|
||||
|
||||
op = object_class_property_add(oc,
|
||||
prop->name, prop->info->name,
|
||||
prop->info->get, prop->info->set,
|
||||
prop->info->release,
|
||||
prop);
|
||||
if (prop->set_default) {
|
||||
prop->info->set_default_value(op, prop);
|
||||
}
|
||||
}
|
||||
object_class_property_set_description(oc, prop->name,
|
||||
prop->info->description);
|
||||
}
|
||||
|
||||
void qdev_alias_all_properties(DeviceState *target, Object *source)
|
||||
{
|
||||
ObjectClass *class;
|
||||
Property *prop;
|
||||
|
||||
class = object_get_class(OBJECT(target));
|
||||
do {
|
||||
DeviceClass *dc = DEVICE_CLASS(class);
|
||||
|
||||
for (prop = dc->props_; prop && prop->name; prop++) {
|
||||
object_property_add_alias(source, prop->name,
|
||||
OBJECT(target), prop->name);
|
||||
}
|
||||
class = object_class_get_parent(class);
|
||||
} while (class != object_class_by_name(TYPE_DEVICE));
|
||||
}
|
||||
|
||||
static bool device_get_realized(Object *obj, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
|
@ -1208,17 +1099,6 @@ static void device_class_init(ObjectClass *class, void *data)
|
|||
offsetof(DeviceState, parent_bus), NULL, 0);
|
||||
}
|
||||
|
||||
void device_class_set_props(DeviceClass *dc, Property *props)
|
||||
{
|
||||
Property *prop;
|
||||
|
||||
dc->props_ = props;
|
||||
for (prop = props; prop && prop->name; prop++) {
|
||||
qdev_class_add_legacy_property(dc, prop);
|
||||
qdev_class_add_property(dc, prop);
|
||||
}
|
||||
}
|
||||
|
||||
void device_class_set_parent_reset(DeviceClass *dc,
|
||||
DeviceReset dev_reset,
|
||||
DeviceReset *parent_reset)
|
||||
|
|
|
@ -337,22 +337,6 @@ static void tmp421_realize(DeviceState *dev, Error **errp)
|
|||
tmp421_reset(&s->i2c);
|
||||
}
|
||||
|
||||
static void tmp421_initfn(Object *obj)
|
||||
{
|
||||
object_property_add(obj, "temperature0", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
object_property_add(obj, "temperature1", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
object_property_add(obj, "temperature2", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
object_property_add(obj, "temperature3", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
}
|
||||
|
||||
static void tmp421_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
@ -365,6 +349,19 @@ static void tmp421_class_init(ObjectClass *klass, void *data)
|
|||
k->send = tmp421_tx;
|
||||
dc->vmsd = &vmstate_tmp421;
|
||||
sc->dev = (DeviceInfo *) data;
|
||||
|
||||
object_class_property_add(klass, "temperature0", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
object_class_property_add(klass, "temperature1", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
object_class_property_add(klass, "temperature2", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
object_class_property_add(klass, "temperature3", "int",
|
||||
tmp421_get_temperature,
|
||||
tmp421_set_temperature, NULL, NULL);
|
||||
}
|
||||
|
||||
static const TypeInfo tmp421_info = {
|
||||
|
@ -372,7 +369,6 @@ static const TypeInfo tmp421_info = {
|
|||
.parent = TYPE_I2C_SLAVE,
|
||||
.instance_size = sizeof(TMP421State),
|
||||
.class_size = sizeof(TMP421Class),
|
||||
.instance_init = tmp421_initfn,
|
||||
.abstract = true,
|
||||
};
|
||||
|
||||
|
|
|
@ -2343,9 +2343,8 @@ void css_reset(void)
|
|||
static void get_css_devid(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
CssDevId *dev_id = qdev_get_prop_ptr(dev, prop);
|
||||
CssDevId *dev_id = qdev_get_prop_ptr(obj, prop);
|
||||
char buffer[] = "xx.x.xxxx";
|
||||
char *p = buffer;
|
||||
int r;
|
||||
|
@ -2375,7 +2374,7 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
CssDevId *dev_id = qdev_get_prop_ptr(dev, prop);
|
||||
CssDevId *dev_id = qdev_get_prop_ptr(obj, prop);
|
||||
char *str;
|
||||
int num, n1, n2;
|
||||
unsigned int cssid, ssid, devid;
|
||||
|
@ -2391,7 +2390,7 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,
|
|||
|
||||
num = sscanf(str, "%2x.%1x%n.%4x%n", &cssid, &ssid, &n1, &devid, &n2);
|
||||
if (num != 3 || (n2 - n1) != 5 || strlen(str) != n2) {
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
|
||||
error_set_from_qdev_prop_error(errp, EINVAL, obj, prop, str);
|
||||
goto out;
|
||||
}
|
||||
if ((cssid > MAX_CSSID) || (ssid > MAX_SSID)) {
|
||||
|
|
|
@ -1330,7 +1330,7 @@ static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name,
|
|||
void *opaque, Error **errp)
|
||||
{
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(DEVICE(obj), prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_uint32(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -1341,7 +1341,7 @@ static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,
|
|||
DeviceState *dev = DEVICE(obj);
|
||||
S390PCIBusDevice *zpci = S390_PCI_DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
|
|
@ -1488,9 +1488,8 @@ static void get_nv_gpudirect_clique_id(Object *obj, Visitor *v,
|
|||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint8_t *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
visit_type_uint8(v, name, ptr, errp);
|
||||
}
|
||||
|
@ -1501,7 +1500,7 @@ static void set_nv_gpudirect_clique_id(Object *obj, Visitor *v,
|
|||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint8_t value, *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint8_t value, *ptr = qdev_get_prop_ptr(obj, prop);
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
|
|
|
@ -1111,7 +1111,6 @@ AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx);
|
|||
|
||||
void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...)
|
||||
GCC_FMT_ATTR(2, 3);
|
||||
extern Property cpu_common_props[];
|
||||
void cpu_exec_initfn(CPUState *cpu);
|
||||
void cpu_exec_realizefn(CPUState *cpu, Error **errp);
|
||||
void cpu_exec_unrealizefn(CPUState *cpu);
|
||||
|
|
|
@ -276,43 +276,6 @@ struct BusState {
|
|||
ResettableState reset;
|
||||
};
|
||||
|
||||
/**
|
||||
* 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;
|
||||
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;
|
||||
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
|
||||
void (*set_default_value)(ObjectProperty *op, const Property *prop);
|
||||
void (*create)(ObjectClass *oc, Property *prop);
|
||||
ObjectPropertyAccessor *get;
|
||||
ObjectPropertyAccessor *set;
|
||||
ObjectPropertyRelease *release;
|
||||
};
|
||||
|
||||
/**
|
||||
* GlobalProperty:
|
||||
* @used: Set to true if property was used when initializing a device.
|
||||
|
|
|
@ -3,6 +3,44 @@
|
|||
|
||||
#include "hw/qdev-core.h"
|
||||
|
||||
/**
|
||||
* 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;
|
||||
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;
|
||||
int (*print)(Object *obj, Property *prop, char *dest, size_t len);
|
||||
void (*set_default_value)(ObjectProperty *op, const Property *prop);
|
||||
void (*create)(ObjectClass *oc, Property *prop);
|
||||
ObjectPropertyAccessor *get;
|
||||
ObjectPropertyAccessor *set;
|
||||
ObjectPropertyRelease *release;
|
||||
};
|
||||
|
||||
|
||||
/*** qdev-properties.c ***/
|
||||
|
||||
extern const PropertyInfo qdev_prop_bit;
|
||||
|
@ -264,14 +302,14 @@ void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
|
|||
const uint8_t *value);
|
||||
void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
|
||||
|
||||
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
|
||||
void *qdev_get_prop_ptr(Object *obj, Property *prop);
|
||||
|
||||
void qdev_prop_register_global(GlobalProperty *prop);
|
||||
const GlobalProperty *qdev_find_global_prop(DeviceState *dev,
|
||||
const GlobalProperty *qdev_find_global_prop(Object *obj,
|
||||
const char *name);
|
||||
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,
|
||||
void error_set_from_qdev_prop_error(Error **errp, int ret, Object *obj,
|
||||
Property *prop, const char *value);
|
||||
|
||||
/**
|
||||
|
|
|
@ -77,21 +77,16 @@ static void can_host_complete(UserCreatable *uc, Error **errp)
|
|||
can_host_connect(CAN_HOST(uc), errp);
|
||||
}
|
||||
|
||||
static void can_host_instance_init(Object *obj)
|
||||
{
|
||||
CanHostState *ch = CAN_HOST(obj);
|
||||
|
||||
object_property_add_link(obj, "canbus", TYPE_CAN_BUS,
|
||||
(Object **)&ch->bus,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_STRONG);
|
||||
}
|
||||
|
||||
static void can_host_class_init(ObjectClass *klass,
|
||||
void *class_data G_GNUC_UNUSED)
|
||||
{
|
||||
UserCreatableClass *uc_klass = USER_CREATABLE_CLASS(klass);
|
||||
|
||||
object_class_property_add_link(klass, "canbus", TYPE_CAN_BUS,
|
||||
offsetof(CanHostState, bus),
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_STRONG);
|
||||
|
||||
klass->unparent = can_host_unparent;
|
||||
uc_klass->complete = can_host_complete;
|
||||
}
|
||||
|
@ -102,7 +97,6 @@ static const TypeInfo can_host_info = {
|
|||
.instance_size = sizeof(CanHostState),
|
||||
.class_size = sizeof(CanHostClass),
|
||||
.abstract = true,
|
||||
.instance_init = can_host_instance_init,
|
||||
.class_init = can_host_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_USER_CREATABLE },
|
||||
|
|
10
net/dump.c
10
net/dump.c
|
@ -224,11 +224,6 @@ static void filter_dump_instance_init(Object *obj)
|
|||
NetFilterDumpState *nfds = FILTER_DUMP(obj);
|
||||
|
||||
nfds->maxlen = 65536;
|
||||
|
||||
object_property_add(obj, "maxlen", "uint32", filter_dump_get_maxlen,
|
||||
filter_dump_set_maxlen, NULL, NULL);
|
||||
object_property_add_str(obj, "file", file_dump_get_filename,
|
||||
file_dump_set_filename);
|
||||
}
|
||||
|
||||
static void filter_dump_instance_finalize(Object *obj)
|
||||
|
@ -242,6 +237,11 @@ static void filter_dump_class_init(ObjectClass *oc, void *data)
|
|||
{
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
object_class_property_add(oc, "maxlen", "uint32", filter_dump_get_maxlen,
|
||||
filter_dump_set_maxlen, NULL, NULL);
|
||||
object_class_property_add_str(oc, "file", file_dump_get_filename,
|
||||
file_dump_set_filename);
|
||||
|
||||
nfc->setup = filter_dump_setup;
|
||||
nfc->cleanup = filter_dump_cleanup;
|
||||
nfc->receive_iov = filter_dump_receive_iov;
|
||||
|
|
|
@ -144,16 +144,6 @@ static void filter_buffer_status_changed(NetFilterState *nf, Error **errp)
|
|||
}
|
||||
}
|
||||
|
||||
static void filter_buffer_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
nfc->setup = filter_buffer_setup;
|
||||
nfc->cleanup = filter_buffer_cleanup;
|
||||
nfc->receive_iov = filter_buffer_receive_iov;
|
||||
nfc->status_changed = filter_buffer_status_changed;
|
||||
}
|
||||
|
||||
static void filter_buffer_get_interval(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
|
@ -182,18 +172,24 @@ static void filter_buffer_set_interval(Object *obj, Visitor *v,
|
|||
s->interval = value;
|
||||
}
|
||||
|
||||
static void filter_buffer_init(Object *obj)
|
||||
static void filter_buffer_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
object_property_add(obj, "interval", "uint32",
|
||||
filter_buffer_get_interval,
|
||||
filter_buffer_set_interval, NULL, NULL);
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
object_class_property_add(oc, "interval", "uint32",
|
||||
filter_buffer_get_interval,
|
||||
filter_buffer_set_interval, NULL, NULL);
|
||||
|
||||
nfc->setup = filter_buffer_setup;
|
||||
nfc->cleanup = filter_buffer_cleanup;
|
||||
nfc->receive_iov = filter_buffer_receive_iov;
|
||||
nfc->status_changed = filter_buffer_status_changed;
|
||||
}
|
||||
|
||||
static const TypeInfo filter_buffer_info = {
|
||||
.name = TYPE_FILTER_BUFFER,
|
||||
.parent = TYPE_NETFILTER,
|
||||
.class_init = filter_buffer_class_init,
|
||||
.instance_init = filter_buffer_init,
|
||||
.instance_size = sizeof(FilterBufferState),
|
||||
};
|
||||
|
||||
|
|
|
@ -284,24 +284,6 @@ static void filter_redirector_setup(NetFilterState *nf, Error **errp)
|
|||
}
|
||||
}
|
||||
|
||||
static void filter_mirror_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
nfc->setup = filter_mirror_setup;
|
||||
nfc->cleanup = filter_mirror_cleanup;
|
||||
nfc->receive_iov = filter_mirror_receive_iov;
|
||||
}
|
||||
|
||||
static void filter_redirector_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
nfc->setup = filter_redirector_setup;
|
||||
nfc->cleanup = filter_redirector_cleanup;
|
||||
nfc->receive_iov = filter_redirector_receive_iov;
|
||||
}
|
||||
|
||||
static char *filter_redirector_get_indev(Object *obj, Error **errp)
|
||||
{
|
||||
MirrorState *s = FILTER_REDIRECTOR(obj);
|
||||
|
@ -388,32 +370,50 @@ static void filter_redirector_set_vnet_hdr(Object *obj,
|
|||
s->vnet_hdr = value;
|
||||
}
|
||||
|
||||
static void filter_mirror_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
object_class_property_add_str(oc, "outdev", filter_mirror_get_outdev,
|
||||
filter_mirror_set_outdev);
|
||||
object_class_property_add_bool(oc, "vnet_hdr_support",
|
||||
filter_mirror_get_vnet_hdr,
|
||||
filter_mirror_set_vnet_hdr);
|
||||
|
||||
nfc->setup = filter_mirror_setup;
|
||||
nfc->cleanup = filter_mirror_cleanup;
|
||||
nfc->receive_iov = filter_mirror_receive_iov;
|
||||
}
|
||||
|
||||
static void filter_redirector_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
object_class_property_add_str(oc, "indev", filter_redirector_get_indev,
|
||||
filter_redirector_set_indev);
|
||||
object_class_property_add_str(oc, "outdev", filter_redirector_get_outdev,
|
||||
filter_redirector_set_outdev);
|
||||
object_class_property_add_bool(oc, "vnet_hdr_support",
|
||||
filter_redirector_get_vnet_hdr,
|
||||
filter_redirector_set_vnet_hdr);
|
||||
|
||||
nfc->setup = filter_redirector_setup;
|
||||
nfc->cleanup = filter_redirector_cleanup;
|
||||
nfc->receive_iov = filter_redirector_receive_iov;
|
||||
}
|
||||
|
||||
static void filter_mirror_init(Object *obj)
|
||||
{
|
||||
MirrorState *s = FILTER_MIRROR(obj);
|
||||
|
||||
object_property_add_str(obj, "outdev", filter_mirror_get_outdev,
|
||||
filter_mirror_set_outdev);
|
||||
|
||||
s->vnet_hdr = false;
|
||||
object_property_add_bool(obj, "vnet_hdr_support",
|
||||
filter_mirror_get_vnet_hdr,
|
||||
filter_mirror_set_vnet_hdr);
|
||||
}
|
||||
|
||||
static void filter_redirector_init(Object *obj)
|
||||
{
|
||||
MirrorState *s = FILTER_REDIRECTOR(obj);
|
||||
|
||||
object_property_add_str(obj, "indev", filter_redirector_get_indev,
|
||||
filter_redirector_set_indev);
|
||||
object_property_add_str(obj, "outdev", filter_redirector_get_outdev,
|
||||
filter_redirector_set_outdev);
|
||||
|
||||
s->vnet_hdr = false;
|
||||
object_property_add_bool(obj, "vnet_hdr_support",
|
||||
filter_redirector_get_vnet_hdr,
|
||||
filter_redirector_set_vnet_hdr);
|
||||
}
|
||||
|
||||
static void filter_mirror_fini(Object *obj)
|
||||
|
|
|
@ -418,15 +418,16 @@ static void filter_rewriter_init(Object *obj)
|
|||
|
||||
s->vnet_hdr = false;
|
||||
s->failover_mode = FAILOVER_MODE_OFF;
|
||||
object_property_add_bool(obj, "vnet_hdr_support",
|
||||
filter_rewriter_get_vnet_hdr,
|
||||
filter_rewriter_set_vnet_hdr);
|
||||
}
|
||||
|
||||
static void colo_rewriter_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
object_class_property_add_bool(oc, "vnet_hdr_support",
|
||||
filter_rewriter_get_vnet_hdr,
|
||||
filter_rewriter_set_vnet_hdr);
|
||||
|
||||
nfc->setup = colo_rewriter_setup;
|
||||
nfc->cleanup = colo_rewriter_cleanup;
|
||||
nfc->receive_iov = colo_rewriter_receive_iov;
|
||||
|
|
24
net/filter.c
24
net/filter.c
|
@ -212,18 +212,6 @@ static void netfilter_init(Object *obj)
|
|||
nf->on = true;
|
||||
nf->insert_before_flag = false;
|
||||
nf->position = g_strdup("tail");
|
||||
|
||||
object_property_add_str(obj, "netdev",
|
||||
netfilter_get_netdev_id, netfilter_set_netdev_id);
|
||||
object_property_add_enum(obj, "queue", "NetFilterDirection",
|
||||
&NetFilterDirection_lookup,
|
||||
netfilter_get_direction, netfilter_set_direction);
|
||||
object_property_add_str(obj, "status",
|
||||
netfilter_get_status, netfilter_set_status);
|
||||
object_property_add_str(obj, "position",
|
||||
netfilter_get_position, netfilter_set_position);
|
||||
object_property_add_str(obj, "insert",
|
||||
netfilter_get_insert, netfilter_set_insert);
|
||||
}
|
||||
|
||||
static void netfilter_complete(UserCreatable *uc, Error **errp)
|
||||
|
@ -350,6 +338,18 @@ static void netfilter_class_init(ObjectClass *oc, void *data)
|
|||
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
object_class_property_add_str(oc, "netdev",
|
||||
netfilter_get_netdev_id, netfilter_set_netdev_id);
|
||||
object_class_property_add_enum(oc, "queue", "NetFilterDirection",
|
||||
&NetFilterDirection_lookup,
|
||||
netfilter_get_direction, netfilter_set_direction);
|
||||
object_class_property_add_str(oc, "status",
|
||||
netfilter_get_status, netfilter_set_status);
|
||||
object_class_property_add_str(oc, "position",
|
||||
netfilter_get_position, netfilter_set_position);
|
||||
object_class_property_add_str(oc, "insert",
|
||||
netfilter_get_insert, netfilter_set_insert);
|
||||
|
||||
ucc->complete = netfilter_complete;
|
||||
nfc->handle_event = default_handle_event;
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "migration/misc.h"
|
||||
#include "migration/migration.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/clock.h"
|
||||
|
||||
/*
|
||||
|
|
|
@ -762,15 +762,6 @@ static void aarch64_cpu_set_aarch64(Object *obj, bool value, Error **errp)
|
|||
}
|
||||
}
|
||||
|
||||
static void aarch64_cpu_initfn(Object *obj)
|
||||
{
|
||||
object_property_add_bool(obj, "aarch64", aarch64_cpu_get_aarch64,
|
||||
aarch64_cpu_set_aarch64);
|
||||
object_property_set_description(obj, "aarch64",
|
||||
"Set on/off to enable/disable aarch64 "
|
||||
"execution state ");
|
||||
}
|
||||
|
||||
static void aarch64_cpu_finalizefn(Object *obj)
|
||||
{
|
||||
}
|
||||
|
@ -790,6 +781,12 @@ static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
|
|||
cc->gdb_num_core_regs = 34;
|
||||
cc->gdb_core_xml_file = "aarch64-core.xml";
|
||||
cc->gdb_arch_name = aarch64_gdb_arch_name;
|
||||
|
||||
object_class_property_add_bool(oc, "aarch64", aarch64_cpu_get_aarch64,
|
||||
aarch64_cpu_set_aarch64);
|
||||
object_class_property_set_description(oc, "aarch64",
|
||||
"Set on/off to enable/disable aarch64 "
|
||||
"execution state ");
|
||||
}
|
||||
|
||||
static void aarch64_cpu_instance_init(Object *obj)
|
||||
|
@ -827,7 +824,6 @@ static const TypeInfo aarch64_cpu_type_info = {
|
|||
.name = TYPE_AARCH64_CPU,
|
||||
.parent = TYPE_ARM_CPU,
|
||||
.instance_size = sizeof(ARMCPU),
|
||||
.instance_init = aarch64_cpu_initfn,
|
||||
.instance_finalize = aarch64_cpu_finalizefn,
|
||||
.abstract = true,
|
||||
.class_size = sizeof(AArch64CPUClass),
|
||||
|
|
|
@ -6858,29 +6858,23 @@ static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
|
|||
cpu->env.user_features[fp->w] |= fp->mask;
|
||||
}
|
||||
|
||||
static void x86_cpu_release_bit_prop(Object *obj, const char *name,
|
||||
void *opaque)
|
||||
{
|
||||
BitProperty *prop = opaque;
|
||||
g_free(prop);
|
||||
}
|
||||
|
||||
/* Register a boolean property to get/set a single bit in a uint32_t field.
|
||||
*
|
||||
* The same property name can be registered multiple times to make it affect
|
||||
* multiple bits in the same FeatureWord. In that case, the getter will return
|
||||
* true only if all bits are set.
|
||||
*/
|
||||
static void x86_cpu_register_bit_prop(X86CPU *cpu,
|
||||
static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
|
||||
const char *prop_name,
|
||||
FeatureWord w,
|
||||
int bitnr)
|
||||
{
|
||||
ObjectClass *oc = OBJECT_CLASS(xcc);
|
||||
BitProperty *fp;
|
||||
ObjectProperty *op;
|
||||
uint64_t mask = (1ULL << bitnr);
|
||||
|
||||
op = object_property_find(OBJECT(cpu), prop_name);
|
||||
op = object_class_property_find(oc, prop_name);
|
||||
if (op) {
|
||||
fp = op->opaque;
|
||||
assert(fp->w == w);
|
||||
|
@ -6889,14 +6883,14 @@ static void x86_cpu_register_bit_prop(X86CPU *cpu,
|
|||
fp = g_new0(BitProperty, 1);
|
||||
fp->w = w;
|
||||
fp->mask = mask;
|
||||
object_property_add(OBJECT(cpu), prop_name, "bool",
|
||||
x86_cpu_get_bit_prop,
|
||||
x86_cpu_set_bit_prop,
|
||||
x86_cpu_release_bit_prop, fp);
|
||||
object_class_property_add(oc, prop_name, "bool",
|
||||
x86_cpu_get_bit_prop,
|
||||
x86_cpu_set_bit_prop,
|
||||
NULL, fp);
|
||||
}
|
||||
}
|
||||
|
||||
static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
|
||||
static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
|
||||
FeatureWord w,
|
||||
int bitnr)
|
||||
{
|
||||
|
@ -6915,7 +6909,7 @@ static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
|
|||
/* aliases don't use "|" delimiters anymore, they are registered
|
||||
* manually using object_property_add_alias() */
|
||||
assert(!strchr(name, '|'));
|
||||
x86_cpu_register_bit_prop(cpu, name, w, bitnr);
|
||||
x86_cpu_register_bit_prop(xcc, name, w, bitnr);
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
|
@ -6969,7 +6963,6 @@ static void x86_cpu_initfn(Object *obj)
|
|||
X86CPU *cpu = X86_CPU(obj);
|
||||
X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
|
||||
CPUX86State *env = &cpu->env;
|
||||
FeatureWord w;
|
||||
|
||||
env->nr_dies = 1;
|
||||
cpu_set_cpustate_pointers(cpu);
|
||||
|
@ -6981,14 +6974,6 @@ static void x86_cpu_initfn(Object *obj)
|
|||
x86_cpu_get_feature_words,
|
||||
NULL, NULL, (void *)cpu->filtered_features);
|
||||
|
||||
for (w = 0; w < FEATURE_WORDS; w++) {
|
||||
int bitnr;
|
||||
|
||||
for (bitnr = 0; bitnr < 64; bitnr++) {
|
||||
x86_cpu_register_feature_bit_props(cpu, w, bitnr);
|
||||
}
|
||||
}
|
||||
|
||||
object_property_add_alias(obj, "sse3", obj, "pni");
|
||||
object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
|
||||
object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
|
||||
|
@ -7274,6 +7259,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
|
|||
X86CPUClass *xcc = X86_CPU_CLASS(oc);
|
||||
CPUClass *cc = CPU_CLASS(oc);
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
FeatureWord w;
|
||||
|
||||
device_class_set_parent_realize(dc, x86_cpu_realizefn,
|
||||
&xcc->parent_realize);
|
||||
|
@ -7363,6 +7349,12 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
|
|||
x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
|
||||
#endif
|
||||
|
||||
for (w = 0; w < FEATURE_WORDS; w++) {
|
||||
int bitnr;
|
||||
for (bitnr = 0; bitnr < 64; bitnr++) {
|
||||
x86_cpu_register_feature_bit_props(xcc, w, bitnr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const TypeInfo x86_cpu_type_info = {
|
||||
|
|
|
@ -798,11 +798,17 @@ static void sparc_get_nwindows(Object *obj, Visitor *v, const char *name,
|
|||
static void sparc_set_nwindows(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
const int64_t min = MIN_NWINDOWS;
|
||||
const int64_t max = MAX_NWINDOWS;
|
||||
SPARCCPU *cpu = SPARC_CPU(obj);
|
||||
int64_t value;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!visit_type_int(v, name, &value, errp)) {
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue