> On 16 Oct 2026, at 12:48 PM, Eric Auger <[email protected]> wrote:
>
> !-------------------------------------------------------------------|
> CAUTION: External Email
>
> |-------------------------------------------------------------------!
>
>
>
> On 10/16/26 8:57 AM, Khushit Shah wrote:
>>
>>> 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.
>
> I meant I don't really understand why we need to bother about boolean
> props and why we don't just model everything with list of uint64 ranges.
> I was puzzled by "list of boolean values supported for the property”
Boolean properties are for the sake of completeness.
They will cover, sve, pauth, sveNNNN, aarch64 etc…. Except aarch64,
all of them are modelled as: If hosts supports true, it also supports
false.
So the output of this qmp command for a boolean property can be:
[true], [false], [true, false]
I hope this clears the confusion.
Thanks,
Khushit
> Eric
>>
>> 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