On 5/7/26 9:22 PM, Shameer Kolothum Thodi wrote: > >> -----Original Message----- >> From: Eric Auger <[email protected]> >> Sent: 03 May 2026 08:34 >> To: [email protected]; [email protected]; qemu- >> [email protected]; [email protected]; [email protected]; >> [email protected]; [email protected]; >> [email protected]; [email protected]; Shameer Kolothum Thodi >> <[email protected]>; [email protected] >> Cc: [email protected]; [email protected]; [email protected]; >> [email protected]; [email protected]; [email protected]; >> [email protected] >> Subject: [PATCH v4 15/17] arm/cpu: Expose writable ID reg field properties on >> the kvm host vcpu model >> >> External email: Use caution opening links or attachments >> >> >> If the host supports KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES and >> KVM_ARM_GET_REG_WRITABLE_MASKS ioctl successfully retrieved the mask >> of writable fields for all ID regs, expose uint64 SYSREG properties >> for all the writable ID reg fields exposed by the host kernel which >> can be matched in target/arm/cpu-sysreg-properties.c. >> >> Properties are named SYSREG_<REG>_<FIELD> with REG and FIELD >> being those used in linux arch/arm64/tools/sysreg or in the AARCHMRS >> Registers.json. >> >> This is achieved by matching the writable fields retrieved from the >> host kernel against the generated description of ID regs and their >> fields in target/arm/cpu-sysreg-properties.c. >> >> An example of invocation is: >> -cpu host,SYSREG_ID_AA64ISAR0_EL1_DP=0x0 >> which sets DP field of ID_AA64ISAR0_EL1 to 0. >> >> [CH: add properties to the host model instead of introducing a new >> "custom" model] >> Signed-off-by: Eric Auger <[email protected]> >> Signed-off-by: Cornelia Huck <[email protected]> >> --- >> target/arm/cpu.c | 12 ++++++++++++ >> target/arm/cpu64.c | 23 ++++++++++++++++++++++- >> 2 files changed, 34 insertions(+), 1 deletion(-) >> >> diff --git a/target/arm/cpu.c b/target/arm/cpu.c >> index 10feb639c4..10ce4eb0cb 100644 >> --- a/target/arm/cpu.c >> +++ b/target/arm/cpu.c >> @@ -1824,6 +1824,18 @@ static void arm_cpu_realizefn(DeviceState *dev, >> Error **errp) >> return; >> } >> >> + /* >> + * If we failed to retrieve the set of writable ID registers for the >> "host" >> + * CPU model, report it here. No error if the interface for discovering >> + * writable ID registers is not available. >> + * In case we did get the set of writable ID registers, set the >> features to >> + * the configured values here and perform some sanity checks. >> + */ >> + if (cpu->writable_id_regs_status == WRITABLE_ID_REGS_FAILED) { >> + error_setg(errp, "Failed to discover writable id registers"); >> + return; >> + } >> + >> if (!cpu->gt_cntfrq_hz) { >> /* >> * 0 means "the board didn't set a value, use the default". (We also >> diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c >> index 1b3d3fb245..d66cb00a21 100644 >> --- a/target/arm/cpu64.c >> +++ b/target/arm/cpu64.c >> @@ -852,6 +852,8 @@ static void >> kvm_arm_set_cpreg_mig_tolerances(ARMCPU *cpu) >> static void aarch64_host_initfn(Object *obj) >> { >> ARMCPU *cpu = ARM_CPU(obj); >> + bool expose_id_regs = true; >> + int ret; > The above will be unused for non KVM builds. removed > >> #if defined(CONFIG_NITRO) >> if (nitro_enabled()) { >> @@ -862,8 +864,27 @@ static void aarch64_host_initfn(Object *obj) >> >> #if defined(CONFIG_KVM) >> kvm_arm_set_cpreg_mig_tolerances(cpu); >> - kvm_arm_set_cpu_features_from_host(cpu, false); >> + >> + cpu->writable_map = g_malloc(sizeof(IdRegMap)); > Does kernel clear the buffer before setting writable mask? yes it does: /* Wipe the whole thing first */ if (clear_user(masks, KVM_ARM_FEATURE_ID_RANGE_SIZE * sizeof(__u64))) return -EFAULT; > >> + /* discover via KVM_ARM_GET_REG_WRITABLE_MASKS */ >> + ret = kvm_arm_get_writable_id_regs(cpu, cpu->writable_map); >> + if (ret == -ENOSYS) { >> + /* legacy: continue without writable id regs */ >> + expose_id_regs = false; >> + } else if (ret) { >> + /* function will have marked an error */ >> + return; >> + } > Should free and NULL writable_map for both error paths above. sure Eric > > Thanks, > Shameer > >> + >> + kvm_arm_set_cpu_features_from_host(cpu, expose_id_regs); >> aarch64_add_sve_properties(obj); >> + >> + if (expose_id_regs) { >> + /* generate SYSREG properties according to writable masks */ >> + kvm_arm_expose_idreg_properties(cpu, arm64_id_regs); >> + } >> + >> #elif defined(CONFIG_HVF) >> hvf_arm_set_cpu_features_from_host(cpu); >> #elif defined(CONFIG_WHPX) >> -- >> 2.53.0
