Hi On Thu, Dec 19, 2024 at 7:39 PM Philippe Mathieu-Daudé <philmd@xxxxxxxxxx> wrote: > > 'vmcore-info' object allow to transition from '-device' > to 'object', following the deprecation process. > Is there a strong motivation behind this? just replacing -device with -object doesn't really give anything, does it? Also I'd rather keep the name "vmcoreinfo" since that's how it used to be, and also the name used by the kernel ELF etc. > No need to modify VMCoreInfoState since DeviceState > already inherits from Object state. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@xxxxxxxxxx> > --- > include/hw/misc/vmcoreinfo.h | 4 ++- > hw/misc/vmcoreinfo.c | 48 +++++++++++++++++++++++++++++++++++- > 2 files changed, 50 insertions(+), 2 deletions(-) > > diff --git a/include/hw/misc/vmcoreinfo.h b/include/hw/misc/vmcoreinfo.h > index 122c69686b0..d4cce42cee6 100644 > --- a/include/hw/misc/vmcoreinfo.h > +++ b/include/hw/misc/vmcoreinfo.h > @@ -16,8 +16,10 @@ > #include "standard-headers/linux/qemu_fw_cfg.h" > #include "qom/object.h" > > +#define TYPE_VMCOREINFO "vmcore-info" > +OBJECT_DECLARE_SIMPLE_TYPE(VMCoreInfoState, VMCOREINFO) > + > #define TYPE_VMCOREINFO_DEVICE "vmcoreinfo" > -typedef struct VMCoreInfoState VMCoreInfoState; > DECLARE_INSTANCE_CHECKER(VMCoreInfoState, VMCOREINFO_DEVICE, > TYPE_VMCOREINFO_DEVICE) > > diff --git a/hw/misc/vmcoreinfo.c b/hw/misc/vmcoreinfo.c > index a0511ea0da4..e2258e08fb1 100644 > --- a/hw/misc/vmcoreinfo.c > +++ b/hw/misc/vmcoreinfo.c > @@ -12,11 +12,11 @@ > > #include "qemu/osdep.h" > #include "qapi/error.h" > -#include "qemu/module.h" > #include "sysemu/reset.h" > #include "hw/nvram/fw_cfg.h" > #include "migration/vmstate.h" > #include "hw/misc/vmcoreinfo.h" > +#include "qom/object_interfaces.h" > > static const VMStateDescription vmstate_vmcoreinfo = { > .name = "vmcoreinfo", > @@ -32,6 +32,11 @@ static const VMStateDescription vmstate_vmcoreinfo = { > }, > }; > > +static char *vmcoreinfo_get_vmstate_id(VMStateIf *vmif) > +{ > + return g_strdup(TYPE_VMCOREINFO); > +} > + > static void fw_cfg_vmci_write(void *opaque, off_t offset, size_t len) > { > VMCoreInfoState *s = opaque; > @@ -88,6 +93,32 @@ static void vmcoreinfo_device_realize(DeviceState *dev, Error **errp) > vmcoreinfo_realize(VMCOREINFO_DEVICE(dev), errp); > } > > +static bool vmcoreinfo_can_be_deleted(UserCreatable *uc) > +{ > + return false; > +} > + > +static void vmcoreinfo_complete(UserCreatable *uc, Error **errp) > +{ > + if (vmstate_register_any(VMSTATE_IF(uc), &vmstate_vmcoreinfo, uc) < 0) { > + error_setg(errp, "%s: Failed to register vmstate", TYPE_VMCOREINFO); > + } > + > + vmcoreinfo_realize(VMCOREINFO(uc), errp); > +} > + > +static void vmcoreinfo_class_init(ObjectClass *oc, void *data) > +{ > + UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); > + VMStateIfClass *vc = VMSTATE_IF_CLASS(oc); > + ResettableClass *rc = RESETTABLE_CLASS(oc); > + > + ucc->complete = vmcoreinfo_complete; > + ucc->can_be_deleted = vmcoreinfo_can_be_deleted; > + vc->get_id = vmcoreinfo_get_vmstate_id; > + rc->phases.hold = vmcoreinfo_reset_hold; > +} > + > static void vmcoreinfo_device_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > @@ -106,6 +137,18 @@ static const TypeInfo vmcoreinfo_types[] = { > .parent = TYPE_DEVICE, > .instance_size = sizeof(VMCoreInfoState), > .class_init = vmcoreinfo_device_class_init, > + }, > + { > + .name = TYPE_VMCOREINFO, > + .parent = TYPE_OBJECT, > + .instance_size = sizeof(VMCoreInfoState), > + .class_init = vmcoreinfo_class_init, > + .interfaces = (InterfaceInfo[]) { > + { TYPE_RESETTABLE_INTERFACE }, > + { TYPE_USER_CREATABLE }, > + { TYPE_VMSTATE_IF }, > + { } > + } > } > }; > > @@ -116,6 +159,9 @@ VMCoreInfoState *vmcoreinfo_find(void) > Object *obj; > > obj = object_resolve_path_type("", TYPE_VMCOREINFO_DEVICE, NULL); > + if (!obj) { > + obj = object_resolve_path_type("", TYPE_VMCOREINFO, NULL); > + } > > return obj ? (VMCoreInfoState *)obj : NULL; > } > -- > 2.47.1 >