Introduce the 'query-cpu-props-info' QMP command. For each CPU model
property, it reports the type (boolean or number) and the set of values
supported under the active accelerator and host.
This helps the management stack to discover which values are supported
for a given CPU property. This is especially important for non-boolean
properties, where knowing that the host has value 'x' does not
inherently reveal the full range of valid values supported on the host.
For example, an Arm host with CTR_EL0.L1Ip=3 (PIPT) also allows 2
(VIPT) but a host with CTR_EL0.L1Ip=2 does not allow CTR_EL0.L1Ip=3
for a guest.
For numerical properties, the supported values are expressed as a list
of inclusive {min, max} ranges. For boolean properties, they are
represented as a list of true/false values.
The command and its return types (CpuPropertyType, CpuPropertyInfo and
friends) are defined in qapi/machine.json rather than an Arm-specific
schema, since the concept applies to other targets (e.g. x86, RISC-V)
too. Targets that do not implement it return an error.
(The following commit implements the command for Arm KVM.)
Signed-off-by: Khushit Shah <[email protected]>
---
qapi/machine.json | 82 ++++++++++++++++++++++++++++++++++++++
stubs/meson.build | 1 +
stubs/qmp-cpu-props-info.c | 12 ++++++
tests/qtest/qmp-cmd-test.c | 1 +
4 files changed, 96 insertions(+)
create mode 100644 stubs/qmp-cpu-props-info.c
diff --git a/qapi/machine.json b/qapi/machine.json
index 2d63c1bac3..6e65bdad86 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -2291,3 +2291,85 @@
# Since: 1.2
##
{ 'command': 'query-cpu-definitions', 'returns': ['CpuDefinitionInfo'] }
+
+##
+# @CpuPropertyType:
+#
+# The type of a CPU model property.
+#
+# @boolean: the property is of type boolean.
+#
+# @number: the property is of type unsigned integer.
+#
+# Since: 11.2
+##
+{ 'enum': 'CpuPropertyType',
+ 'data': [ 'boolean', 'number' ] }
+
+##
+# @CpuPropertyValueRange:
+#
+# An inclusive range of numeric values supported for the property.
+#
+# @min: the lowest supported value.
+#
+# @max: the highest supported value.
+#
+# Since: 11.2
+##
+{ 'struct': 'CpuPropertyValueRange',
+ 'data': { 'min': 'uint64', 'max': 'uint64' } }
+
+##
+# @CpuPropertyInfoBoolean:
+#
+# @supported-values: list of boolean values supported for the
+# property.
+#
+# Since: 11.2
+##
+{ 'struct': 'CpuPropertyInfoBoolean',
+ 'data': { 'supported-values': ['bool'] } }
+
+##
+# @CpuPropertyInfoNumber:
+#
+# @supported-values: list of numeric value ranges supported
+# for the property.
+#
+# Since: 11.2
+##
+{ 'struct': 'CpuPropertyInfoNumber',
+ 'data': { 'supported-values': ['CpuPropertyValueRange'] } }
+
+##
+# @CpuPropertyInfo:
+#
+# Information about a single CPU model property, including the values
+# the host/accelerator supports for it.
+#
+# @name: the name of the property.
+#
+# @type: the type of the property, which selects the layout of
+# @supported-values.
+#
+# Since: 11.2
+##
+{ 'union': 'CpuPropertyInfo',
+ 'base': { 'name': 'str',
+ 'type': 'CpuPropertyType' },
+ 'discriminator': 'type',
+ 'data': { 'boolean': 'CpuPropertyInfoBoolean',
+ 'number': 'CpuPropertyInfoNumber' } }
+
+##
+# @query-cpu-props-info:
+#
+# Return information about the CPU model properties. For each
+# property it reports the values supported under the active
+# accelerator and host.
+#
+# Since: 11.2
+##
+{ 'command': 'query-cpu-props-info',
+ 'returns': ['CpuPropertyInfo'] }
diff --git a/stubs/meson.build b/stubs/meson.build
index 3b2f2680b1..3bb4028bab 100644
--- a/stubs/meson.build
+++ b/stubs/meson.build
@@ -83,6 +83,7 @@ if have_system
stub_ss.add(files('qmp-i386-sgx.c'))
stub_ss.add(files('qmp-i386-xen.c'))
stub_ss.add(files('qmp-cpu.c'))
+ stub_ss.add(files('qmp-cpu-props-info.c'))
stub_ss.add(files('qmp-cpu-s390x.c'))
stub_ss.add(files('qmp-cpu-s390x-kvm.c'))
stub_ss.add(files('hmp-cmd-info_mem.c'))
diff --git a/stubs/qmp-cpu-props-info.c b/stubs/qmp-cpu-props-info.c
new file mode 100644
index 0000000000..36b0530b98
--- /dev/null
+++ b/stubs/qmp-cpu-props-info.c
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "qapi/qapi-commands-machine.h"
+
+CpuPropertyInfoList *
+qmp_query_cpu_props_info(Error **errp)
+{
+ error_setg(errp, "query-cpu-props-info not supported on this target");
+ return NULL;
+}
diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c
index 279a8f5614..2c25dbd8cb 100644
--- a/tests/qtest/qmp-cmd-test.c
+++ b/tests/qtest/qmp-cmd-test.c
@@ -100,6 +100,7 @@ static bool query_is_ignored(const char *cmd)
"add-fd",
/* Success depends on target arch: */
"query-cpu-definitions", /* arm, i386, ppc, s390x */
+ "query-cpu-props-info", /* arm + kvm */
"query-gic-capabilities", /* arm */
"query-s390x-cpu-polarization", /* s390x */
/* Success depends on target-specific build configuration: */
--
2.52.0