All of lore.kernel.org
 help / color / mirror / Atom feed
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 {



  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.