> On 15 Oct 2026, at 7:50 PM, Eric Auger <[email protected]> wrote:
>
> !-------------------------------------------------------------------|
> CAUTION: External Email
>
> |-------------------------------------------------------------------!
>
>
>
> On 9/21/26 2:32 PM, Khushit Shah wrote:
>> 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' ] }
> why do we still need the boolean type? Can't we simplify and stick to
> uint64_t for all SYSREG props?
Hi Eric,
Bools to support existing properties (sve, pauth, etc…) are booleans.
>> +
>> +##
>> +# @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'] } }
> why can't you model that with a range too?
I’m sorry I didn’t get you.
Thanks,
Khushit
>> +
>> +##
>> +# @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: */
> Thanks
>
> Eric