On Tue, 6 Dec 2016 17:31:59 -0200 Eduardo Habkost <ehabk...@redhat.com> wrote:
> What about this? > > (untested) Have not tested it either, but I think it looks good. Some nits below. > > Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> > --- > hw/core/machine.c | 35 ++++++++++++++++++++++++++++++++--- > 1 file changed, 32 insertions(+), 3 deletions(-) > > @@ -565,10 +584,20 @@ void machine_register_compat_props(MachineState > *machine) > } > > for (i = 0; i < mc->compat_props->len; i++) { > + ObjectClass *oc; Move the declaration out of the loop? > p = g_array_index(mc->compat_props, GlobalProperty *, i); > - /* Machine compat_props must never cause errors: */ > - p->errp = &error_abort; > - qdev_prop_register_global(p); > + oc = object_class_by_name(p->driver); > + if (oc && object_class_is_abstract(oc)) { > + /* temporary hack to make sure we will never override > + * globals set explicitly on -global: if an abstract class > + * is on compat_props, register globals for each of their > + * subclasses instead. > + */ I think this should not just be a 'temporary hack'... rather document this behaviour for abstract classes? > + object_class_foreach(machine_register_compat_for_subclass, > + p->driver, false, p); > + } else { > + register_compat_prop(p->driver, p->property, p->value); > + } > } > } >