On Tue, Nov 18, 2025 at 01:21:30PM +0100, Gerd Hoffmann wrote:
Add UserCreatableClass->complete callback function for igvm-cfg object.
Move file loading and parsing of the igvm file from the process function
to the to the new complete callback function. Keep the igvm file loaded
^
there is an extra "to the"
instead of releasing it after processing, so we parse it only once.
Signed-off-by: Gerd Hoffmann <[email protected]>
---
include/system/igvm-cfg.h | 3 +++
include/system/igvm.h | 1 +
backends/igvm-cfg.c | 10 ++++++++++
backends/igvm.c | 9 ++++-----
4 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/include/system/igvm-cfg.h b/include/system/igvm-cfg.h
index 312f77c092b0..7dc48677fd99 100644
--- a/include/system/igvm-cfg.h
+++ b/include/system/igvm-cfg.h
@@ -15,6 +15,8 @@
#include "qom/object.h"
#include "hw/resettable.h"
+#include <igvm/igvm.h>
+
typedef struct IgvmCfg {
ObjectClass parent_class;
@@ -24,6 +26,7 @@ typedef struct IgvmCfg {
* format.
*/
char *filename;
+ IgvmHandle file;
ResettableState reset_state;
} IgvmCfg;
diff --git a/include/system/igvm.h b/include/system/igvm.h
index 48ce20604259..ec2538daa0e1 100644
--- a/include/system/igvm.h
+++ b/include/system/igvm.h
@@ -16,6 +16,7 @@
#include "system/igvm-cfg.h"
#include "qapi/error.h"
+IgvmHandle qigvm_file_init(char *filename, Error **errp);
int qigvm_process_file(IgvmCfg *igvm, ConfidentialGuestSupport *cgs,
bool onlyVpContext, Error **errp);
diff --git a/backends/igvm-cfg.c b/backends/igvm-cfg.c
index 4e3ef88ffc27..08501a67e58e 100644
--- a/backends/igvm-cfg.c
+++ b/backends/igvm-cfg.c
@@ -52,6 +52,13 @@ static void igvm_reset_exit(Object *obj, ResetType type)
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 },
@@ -61,6 +68,7 @@ static void igvm_cfg_class_init(ObjectClass *oc, const void
*data)
{
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",
@@ -72,6 +80,8 @@ static void igvm_cfg_class_init(ObjectClass *oc, const void
*data)
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)
diff --git a/backends/igvm.c b/backends/igvm.c
index 905bd8d98994..05d197fdfe85 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -867,7 +867,7 @@ static int qigvm_handle_policy(QIgvm *ctx, Error **errp)
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;
@@ -896,10 +896,11 @@ int qigvm_process_file(IgvmCfg *cfg,
ConfidentialGuestSupport *cgs,
QIgvm ctx;
memset(&ctx, 0, sizeof(ctx));
- ctx.file = qigvm_file_init(cfg->filename, errp);
- if (ctx.file < 0) {
+ if (!cfg->file) {
+ error_setg(errp, "No IGVM file loaded.");
return -1;
}
+ ctx.file = cfg->file;
/*
* The ConfidentialGuestSupport object is optional and allows a confidential
@@ -990,7 +991,5 @@ cleanup_parameters:
g_free(ctx.id_auth);
cleanup:
nit: "cleanup" label is now unnecessary; perhaps we could remove it and
return -1 directly where it is used (not a strong opinion; I'm perfectly
fine with keeping this patch small).
- igvm_free(ctx.file);
Should we now move this call the the finalize or to some destructor?
Thanks,
Stefano
-
return retval;
}
-- 2.51.1