From: Markus Armbruster <armbru@redhat.com>
To: Eric Auger <eric.auger@redhat.com>
Cc: eric.auger.pro@gmail.com, qemu-devel@nongnu.org,
qemu-arm@nongnu.org, kvmarm@lists.linux.dev,
peter.maydell@linaro.org, shaju.abraham@nutanix.com,
khushit.shah@nutanix.com, yangjinqian1@huawei.com,
cohuck@redhat.com, richard.henderson@linaro.org,
sebott@redhat.com, skolothumtho@nvidia.com,
philmd@oss.qualcomm.com, maz@kernel.org,
oliver.upton@linux.dev, pbonzini@redhat.com,
berrange@redhat.com, abologna@redhat.com, jdenemar@redhat.com
Subject: Re: [RFC PATCH v7 18/18] arm-qmp-cmds: introspection for ID register props
Date: Thu, 20 Aug 2026 13:50:17 +0200 [thread overview]
Message-ID: <878q613tae.fsf@pond.sub.org> (raw)
In-Reply-To: <20260726153221.24773-19-eric.auger@redhat.com> (Eric Auger's message of "Sun, 26 Jul 2026 17:29:56 +0200")
Eric Auger <eric.auger@redhat.com> writes:
> From: Cornelia Huck <cohuck@redhat.com>
>
> Implement the capability to query available ID register values by
> adding SYSREG_* options and values to the cpu model expansion for the
> host model, if available.
>
> Excerpt:
> (QEMU) query-cpu-model-expansion type=full model={"name":"host"}
Is this qmp-shell?
> {"return": {"model": {"name": "host", "props": {"SYSREG_ID_AA64PFR0_EL1_EL3": 1,
> "SYSREG_ID_AA64ISAR2_EL1_CLRBHB": 0, "SYSREG_CTR_EL0_L1Ip": 3,
> "SYSREG_MIDR_EL1_PartNum": 3407, "SYSREG_CTR_EL0_DminLine": 4,
> "SYSREG_ID_AA64MMFR0_EL1_PARange": 5, "SYSREG_ID_AA64MMFR1_EL1_ECBHB": 0
> ../..
>
> This allows the upper stack to detect available writable ID regs and
> the "host passthrough model" values.
>
> It also allows to test some ID reg field values:
> (QEMU) query-cpu-model-expansion type=full model={"name":"host","props":{"SYSREG_ID_AA64ISAR0_EL1_DP":0x13}}
> {"error": {"class": "GenericError", "desc": "idreg SYSREG_ID_AA64ISAR0_EL1_DP set value (0x13) exceeds length of field (4)!"}}
>
> (QEMU) query-cpu-model-expansion type=full model={"name":"host","props":{"SYSREG_ID_AA64ISAR0_EL1_DP":0x2}}
> {"error": {"class": "GenericError", "desc": "idreg SYSREG_ID_AA64ISAR0_EL1_DP set value (0x2) does not match any arch valid enum value!"}}
The examples use CPU "host". Inconvenient for me, because I run into
"The CPU type 'host' requires KVM" when I try to play with them myself.
If you don't actually need "host" here, consider using something that
works more widely, just to help reviewers.
>
> The following checks are performed:
> - the value does not exceed the field size
> - if the field is associated to enum values, the set value must be one
> of those enum values
> - the value is applied against a scratch vcpu making sure the setting is
> not rejected for this host
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
>
> ---
>
> v5 -> v6:
> - add the write capability
> ---
> target/arm/arm-qmp-cmds.c | 98 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 98 insertions(+)
>
> diff --git a/target/arm/arm-qmp-cmds.c b/target/arm/arm-qmp-cmds.c
> index 83ec95c290..41fefadcea 100644
> --- a/target/arm/arm-qmp-cmds.c
> +++ b/target/arm/arm-qmp-cmds.c
> @@ -21,6 +21,7 @@
> */
>
> #include "qemu/osdep.h"
> +#include "qemu/error-report.h"
> #include "qemu/target-info.h"
> #include "hw/core/boards.h"
> #include "kvm_arm.h"
> @@ -30,7 +31,10 @@
> #include "qapi/qapi-commands-machine.h"
> #include "qapi/qapi-commands-misc-arm.h"
> #include "qobject/qdict.h"
> +#include "qobject/qnum.h"
> #include "qom/qom-qobject.h"
> +#include <linux/kvm.h>
> +#include "system/kvm.h"
> #include "cpu.h"
>
> static GICCapability *gic_cap_new(int version)
> @@ -84,11 +88,14 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
> Error **errp)
> {
> CpuModelExpansionInfo *expansion_info;
> + ObjectPropertyIterator iter;
> const QDict *qdict_in;
> + ObjectProperty *idregprop;
> QDict *qdict_out;
> ObjectClass *oc;
> Object *obj;
> const char *name;
> + int fdarray[3];
> int i;
>
> if (type != CPU_MODEL_EXPANSION_TYPE_FULL) {
> @@ -133,6 +140,38 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
>
> obj = object_new(object_class_get_name(oc));
>
> + if (kvm_enabled()) {
> + bool pmuv3_supported = kvm_check_extension(kvm_state, KVM_CAP_ARM_PMU_V3);
> + bool sve_supported = kvm_check_extension(kvm_state, KVM_CAP_ARM_SVE);
> + struct kvm_vcpu_init init = { .target = -1, };
> + bool el2_supported = kvm_arm_el2_supported();
> + bool pauth_supported;
> + int ret;
> +
> + pauth_supported = kvm_check_extension(kvm_state, KVM_CAP_ARM_PTRAUTH_ADDRESS) &&
> + kvm_check_extension(kvm_state, KVM_CAP_ARM_PTRAUTH_GENERIC);
> +
> + if (sve_supported) {
> + init.features[0] |= 1 << KVM_ARM_VCPU_SVE;
> + }
> + if (el2_supported) {
> + init.features[0] |= 1 << KVM_ARM_VCPU_HAS_EL2;
> + }
> + if (pauth_supported) {
> + init.features[0] |= (1 << KVM_ARM_VCPU_PTRAUTH_ADDRESS |
> + 1 << KVM_ARM_VCPU_PTRAUTH_GENERIC);
> + }
> + if (pmuv3_supported) {
> + init.features[0] |= 1 << KVM_ARM_VCPU_PMU_V3;
> + }
> +
> + ret = kvm_arm_create_scratch_host_vcpu(fdarray, &init);
> + if (!ret) {
> + error_setg(errp, "failing creating a scratch vcpu");
This error message feels off. I'd use something like "can't create
FOO". Still bad, because it provides no clue on why. What are the
possible failure modes?
> + return NULL;
> + }
> + }
> +
> if (model->props) {
> Visitor *visitor;
> Error *err = NULL;
> @@ -145,6 +184,49 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
> }
>
> qdict_in = qobject_to(QDict, model->props);
> +
> + for (const QDictEntry *entry = qdict_first(qdict_in);
> + entry != NULL; entry = qdict_next(qdict_in, entry)) {
> + const char *key = qdict_entry_key(entry);
> + QObject *val_obj = qdict_entry_value(entry);
> + ObjectProperty *prop;
> + Visitor *v;
> + bool success;
> + uint64_t val;
> +
> + prop = object_property_find(obj, key);
> + if (!prop) {
> + error_setg(errp, "%s does not exist!", key);
Scratch the !
From error_setg()'s contract:
* The resulting message should be a single phrase, with no newline or
* trailing punctuation.
Is this error reachable? How?
> + return NULL;
> + }
> +
> + if (!g_str_has_prefix(key, "SYSREG_")) {
> + continue;
> + }
> +
> + /* consume the prop to avoid unexpected parameter */
> + if (!visit_type_uint64(visitor, key, &val, errp)) {
> + return NULL;
> + }
> +
> + v = qobject_input_visitor_new(val_obj);
> +
> + if (!object_property_set(obj, key, v, &err)) {
> + error_propagate(errp, err);
Pass @errp to object_property_set() and drop the error_propagate()?
> + visit_free(v);
> + return NULL;
> + }
> +
> + success = kvm_idreg_write_scratch_vcpu(fdarray[2], v, key,
> + prop->opaque, &err);
> + if (!success) {
> + error_propagate(errp, err);
Likewise?
> + visit_free(v);
> + return NULL;
> + }
> + visit_free(v);
> + }
> +
> i = 0;
> while ((name = cpu_model_advertised_features[i++]) != NULL) {
> if (qdict_get(qdict_in, name)) {
> @@ -160,6 +242,10 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
> if (!err) {
> arm_cpu_finalize_features(ARM_CPU(obj), &err);
> }
> +
> + if (kvm_enabled()) {
> + kvm_arm_destroy_scratch_host_vcpu(fdarray);
> + }
> visit_end_struct(visitor, NULL);
> visit_free(visitor);
> if (err) {
> @@ -190,6 +276,18 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
> }
> }
>
> + object_property_iter_init(&iter, obj);
> +
> + while ((idregprop = object_property_iter_next(&iter))) {
> + QObject *value;
> +
> + if (!g_str_has_prefix(idregprop->name, "SYSREG_")) {
> + continue;
> + }
> + value = object_property_get_qobject(obj, idregprop->name, &error_abort);
> + qdict_put_obj(qdict_out, idregprop->name, value);
> + }
> +
> if (!qdict_size(qdict_out)) {
> qobject_unref(qdict_out);
> } else {
next prev parent reply other threads:[~2026-08-20 11:50 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-26 15:29 [RFC PATCH v7 00/18] kvm/arm: Introduce a customizable aarch64 KVM host model Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 01/18] scripts: introduce scripts/update-aarch64-cpu-sysregs-header.py Eric Auger
2026-08-20 6:31 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 02/18] target/arm/cpu-sysregs.h.inc: Sort by name alphabetical order Eric Auger
2026-08-20 6:32 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 03/18] target/arm/cpu-sysregs.h.inc: Update with automatic generation Eric Auger
2026-08-20 6:55 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 04/18] arm/cpu: Add infra to handle generated ID register definitions Eric Auger
2026-08-20 6:35 ` Khushit Shah
2026-08-20 6:39 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 05/18] scripts: Introduce scripts/aarch64_sysreg_helpers module Eric Auger
2026-08-20 7:09 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 06/18] scripts: Introduce scripts/update-aarch64-cpu-sysreg-properties.py Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 07/18] target/arm/cpu-idregs.h.inc: generate with script Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 08/18] target/arm/cpu-idregs.h.inc: Generate enum values Eric Auger
2026-08-20 9:02 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 09/18] target/arm/cpu_idregs: generate tables for Arm64 ID registers and fields Eric Auger
2026-08-20 9:06 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 10/18] target/arm/kvm: Retrieve writable ID reg map Eric Auger
2026-08-06 4:52 ` Khushit Shah
2026-08-11 8:10 ` Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 11/18] arm/kvm: Initialize all writable ID registers from host Eric Auger
2026-08-20 9:49 ` Khushit Shah
2026-07-26 15:29 ` [RFC PATCH v7 12/18] target/arm/kvm: Introduce kvm_arm_expose_idreg_properties Eric Auger
2026-08-20 11:49 ` Markus Armbruster
2026-07-26 15:29 ` [RFC PATCH v7 13/18] target/arm/cpu: Expose writable ID reg field properties on the kvm host vcpu model Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 14/18] target/arm/cpu-idregs.h.inc: Generate reserved fields Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 15/18] target/arm/kvm: Ignore and trace unexpected writable " Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 16/18] arm/cpu-features: document ID reg properties Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 17/18] target/arm/kvm: add utility to write idregs in scratch vcpu Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 18/18] arm-qmp-cmds: introspection for ID register props Eric Auger
2026-08-20 11:50 ` Markus Armbruster [this message]
2026-08-20 6:27 ` [RFC PATCH v7 00/18] kvm/arm: Introduce a customizable aarch64 KVM host model Khushit Shah
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=878q613tae.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=abologna@redhat.com \
--cc=berrange@redhat.com \
--cc=cohuck@redhat.com \
--cc=eric.auger.pro@gmail.com \
--cc=eric.auger@redhat.com \
--cc=jdenemar@redhat.com \
--cc=khushit.shah@nutanix.com \
--cc=kvmarm@lists.linux.dev \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@oss.qualcomm.com \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=sebott@redhat.com \
--cc=shaju.abraham@nutanix.com \
--cc=skolothumtho@nvidia.com \
--cc=yangjinqian1@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox