trace_igvm_reset_exit(type);
}
+static void igvm_complete(UserCreatable *uc, Error **errp)
+{
+ IgvmCfg *igvm = IGVM_CFG(uc);
+
+ igvm->file = qigvm_file_init(igvm->filename, errp);
+}
+
OBJECT_DEFINE_TYPE_WITH_INTERFACES(IgvmCfg, igvm_cfg, IGVM_CFG, OBJECT,
{ TYPE_USER_CREATABLE },
{ TYPE_RESETTABLE_INTERFACE },
{
IgvmCfgClass *igvmc = IGVM_CFG_CLASS(oc);
ResettableClass *rc = RESETTABLE_CLASS(oc);
+ UserCreatableClass *uc = USER_CREATABLE_CLASS(oc);
object_class_property_add_str(oc, "file", get_igvm, set_igvm);
object_class_property_set_description(oc, "file",
rc->phases.enter = igvm_reset_enter;
rc->phases.hold = igvm_reset_hold;
rc->phases.exit = igvm_reset_exit;
+
+ uc->complete = igvm_complete;
}
static void igvm_cfg_init(Object *obj)
{
+ IgvmCfg *igvm = IGVM_CFG(obj);
+
+ igvm->file = -1;
qemu_register_resettable(obj);
}
static void igvm_cfg_finalize(Object *obj)
{
+ IgvmCfg *igvm = IGVM_CFG(obj);
+
qemu_unregister_resettable(obj);
+ if (igvm->file >= 0) {
+ igvm_free(igvm->file);
+ }
}
return 0;
}
-static IgvmHandle qigvm_file_init(char *filename, Error **errp)
+IgvmHandle qigvm_file_init(char *filename, Error **errp)
{
IgvmHandle igvm;
g_autofree uint8_t *buf = NULL;
QIgvm ctx;
memset(&ctx, 0, sizeof(ctx));
- ctx.file = qigvm_file_init(cfg->filename, errp);
- if (ctx.file < 0) {
+ if (cfg->file < 0) {
+ error_setg(errp, "No IGVM file loaded.");
return -1;
}
+ ctx.file = cfg->file;
/*
* The ConfidentialGuestSupport object is optional and allows a confidential
g_free(ctx.id_auth);
cleanup:
- igvm_free(ctx.file);
-
return retval;
}