Move repeating code for finding the parameter entries in the IGVM
backend out of the parameter handlers into a common function.
Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
backends/igvm.c | 117 +++++++++++++++++++++++++-----------------------
1 file changed, 61 insertions(+), 56 deletions(-)
diff --git a/backends/igvm.c b/backends/igvm.c
index a350c890cc..ccb2f51cd9 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -95,6 +95,19 @@ typedef struct QIgvm {
unsigned region_page_count;
} QIgvm;
+static QIgvmParameterData*
+qigvm_find_param_entry(QIgvm *igvm, const IGVM_VHS_PARAMETER *param)
+{
+ QIgvmParameterData *param_entry;
+ QTAILQ_FOREACH(param_entry, &igvm->parameter_data, next)
+ {
+ if (param_entry->index == param->parameter_area_index) {
+ return param_entry;
+ }
+ }
+ return NULL;
+}
+
static int qigvm_directive_page_data(QIgvm *ctx, const uint8_t *header_data,
Error **errp);
static int qigvm_directive_vp_context(QIgvm *ctx, const uint8_t *header_data,
@@ -569,58 +582,53 @@ static int qigvm_directive_memory_map(QIgvm *ctx, const uint8_t *header_data,
}
/* Find the parameter area that should hold the memory map */
- QTAILQ_FOREACH(param_entry, &ctx->parameter_data, next)
- {
- if (param_entry->index == param->parameter_area_index) {
- max_entry_count =
- param_entry->size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
- mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)param_entry->data;
-
- retval = get_mem_map_entry(entry, &cgmm_entry, errp);
- while (retval == 0) {
- if (entry >= max_entry_count) {
- error_setg(
- errp,
- "IGVM: guest memory map size exceeds parameter area defined in IGVM file");
- return -1;
- }
- mm_entry[entry].starting_gpa_page_number = cgmm_entry.gpa >> 12;
- mm_entry[entry].number_of_pages = cgmm_entry.size >> 12;
-
- switch (cgmm_entry.type) {
- case CGS_MEM_RAM:
- mm_entry[entry].entry_type =
- IGVM_MEMORY_MAP_ENTRY_TYPE_MEMORY;
- break;
- case CGS_MEM_RESERVED:
- mm_entry[entry].entry_type =
- IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
- break;
- case CGS_MEM_ACPI:
- mm_entry[entry].entry_type =
- IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
- break;
- case CGS_MEM_NVS:
- mm_entry[entry].entry_type =
- IGVM_MEMORY_MAP_ENTRY_TYPE_PERSISTENT;
- break;
- case CGS_MEM_UNUSABLE:
- mm_entry[entry].entry_type =
- IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
- break;
- }
- retval = get_mem_map_entry(++entry, &cgmm_entry, errp);
- }
- if (retval < 0) {
- return retval;
- }
- /* The entries need to be sorted */
- qsort(mm_entry, entry, sizeof(IGVM_VHS_MEMORY_MAP_ENTRY),
- qigvm_cmp_mm_entry);
+ param_entry = qigvm_find_param_entry(ctx, param);
+ if (param_entry == NULL) {
+ return 0;
+ }
+
+ max_entry_count = param_entry->size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
+ mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)param_entry->data;
+ retval = get_mem_map_entry(entry, &cgmm_entry, errp);
+ while (retval == 0) {
+ if (entry >= max_entry_count) {
+ error_setg(
+ errp,
+ "IGVM: guest memory map size exceeds parameter area defined in IGVM file");
+ return -1;
+ }
+ mm_entry[entry].starting_gpa_page_number = cgmm_entry.gpa >> 12;
+ mm_entry[entry].number_of_pages = cgmm_entry.size >> 12;
+
+ switch (cgmm_entry.type) {
+ case CGS_MEM_RAM:
+ mm_entry[entry].entry_type = IGVM_MEMORY_MAP_ENTRY_TYPE_MEMORY;
+ break;
+ case CGS_MEM_RESERVED:
+ mm_entry[entry].entry_type =
+ IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
+ break;
+ case CGS_MEM_ACPI:
+ mm_entry[entry].entry_type =
+ IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
+ break;
+ case CGS_MEM_NVS:
+ mm_entry[entry].entry_type = IGVM_MEMORY_MAP_ENTRY_TYPE_PERSISTENT;
+ break;
+ case CGS_MEM_UNUSABLE:
+ mm_entry[entry].entry_type =
+ IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
break;
}
+ retval = get_mem_map_entry(++entry, &cgmm_entry, errp);
}
+ if (retval < 0) {
+ return retval;
+ }
+ /* The entries need to be sorted */
+ qsort(mm_entry, entry, sizeof(IGVM_VHS_MEMORY_MAP_ENTRY),
+ qigvm_cmp_mm_entry);
return 0;
}
@@ -655,14 +663,11 @@ static int qigvm_directive_environment_info(QIgvm *ctx,
QIgvmParameterData *param_entry;
IgvmEnvironmentInfo *environmental_state;
- QTAILQ_FOREACH(param_entry, &ctx->parameter_data, next)
- {
- if (param_entry->index == param->parameter_area_index) {
- environmental_state =
- (IgvmEnvironmentInfo *)(param_entry->data + param->byte_offset);
- environmental_state->memory_is_shared = 1;
- break;
- }
+ param_entry = qigvm_find_param_entry(ctx, param);
+ if (param_entry != NULL) {
+ environmental_state =
+ (IgvmEnvironmentInfo *)(param_entry->data + param->byte_offset);
+ environmental_state->memory_is_shared = 1;
}
return 0;
}
--
2.52.0
Hi Oliver,
On Wed, Jan 14, 2026 at 06:50:05PM +0100, Oliver Steffen wrote:
>Move repeating code for finding the parameter entries in the IGVM
>backend out of the parameter handlers into a common function.
>
>Signed-off-by: Oliver Steffen <osteffen@redhat.com>
>---
> backends/igvm.c | 117 +++++++++++++++++++++++++-----------------------
> 1 file changed, 61 insertions(+), 56 deletions(-)
>
>diff --git a/backends/igvm.c b/backends/igvm.c
>index a350c890cc..ccb2f51cd9 100644
>--- a/backends/igvm.c
>+++ b/backends/igvm.c
>@@ -95,6 +95,19 @@ typedef struct QIgvm {
> unsigned region_page_count;
> } QIgvm;
>
>+static QIgvmParameterData*
>+qigvm_find_param_entry(QIgvm *igvm, const IGVM_VHS_PARAMETER *param)
>+{
>+ QIgvmParameterData *param_entry;
>+ QTAILQ_FOREACH(param_entry, &igvm->parameter_data, next)
>+ {
>+ if (param_entry->index == param->parameter_area_index) {
>+ return param_entry;
>+ }
>+ }
>+ return NULL;
>+}
>+
> static int qigvm_directive_page_data(QIgvm *ctx, const uint8_t *header_data,
> Error **errp);
> static int qigvm_directive_vp_context(QIgvm *ctx, const uint8_t *header_data,
>@@ -569,58 +582,53 @@ static int qigvm_directive_memory_map(QIgvm *ctx, const uint8_t *header_data,
> }
>
> /* Find the parameter area that should hold the memory map */
>- QTAILQ_FOREACH(param_entry, &ctx->parameter_data, next)
>- {
>- if (param_entry->index == param->parameter_area_index) {
>- max_entry_count =
>- param_entry->size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
>- mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)param_entry->data;
>-
>- retval = get_mem_map_entry(entry, &cgmm_entry, errp);
>- while (retval == 0) {
>- if (entry >= max_entry_count) {
>- error_setg(
>- errp,
>- "IGVM: guest memory map size exceeds parameter area defined in IGVM file");
>- return -1;
>- }
>- mm_entry[entry].starting_gpa_page_number = cgmm_entry.gpa >> 12;
>- mm_entry[entry].number_of_pages = cgmm_entry.size >> 12;
>-
>- switch (cgmm_entry.type) {
>- case CGS_MEM_RAM:
>- mm_entry[entry].entry_type =
>- IGVM_MEMORY_MAP_ENTRY_TYPE_MEMORY;
>- break;
>- case CGS_MEM_RESERVED:
>- mm_entry[entry].entry_type =
>- IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
>- break;
>- case CGS_MEM_ACPI:
>- mm_entry[entry].entry_type =
>- IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
>- break;
>- case CGS_MEM_NVS:
>- mm_entry[entry].entry_type =
>- IGVM_MEMORY_MAP_ENTRY_TYPE_PERSISTENT;
>- break;
>- case CGS_MEM_UNUSABLE:
>- mm_entry[entry].entry_type =
>- IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
>- break;
>- }
>- retval = get_mem_map_entry(++entry, &cgmm_entry, errp);
>- }
>- if (retval < 0) {
>- return retval;
>- }
>- /* The entries need to be sorted */
>- qsort(mm_entry, entry, sizeof(IGVM_VHS_MEMORY_MAP_ENTRY),
>- qigvm_cmp_mm_entry);
>+ param_entry = qigvm_find_param_entry(ctx, param);
>+ if (param_entry == NULL) {
>+ return 0;
>+ }
>+
>+ max_entry_count = param_entry->size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
>+ mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)param_entry->data;
>
>+ retval = get_mem_map_entry(entry, &cgmm_entry, errp);
>+ while (retval == 0) {
>+ if (entry >= max_entry_count) {
>+ error_setg(
>+ errp,
>+ "IGVM: guest memory map size exceeds parameter area defined in IGVM file");
>+ return -1;
>+ }
>+ mm_entry[entry].starting_gpa_page_number = cgmm_entry.gpa >> 12;
>+ mm_entry[entry].number_of_pages = cgmm_entry.size >> 12;
>+
>+ switch (cgmm_entry.type) {
>+ case CGS_MEM_RAM:
>+ mm_entry[entry].entry_type = IGVM_MEMORY_MAP_ENTRY_TYPE_MEMORY;
>+ break;
>+ case CGS_MEM_RESERVED:
>+ mm_entry[entry].entry_type =
>+ IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
>+ break;
>+ case CGS_MEM_ACPI:
>+ mm_entry[entry].entry_type =
>+ IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
>+ break;
>+ case CGS_MEM_NVS:
>+ mm_entry[entry].entry_type = IGVM_MEMORY_MAP_ENTRY_TYPE_PERSISTENT;
>+ break;
>+ case CGS_MEM_UNUSABLE:
>+ mm_entry[entry].entry_type =
>+ IGVM_MEMORY_MAP_ENTRY_TYPE_PLATFORM_RESERVED;
> break;
> }
>+ retval = get_mem_map_entry(++entry, &cgmm_entry, errp);
> }
>+ if (retval < 0) {
>+ return retval;
>+ }
>+ /* The entries need to be sorted */
>+ qsort(mm_entry, entry, sizeof(IGVM_VHS_MEMORY_MAP_ENTRY),
>+ qigvm_cmp_mm_entry);
> return 0;
> }
>
>@@ -655,14 +663,11 @@ static int qigvm_directive_environment_info(QIgvm *ctx,
> QIgvmParameterData *param_entry;
> IgvmEnvironmentInfo *environmental_state;
>
>- QTAILQ_FOREACH(param_entry, &ctx->parameter_data, next)
>- {
>- if (param_entry->index == param->parameter_area_index) {
>- environmental_state =
>- (IgvmEnvironmentInfo *)(param_entry->data + param->byte_offset);
>- environmental_state->memory_is_shared = 1;
>- break;
>- }
>+ param_entry = qigvm_find_param_entry(ctx, param);
>+ if (param_entry != NULL) {
What about an early return?
>+ environmental_state =
>+ (IgvmEnvironmentInfo *)(param_entry->data +
>param->byte_offset);
>+ environmental_state->memory_is_shared = 1;
> }
> return 0;
> }
>-- 2.52.0
>
Can we reuse `qigvm_find_param_entry` for
`qigvm_directive_parameter_insert` and `qigvm_directive_vp_count` as
well?
Luigi
© 2016 - 2026 Red Hat, Inc.