<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>