This series enhances the current host KVM model with capability to
set writable ID reg fields.
Since v6.7 kernel, KVM/arm allows the userspace to overwrite the values
of a subset of ID regs. The list of writable fields continues to grow.
The feature ID range is defined as the AArch64 System register space
with op0==3, op1=={0, 1, 3}, CRn==0, CRm=={0-7}, op2=={0-7}.
The end goal is to get more flexibility when migrating guests
between different host hardware.
QEMU retrieves the writable ID fields from KVM UAPI [1] and
match them against a generated description of ID regs and their
named fields that stem from AARCHMRS Registers.json file.
Current description is based on latest 2026-03 edition.
The content of the generated files was compared against kernel
linux/arch/arm64/tools/sysreg file [3] . It is not straightforward
to have unit tests for python scripts as there are many cases for
field extraction.
For each writable named field a uint64 property is created
following the "SYSREG_<REG>_<FIELD>" naming convention. REG and
FIELD names are those described in ARM ARM Reference manual.
The list of SYSREG_ID properties can be retrieved through the qmp
monitor using query-cpu-model-expansion [2].
Connie & Eric
This series can be found at:
https://github.com/eauger/qemu/tree/arm-cpu-model-v4
References:
[1]
KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES
KVM_ARM_GET_REG_WRITABLE_MASKS
Documentation/virt/kvm/api.rst
[2]
qemu-system-aarch64 -qmp unix:/home/augere/TEST/QEMU/qmp-sock,server,nowait -M virt --enable-kvm -cpu custom
sudo build/run qmp-shell /home/augere/TEST/QEMU/qmp-sock
Welcome to the QMP low-level shell!
Connected to QEMU 11.0.50
(QEMU) query-cpu-model-expansion type=full model={"name":"host"}
[3]
linux/arch/arm64/tools/sysreg and gen-sysreg.awk
./tools/include/generated/asm/sysreg-defs.h
Cornelia Huck (4):
target/arm/kvm: Introduce kvm_get_writable_id_regs
arm/cpu: accessors for writable id registers
arm-qmp-cmds: introspection for ID register props
arm/cpu-features: document ID reg properties
Eric Auger (13):
scripts: introduce scripts/update-aarch64-cpu-sysregs-header.py
target/arm/cpu-sysregs.h.inc: Sort by name alphabetical order
target/arm/cpu-sysregs.h.inc: Update with automatic generation
arm/cpu: Add infra to handle generated ID register definitions
scripts: Introduce scripts/aarch64_sysreg_helpers module
scripts: Introduce scripts/update-aarch64-cpu-sysreg-properties.py
target/arm/cpu-sysreg-properties.c: Generate code with new script
arm/kvm: Allow reading all the writable ID registers
arm/kvm: write back modified ID regs to KVM
target/arm/kvm: Introduce kvm_arm_expose_idreg_properties
target/arm/kvm: Special case REVIDR_EL1 and AIDR_EL1
target/arm/kvm: Special case ID_AA64ISAR0_EL1 RES0 [24, 27] bits
arm/cpu: Expose writable ID reg field properties on the kvm host vcpu
model
docs/system/arm/cpu-features.rst | 104 ++-
scripts/aarch64_sysreg_helpers.py | 109 +++
.../update-aarch64-cpu-sysreg-properties.py | 169 +++++
scripts/update-aarch64-cpu-sysregs-header.py | 51 ++
target/arm/arm-qmp-cmds.c | 19 +
target/arm/cpu-idregs.h | 59 ++
target/arm/cpu-sysreg-properties.c | 673 ++++++++++++++++++
target/arm/cpu-sysregs.h.inc | 57 +-
target/arm/cpu.c | 12 +
target/arm/cpu.h | 36 +
target/arm/cpu64.c | 26 +-
target/arm/kvm-stub.c | 3 +-
target/arm/kvm.c | 313 +++++++-
target/arm/kvm_arm.h | 19 +-
target/arm/meson.build | 3 +-
target/arm/trace-events | 6 +
16 files changed, 1622 insertions(+), 37 deletions(-)
create mode 100644 scripts/aarch64_sysreg_helpers.py
create mode 100644 scripts/update-aarch64-cpu-sysreg-properties.py
create mode 100755 scripts/update-aarch64-cpu-sysregs-header.py
create mode 100644 target/arm/cpu-idregs.h
create mode 100644 target/arm/cpu-sysreg-properties.c
--
2.53.0