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


Reply via email to