From: Eric Auger <eric.auger@redhat.com>
To: eric.auger.pro@gmail.com, eric.auger@redhat.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
Cc: maz@kernel.org, oliver.upton@linux.dev, pbonzini@redhat.com,
armbru@redhat.com, berrange@redhat.com, abologna@redhat.com,
jdenemar@redhat.com
Subject: [RFC PATCH v7 18/18] arm-qmp-cmds: introspection for ID register props
Date: Sun, 26 Jul 2026 17:29:56 +0200 [thread overview]
Message-ID: <20260726153221.24773-19-eric.auger@redhat.com> (raw)
In-Reply-To: <20260726153221.24773-1-eric.auger@redhat.com>
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"}
{"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 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");
+ 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);
+ 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);
+ visit_free(v);
+ return NULL;
+ }
+
+ success = kvm_idreg_write_scratch_vcpu(fdarray[2], v, key,
+ prop->opaque, &err);
+ if (!success) {
+ error_propagate(errp, err);
+ 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 {
--
2.53.0
prev parent reply other threads:[~2026-07-26 15:35 UTC|newest]
Thread overview: 19+ 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-07-26 15:29 ` [RFC PATCH v7 02/18] target/arm/cpu-sysregs.h.inc: Sort by name alphabetical order Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 03/18] target/arm/cpu-sysregs.h.inc: Update with automatic generation Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 04/18] arm/cpu: Add infra to handle generated ID register definitions Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 05/18] scripts: Introduce scripts/aarch64_sysreg_helpers module Eric Auger
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-07-26 15:29 ` [RFC PATCH v7 09/18] target/arm/cpu_idregs: generate tables for Arm64 ID registers and fields Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 10/18] target/arm/kvm: Retrieve writable ID reg map Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 11/18] arm/kvm: Initialize all writable ID registers from host Eric Auger
2026-07-26 15:29 ` [RFC PATCH v7 12/18] target/arm/kvm: Introduce kvm_arm_expose_idreg_properties Eric Auger
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 ` Eric Auger [this message]
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=20260726153221.24773-19-eric.auger@redhat.com \
--to=eric.auger@redhat.com \
--cc=abologna@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=cohuck@redhat.com \
--cc=eric.auger.pro@gmail.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