On Tue, 27 Nov 2018 13:27:58 +0400 Marc-André Lureau <marcandre.lur...@redhat.com> wrote:
> Let's make compatiblity properties an interface, so that objects other > than QDev can benefit from having machine compatiblity properties. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > include/hw/boards.h | 2 ++ > hw/core/compat-props.c | 55 ++++++++++++++++++++++++++++++++++++++++++ > hw/core/qdev.c | 24 +++--------------- > MAINTAINERS | 1 + > hw/core/Makefile.objs | 1 + > tests/Makefile.include | 1 + > 6 files changed, 64 insertions(+), 20 deletions(-) > create mode 100644 hw/core/compat-props.c > > diff --git a/include/hw/boards.h b/include/hw/boards.h > index f743d9d4a4..77d1fc1bef 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -9,6 +9,8 @@ > #include "qom/object.h" > #include "qom/cpu.h" > > +#define TYPE_COMPAT_PROPS "compat-props" > + > /** > * memory_region_allocate_system_memory - Allocate a board's main memory > * @mr: the #MemoryRegion to be initialized > diff --git a/hw/core/compat-props.c b/hw/core/compat-props.c > new file mode 100644 > index 0000000000..538378e71f > --- /dev/null > +++ b/hw/core/compat-props.c > @@ -0,0 +1,55 @@ > +/* > + * QEMU Machine compat properties > + * > + * Copyright (C) 2018 Red Hat Inc > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "hw/boards.h" > +#include "qapi/error.h" > + > +typedef struct CompatProps CompatProps; > + > +typedef struct CompatPropsClass { > + InterfaceClass parent_class; > +} CompatPropsClass; > + > +static const GPtrArray *ac_compat_props; > +static const GPtrArray *mc_compat_props; > + > +void accel_register_compat_props(const GPtrArray *props) > +{ > + ac_compat_props = props; > +} > + > +void machine_register_compat_props(const GPtrArray *props) > +{ > + mc_compat_props = props; > +} > + > +static void compat_props_post_init(Object *obj) > +{ > + if (ac_compat_props) { > + object_apply_global_props(obj, ac_compat_props, &error_abort); > + } > + if (mc_compat_props) { > + object_apply_global_props(obj, mc_compat_props, &error_abort); > + } > +} > + > +static void compat_props_register_types(void) > +{ > + static const TypeInfo cp_interface_info = { > + .name = TYPE_COMPAT_PROPS, > + .parent = TYPE_INTERFACE, > + .class_size = sizeof(CompatPropsClass), > + .instance_post_init = compat_props_post_init, you went here for implict way to set compat props compared to v3 could elaborate in what order .instance_post_init() hooks will be called in this case for a Device? (I mean compat_props_post_init vs device_post_init) > + }; > + > + type_register_static(&cp_interface_info); > +} > + > +type_init(compat_props_register_types) > diff --git a/hw/core/qdev.c b/hw/core/qdev.c > index 3b31b2c025..b0ee05f837 100644 > --- a/hw/core/qdev.c > +++ b/hw/core/qdev.c > @@ -970,28 +970,8 @@ static void device_initfn(Object *obj) > QLIST_INIT(&dev->gpios); > } > > -static const GPtrArray *ac_compat_props; > -static const GPtrArray *mc_compat_props; > - > -void accel_register_compat_props(const GPtrArray *props) > -{ > - ac_compat_props = props; > -} > - > -void machine_register_compat_props(const GPtrArray *props) > -{ > - mc_compat_props = props; > -} > - > static void device_post_init(Object *obj) > { > - if (ac_compat_props) { > - object_apply_global_props(obj, ac_compat_props, &error_abort); > - } > - if (mc_compat_props) { > - object_apply_global_props(obj, mc_compat_props, &error_abort); > - } > - > qdev_prop_set_globals(DEVICE(obj)); > } > > @@ -1124,6 +1104,10 @@ static const TypeInfo device_type_info = { > .class_init = device_class_init, > .abstract = true, > .class_size = sizeof(DeviceClass), > + .interfaces = (InterfaceInfo[]) { > + { TYPE_COMPAT_PROPS }, > + { } > + } > }; > > static void qdev_register_types(void) > diff --git a/MAINTAINERS b/MAINTAINERS > index 9410bbb7cf..adff09627f 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1145,6 +1145,7 @@ Machine core > M: Eduardo Habkost <ehabk...@redhat.com> > M: Marcel Apfelbaum <marcel.apfelb...@gmail.com> > S: Supported > +F: hw/core/compat-props.c > F: hw/core/machine.c > F: hw/core/null-machine.c > F: include/hw/boards.h > diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs > index a799c83815..f15b3c970a 100644 > --- a/hw/core/Makefile.objs > +++ b/hw/core/Makefile.objs > @@ -1,5 +1,6 @@ > # core qdev-related obj files, also used by *-user: > common-obj-y += qdev.o qdev-properties.o > +common-obj-y += compat-props.o > common-obj-y += bus.o reset.o > common-obj-$(CONFIG_SOFTMMU) += qdev-fw.o > common-obj-$(CONFIG_SOFTMMU) += fw-path-provider.o > diff --git a/tests/Makefile.include b/tests/Makefile.include > index fb0b449c02..fc74358c0a 100644 > --- a/tests/Makefile.include > +++ b/tests/Makefile.include > @@ -567,6 +567,7 @@ tests/test-qdev-global-props$(EXESUF): > tests/test-qdev-global-props.o \ > hw/core/irq.o \ > hw/core/fw-path-provider.o \ > hw/core/reset.o \ > + hw/core/compat-props.o \ > $(test-qapi-obj-y) > tests/test-vmstate$(EXESUF): tests/test-vmstate.o \ > migration/vmstate.o migration/vmstate-types.o migration/qemu-file.o \