<div dir="ltr">  ping for reviews  <br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Apr 22, 2020 at 3:12 PM ZhengZhenyu <<a href="mailto:zheng.zhenyu@foxmail.com">zheng.zhenyu@foxmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Introduce vendor and model struct and related<br>
cleanup functions for ARM cpu.<br>
<br>
Signed-off-by: Zhenyu Zheng <<a href="mailto:zhengzhenyulixi@gmail.com" target="_blank">zhengzhenyulixi@gmail.com</a>><br>
---<br>
 src/cpu/cpu_arm.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++<br>
 1 file changed, 73 insertions(+)<br>
<br>
diff --git a/src/cpu/cpu_arm.c b/src/cpu/cpu_arm.c<br>
index ee5802198f..2009904cc9 100644<br>
--- a/src/cpu/cpu_arm.c<br>
+++ b/src/cpu/cpu_arm.c<br>
@@ -1,6 +1,7 @@<br>
 /*<br>
  * cpu_arm.c: CPU driver for arm CPUs<br>
  *<br>
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd.<br>
  * Copyright (C) 2013 Red Hat, Inc.<br>
  * Copyright (C) Canonical Ltd. 2012<br>
  *<br>
@@ -23,7 +24,9 @@<br>
<br>
 #include "viralloc.h"<br>
 #include "cpu.h"<br>
+#include "cpu_arm.h"<br>
 #include "cpu_map.h"<br>
+#include "virlog.h"<br>
 #include "virstring.h"<br>
 #include "virxml.h"<br>
<br>
@@ -36,6 +39,21 @@ static const virArch archs[] = {<br>
     VIR_ARCH_AARCH64,<br>
 };<br>
<br>
+typedef struct _virCPUarmVendor virCPUarmVendor;<br>
+typedef virCPUarmVendor *virCPUarmVendorPtr;<br>
+struct _virCPUarmVendor {<br>
+    char *name;<br>
+    unsigned long value;<br>
+};<br>
+<br>
+typedef struct _virCPUarmModel virCPUarmModel;<br>
+typedef virCPUarmModel *virCPUarmModelPtr;<br>
+struct _virCPUarmModel {<br>
+    char *name;<br>
+    virCPUarmVendorPtr vendor;<br>
+    virCPUarmData data;<br>
+};<br>
+<br>
 typedef struct _virCPUarmFeature virCPUarmFeature;<br>
 typedef virCPUarmFeature *virCPUarmFeaturePtr;<br>
 struct _virCPUarmFeature {<br>
@@ -64,6 +82,10 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUarmFeature, virCPUarmFeatureFree);<br>
 typedef struct _virCPUarmMap virCPUarmMap;<br>
 typedef virCPUarmMap *virCPUarmMapPtr;<br>
 struct _virCPUarmMap {<br>
+    size_t nvendors;<br>
+    virCPUarmVendorPtr *vendors;<br>
+    size_t nmodels;<br>
+    virCPUarmModelPtr *models;<br>
     GPtrArray *features;<br>
 };<br>
<br>
@@ -81,12 +103,62 @@ virCPUarmMapNew(void)<br>
     return map;<br>
 }<br>
<br>
+static void<br>
+virCPUarmDataClear(virCPUarmData *data)<br>
+{<br>
+    if (!data)<br>
+        return;<br>
+<br>
+    VIR_FREE(data->features);<br>
+}<br>
+<br>
+static void<br>
+virCPUarmDataFree(virCPUDataPtr cpuData)<br>
+{<br>
+    if (!cpuData)<br>
+        return;<br>
+<br>
+    virCPUarmDataClear(&cpuData->data.arm);<br>
+    VIR_FREE(cpuData);<br>
+}<br>
+<br>
+static void<br>
+virCPUarmModelFree(virCPUarmModelPtr model)<br>
+{<br>
+    if (!model)<br>
+        return;<br>
+<br>
+    virCPUarmDataClear(&model->data);<br>
+    g_free(model->name);<br>
+    g_free(model);<br>
+}<br>
+<br>
+static void<br>
+virCPUarmVendorFree(virCPUarmVendorPtr vendor)<br>
+{<br>
+    if (!vendor)<br>
+        return;<br>
+<br>
+    g_free(vendor->name);<br>
+    g_free(vendor);<br>
+}<br>
+<br>
 static void<br>
 virCPUarmMapFree(virCPUarmMapPtr map)<br>
 {<br>
     if (!map)<br>
         return;<br>
<br>
+    size_t i;<br>
+<br>
+    for (i = 0; i < map->nmodels; i++)<br>
+        virCPUarmModelFree(map->models[i]);<br>
+    g_free(map->models);<br>
+<br>
+    for (i = 0; i < map->nvendors; i++)<br>
+        virCPUarmVendorFree(map->vendors[i]);<br>
+    g_free(map->vendors);<br>
+<br>
     g_ptr_array_free(map->features, TRUE);<br>
<br>
     g_free(map);<br>
@@ -259,6 +331,7 @@ struct cpuArchDriver cpuDriverArm = {<br>
     .compare = virCPUarmCompare,<br>
     .decode = NULL,<br>
     .encode = NULL,<br>
+    .dataFree = virCPUarmDataFree,<br>
     .baseline = virCPUarmBaseline,<br>
     .update = virCPUarmUpdate,<br>
     .validateFeatures = virCPUarmValidateFeatures,<br>
-- <br>
2.26.0.windows.1<br>
<br>
</blockquote></div>