代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/libvirt 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 208c9f1eb9a06d2550b7b3cfe0172840925255d4 Mon Sep 17 00:00:00 2001
From: Xu Yandong <xuyandong2@huawei.com>
Date: Mon, 20 Apr 2020 17:29:17 +0800
Subject: cpu/arm: add virCPUarmGetHost implment
Signed-off-by: Xu Yandong <xuyandong2@huawei.com>
---
src/cpu/cpu_arm.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/src/cpu/cpu_arm.c b/src/cpu/cpu_arm.c
index eb9b1c9..78e604c 100644
--- a/src/cpu/cpu_arm.c
+++ b/src/cpu/cpu_arm.c
@@ -26,9 +26,15 @@
#include "cpu_map.h"
#include "virstring.h"
#include "virxml.h"
+#include "virfile.h"
#define VIR_FROM_THIS VIR_FROM_CPU
+static const char *sysinfoCpuinfo = "/proc/cpuinfo";
+
+#define CPUINFO sysinfoCpuinfo
+#define CPUINFO_FILE_LEN (1024*1024) /* 1MB limit for /proc/cpuinfo file */
+
static const virArch archs[] = {
VIR_ARCH_ARMV6L,
VIR_ARCH_ARMV7B,
@@ -531,6 +537,85 @@ cleanup:
return ret;
}
+static int
+armCpuDataFromCpuInfo(virCPUarmData *data)
+{
+ g_autofree char *str_vendor = NULL;
+ g_autofree char *str_pvr = NULL;
+ g_autofree char *outbuf = NULL;
+ char *eol = NULL;
+ const char *cur;
+
+ if (!data)
+ return -1;
+
+ if (virFileReadAll(CPUINFO, CPUINFO_FILE_LEN, &outbuf) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to open %s"), CPUINFO);
+ return -1;
+ }
+
+ /* Account for format 'CPU implementer : XXXX' */
+ if ((cur = strstr(outbuf, "CPU implementer")) == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("there is no \"CPU implementer\" info in %s"), CPUINFO);
+ return -1;
+ }
+
+ cur = strchr(cur, ':') + 1;
+ eol = strchr(cur, '\n');
+ virSkipSpaces(&cur);
+ if (!eol || !(str_vendor = g_strndup(cur, eol - cur)) ||
+ virStrToLong_ul(str_vendor, NULL, 16, &data->vendor_id) < 0)
+ return -1;
+
+ /* Account for format 'CPU part : XXXX' */
+ if ((cur = strstr(outbuf, "CPU part")) == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("there is no \"CPU part\" info in %s"), CPUINFO);
+ return -1;
+ }
+
+ cur = strchr(cur, ':') + 1;
+ eol = strchr(cur, '\n');
+ virSkipSpaces(&cur);
+ if (!eol || !(str_pvr = g_strndup(cur, eol - cur)) ||
+ virStrToLong_ul(str_pvr, NULL, 16, &data->pvr) < 0)
+ return -1;
+
+ /* Account for format 'CPU Features : XXXX' */
+ if ((cur = strstr(outbuf, "Features")) == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("there is no \"Features\" info in %s"), CPUINFO);
+ return -1;
+ }
+ cur = strchr(cur, ':') + 1;
+ eol = strchr(cur, '\n');
+ virSkipSpaces(&cur);
+ if (eol && !(data->features = g_strndup(cur, eol - cur)))
+ return -1;
+
+ return 0;
+}
+
+static int
+virCPUarmGetHost(virCPUDefPtr cpu,
+ virDomainCapsCPUModelsPtr models)
+{
+ g_autoptr(virCPUData) cpuData = NULL;
+
+ if (virCPUarmDriverInitialize() < 0)
+ return -1;
+
+ if (!(cpuData = virCPUDataNew(archs[0])))
+ return -1;
+
+ if (armCpuDataFromCpuInfo(&cpuData->data.arm) < 0)
+ return -1;
+
+ return virCPUarmDecodeCPUData(cpu, cpuData, models);
+}
+
static virCPUDefPtr
virCPUarmBaseline(virCPUDefPtr *cpus,
@@ -590,6 +675,7 @@ struct cpuArchDriver cpuDriverArm = {
.decode = virCPUarmDecodeCPUData,
.encode = NULL,
.dataFree = virCPUarmDataFree,
+ .getHost = virCPUarmGetHost,
.baseline = virCPUarmBaseline,
.update = virCPUarmUpdate,
.validateFeatures = virCPUarmValidateFeatures,
--
2.23.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。