QEMU does not support disable/enable CPU features in AArch64 for now. This patch series add support for CPU features in AArch64. Firstly, we change the isar struct in ARMCPU to an array for convenience. Secondly, we add support to configure CPU feautres in AArch64 and make sure that the ID registers can be synchronized to KVM so that guest can read the value we configure. Thirdly, we add a mechanism to solve the dependency relationship of some CPU features. Last, we add a KVM_CAP_ARM_CPU_FEATURE to check whether KVM supports to set CPU features in AArch64. Also export CPU features to the result of qmp query-cpu-model-expansion so that libvirt can get the supported CPU features. Update the ID fields to ARMv8.6 and add some CPU features according to the new ID fields. With related KVM patch set[1], we can disable/enable CPU features in AArch64. [1] https://patchwork.kernel.org/cover/11711693/ Signed-off-by: Peng Liang <liangpeng10@huawei.com>
125 lines
4.0 KiB
Diff
125 lines
4.0 KiB
Diff
From dca1df05ce3d6b17d03203fc6fd94e23548216c7 Mon Sep 17 00:00:00 2001
|
|
From: Peng Liang <liangpeng10@huawei.com>
|
|
Date: Thu, 6 Aug 2020 16:14:35 +0800
|
|
Subject: [PATCH 2/9] target/arm: parse cpu feature related options
|
|
|
|
The implementation of CPUClass::parse_features only supports CPU
|
|
features in "feature=value" format. However, libvirt maybe send us a
|
|
CPU feature string in "+feature/-feature" format. Hence, we need to
|
|
override CPUClass::parse_features to support CPU feature string in both
|
|
"feature=value" and "+feature/-feature" format.
|
|
|
|
The logic of AArch64CPUClass::parse_features is similar to that of
|
|
X86CPUClass::parse_features.
|
|
|
|
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
|
|
Signed-off-by: Peng Liang <liangpeng10@huawei.com>
|
|
---
|
|
target/arm/cpu64.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 83 insertions(+)
|
|
|
|
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
|
|
index fe648752..7de20848 100644
|
|
--- a/target/arm/cpu64.c
|
|
+++ b/target/arm/cpu64.c
|
|
@@ -506,6 +506,88 @@ static void arm_cpu_parse_featurestr(const char *typename, char *features,
|
|
}
|
|
}
|
|
|
|
+static void
|
|
+cpu_add_feat_as_prop(const char *typename, const char *name, const char *val)
|
|
+{
|
|
+ GlobalProperty *prop = g_new0(typeof(*prop), 1);
|
|
+ prop->driver = typename;
|
|
+ prop->property = g_strdup(name);
|
|
+ prop->value = g_strdup(val);
|
|
+ qdev_prop_register_global(prop);
|
|
+}
|
|
+
|
|
+static gint compare_string(gconstpointer a, gconstpointer b)
|
|
+{
|
|
+ return g_strcmp0(a, b);
|
|
+}
|
|
+
|
|
+static GList *plus_features, *minus_features;
|
|
+
|
|
+static void aarch64_cpu_parse_features(const char *typename, char *features,
|
|
+ Error **errp)
|
|
+{
|
|
+ GList *l;
|
|
+ char *featurestr; /* Single 'key=value" string being parsed */
|
|
+ static bool cpu_globals_initialized;
|
|
+
|
|
+ if (cpu_globals_initialized) {
|
|
+ return;
|
|
+ }
|
|
+ cpu_globals_initialized = true;
|
|
+
|
|
+ if (!features) {
|
|
+ return;
|
|
+ }
|
|
+ for (featurestr = strtok(features, ",");
|
|
+ featurestr;
|
|
+ featurestr = strtok(NULL, ",")) {
|
|
+ const char *name;
|
|
+ const char *val = NULL;
|
|
+ char *eq = NULL;
|
|
+
|
|
+ /* Compatibility syntax: */
|
|
+ if (featurestr[0] == '+') {
|
|
+ plus_features = g_list_append(plus_features,
|
|
+ g_strdup(featurestr + 1));
|
|
+ continue;
|
|
+ } else if (featurestr[0] == '-') {
|
|
+ minus_features = g_list_append(minus_features,
|
|
+ g_strdup(featurestr + 1));
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ eq = strchr(featurestr, '=');
|
|
+ name = featurestr;
|
|
+ if (eq) {
|
|
+ *eq++ = 0;
|
|
+ val = eq;
|
|
+ } else {
|
|
+ error_setg(errp, "Unsupported property format: %s", name);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (g_list_find_custom(plus_features, name, compare_string)) {
|
|
+ warn_report("Ambiguous CPU model string. "
|
|
+ "Don't mix both \"+%s\" and \"%s=%s\"",
|
|
+ name, name, val);
|
|
+ }
|
|
+ if (g_list_find_custom(minus_features, name, compare_string)) {
|
|
+ warn_report("Ambiguous CPU model string. "
|
|
+ "Don't mix both \"-%s\" and \"%s=%s\"",
|
|
+ name, name, val);
|
|
+ }
|
|
+ cpu_add_feat_as_prop(typename, name, val);
|
|
+ }
|
|
+
|
|
+ for (l = plus_features; l; l = l->next) {
|
|
+ cpu_add_feat_as_prop(typename, l->data, "on");
|
|
+ }
|
|
+
|
|
+ for (l = minus_features; l; l = l->next) {
|
|
+ cpu_add_feat_as_prop(typename, l->data, "off");
|
|
+ }
|
|
+}
|
|
+
|
|
static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
|
|
{
|
|
CPUClass *cc = CPU_CLASS(oc);
|
|
@@ -517,6 +599,7 @@ static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
|
|
cc->gdb_num_core_regs = 34;
|
|
cc->gdb_core_xml_file = "aarch64-core.xml";
|
|
cc->gdb_arch_name = aarch64_gdb_arch_name;
|
|
+ cc->parse_features = aarch64_cpu_parse_features;
|
|
}
|
|
|
|
static void aarch64_cpu_instance_init(Object *obj)
|
|
--
|
|
2.25.1
|
|
|