Move repeating code for finding the parameter entries in the IGVM
backend out of the parameter handlers into a common function.
---
 backends/igvm.c | 115 +++++++++++++++++++++++++-----------------------
 1 file changed, 61 insertions(+), 54 deletions(-)

diff --git a/backends/igvm.c b/backends/igvm.c
index dc1fd026cb..a797bd741c 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -95,6 +95,18 @@ 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,
@@ -576,57 +588,54 @@ 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)
+    param_entry = qigvm_find_param_entry(ctx, param);
+    if (param_entry != NULL)
     {
-        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);
+        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;
             }
-            if (retval < 0) {
-                return retval;
+            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;
             }
-            /* The entries need to be sorted */
-            qsort(mm_entry, entry, sizeof(IGVM_VHS_MEMORY_MAP_ENTRY),
-                  qigvm_cmp_mm_entry);
-
-            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;
 }
@@ -662,14 +671,12 @@ static int qigvm_directive_environment_info(QIgvm *ctx,
     QIgvmParameterData *param_entry;
     IgvmEnvironmentInfo *environmental_state;
 
-    QTAILQ_FOREACH(param_entry, &ctx->parameter_data, next)
+    param_entry = qigvm_find_param_entry(ctx, param);
+    if (param_entry != NULL)
     {
-        if (param_entry->index == param->parameter_area_index) {
-            environmental_state =
-                (IgvmEnvironmentInfo *)(param_entry->data + 
param->byte_offset);
-            environmental_state->memory_is_shared = 1;
-            break;
-        }
+        environmental_state =
+            (IgvmEnvironmentInfo *)(param_entry->data + param->byte_offset);
+        environmental_state->memory_is_shared = 1;
     }
     return 0;
 }
-- 
2.52.0


Reply via email to