On 8/18/26 11:43 AM, Khushit Shah wrote:
>
>> On 14 Aug 2026, at 7:15 PM, Eric Auger <[email protected]> wrote:
>>
>> !-------------------------------------------------------------------|
>>  CAUTION: External Email
>>
>> |-------------------------------------------------------------------!
>>
>>
>>
>> On 8/3/26 4:32 PM, Khushit Shah wrote:
>>>> On 20 Jul 2026, at 7:54 PM, Eric Auger <[email protected]> wrote:
>>>>
>>>> !-------------------------------------------------------------------|
>>>> CAUTION: External Email
>>>>
>>>> |-------------------------------------------------------------------!
>>>>
>>>>
>>>>
>>>> On 7/16/26 11:38 PM, Khushit Shah wrote:
>>>>> - handle quoted bitstrings  and decimal
>>>>> - skip Values.ValueRange entries.
>>>> The above is the issue you reported on my v6. See my comment on the
>>>> other thread.
>>> Acked.
>>>>> - Emit unique RESx_{lsb} names for reserved fields so no two fields in
>>>>> a register share a name.
>>>> The requirement for naming RES field needs to be explained. I understand
>>>> that now you expose all fields including those which are not writable it
>>>> may be required but at this stage I still fail why this is requested.
>>> I think we don’t need to expose RES fields to users. 
>>> I was thinking of case where a RES0 field is repurposed for
>>> something else, but that should be taken care by zeroing the
>>> ID regs array before initiating the named model hierarchy.
>>> (RES1 field in CTR_EL0 needs some handling).
>> I also think so. you can rely on AARCHMRS desc to identify the right
>> default values.
> Acked.
>
>>> On why we even need to expose non-writable fields:
>>> - Assume some non-writable field mismatches for the model and
>>>  host, why do we want to stop users from explicitly overriding
>>>  the model's field value to host value?
>> I agree this needs to be checked. However as I suggested I think you can
>> avoid exposing them to the end-users as props. You just need to read the
>> value from host and compare it with the value set in the named model. 
> I am not sure how that will work, assume following scenario:
>
> - Host is running on `neoverse-v2` core and we want to run guest with 
> `neoverse-v1`
>   model. “pauth” fields are not exactly writable, and "neoverse-v1” implements
>   different pauth algorithm than "neoverse-v2”. Now, if we don’t expose 
> “pauth” as
>   it is not writable, how will end user be able to say I want to run 
> neoverse-v1
>   model so please disable "pauth”.
>
> What I want to support is end user to say "please use the host value for some 
> non-writable
> fields as the model I want to run has values which are not supported on the 
> current host.”
OK I see your point now. sorry for the misunderstanding. So in that case
effectively you need a true QEMU prop for each field even for those
which are not KVM writable. Please ignore my previous reply ;-)

Thanks

Eric
>
> The same “pauth” example will suffer if we don’t expose APA/GPA in 
> cpu-model-expansion,
> how will management stack infer that both host supports “pauth" but they 
> support different
> versions and are not compatible?
>
> Warm Regards,
> Khushit
>
>>>
>>>>> - Emit a dummy 64-bit VAL field for registers with no defined fields,
>>>>> such as AIDR_EL1 and REVIDR_EL1.
>>>> This is yet another functional change that could be separate.
>>> Acked, will do in v4.
>> Thanks
>>
>> Eric
>>>> Thanks
>>>>
>>>> Eric
>>>>> Signed-off-by: Khushit Shah <[email protected]>
>>>>> ---
>>>>> .../update-aarch64-cpu-sysreg-properties.py   | 67 +++++++++++++------
>>>>> 1 file changed, 45 insertions(+), 22 deletions(-)
>>>>> mode change 100644 => 100755 
>>>>> scripts/update-aarch64-cpu-sysreg-properties.py
>>>>>
>>>>> diff --git a/scripts/update-aarch64-cpu-sysreg-properties.py 
>>>>> b/scripts/update-aarch64-cpu-sysreg-properties.py
>>>>> old mode 100644
>>>>> new mode 100755
>>>>> index 9e829fda2e..ecc35db528
>>>>> --- a/scripts/update-aarch64-cpu-sysreg-properties.py
>>>>> +++ b/scripts/update-aarch64-cpu-sysreg-properties.py
>>>>> @@ -106,6 +106,29 @@ def collect_fields(item, bit_offset=0):
>>>>>
>>>>>    return fields
>>>>>
>>>>> +def parse_value_int(raw_val):
>>>>> +    if raw_val is None or isinstance(raw_val, bool):
>>>>> +        return None
>>>>> +
>>>>> +    # may already be real number
>>>>> +    if isinstance(raw_val, int):
>>>>> +        return raw_val
>>>>> +
>>>>> +    raw_str = str(raw_val).strip()
>>>>> +
>>>>> +    if "'" in raw_str:
>>>>> +        # quoted bitstring like "'0100'"
>>>>> +        bits = raw_str.replace("'", "")
>>>>> +        try:
>>>>> +            return int(bits, 2)
>>>>> +        except ValueError:
>>>>> +            return None
>>>>> +
>>>>> +    # unquoted, try decimal
>>>>> +    try:
>>>>> +        return int(raw_str, 0)
>>>>> +    except ValueError:
>>>>> +        return None
>>>>>
>>>>> def extract_field_enums(field):
>>>>>    enums = []
>>>>> @@ -124,32 +147,23 @@ def extract_field_enums(field):
>>>>>    if not isinstance(val_entries, list):
>>>>>        return enums
>>>>>
>>>>> +    # A Values.ValueRange field specifies start and end value for a 
>>>>> range.
>>>>> +    # Don't enumerate anything for them.
>>>>> +    for val_entry in val_entries:
>>>>> +        if isinstance(val_entry, dict) and \
>>>>> +           val_entry.get("_type") == "Values.ValueRange":
>>>>> +               return []
>>>>> +
>>>>>    for val_entry in val_entries:
>>>>>        if not isinstance(val_entry, dict):
>>>>>            continue
>>>>> -            
>>>>> +
>>>>>        if val_entry.get("_type") == "Values.Value":
>>>>> -            raw_val = val_entry.get("value")
>>>>> -            if raw_val is None:
>>>>> +            int_val = parse_value_int(val_entry.get("value"))
>>>>> +            if int_val is None:
>>>>>                continue
>>>>> -                
>>>>> -            # some of the values have ' like "'0100'"
>>>>> -            raw_val_str = str(raw_val).strip().replace("'", "")
>>>>> -            
>>>>> -            try:
>>>>> -                # convert into bin 
>>>>> -                int_val = int(raw_val_str, 2)
>>>>> -            except ValueError:
>>>>> -                try:
>>>>> -                    # Fallback to dec if not bin
>>>>> -                    int_val = int(raw_val_str, 0)
>>>>> -                except ValueError:
>>>>> -                    continue
>>>>> -            
>>>>> -            enums.append({
>>>>> -                'value': int_val
>>>>> -            })
>>>>> -            
>>>>> +            enums.append({'value': int_val})
>>>>> +
>>>>>    return enums
>>>>>
>>>>> def generate_sysreg_properties_from_registers_json(id_reg_names, 
>>>>> raw_json_path):
>>>>> @@ -210,7 +224,7 @@ def 
>>>>> generate_sysreg_properties_from_registers_json(id_reg_names, 
>>>>> raw_json_path):
>>>>>                       msb > current_fieldset_fields[unique_key]['msb']:
>>>>>                        enums = extract_field_enums(val)
>>>>>                        current_fieldset_fields[unique_key] = {
>>>>> -                            'raw_name': name,
>>>>> +                            'raw_name': unique_key,
>>>>>                            'lsb': lsb,
>>>>>                            'msb': msb,
>>>>>                            'width': width,
>>>>> @@ -238,6 +252,15 @@ def 
>>>>> generate_sysreg_properties_from_registers_json(id_reg_names, 
>>>>> raw_json_path):
>>>>>        # Sort decreasing lsbs
>>>>>        sorted_fields = sorted(unique_fields.items(),
>>>>>                               key=lambda x: x[1]['lsb'], reverse=True)
>>>>> +        if len(sorted_fields) == 0:
>>>>> +            # cases like REVIDR_EL1 and AIDR_EL1.
>>>>> +            # augment a dummy fields VAL.
>>>>> +            sorted_fields.append(('VAL', {
>>>>> +                'lsb': 0,
>>>>> +                'msb': 63,
>>>>> +                'width': 64,
>>>>> +                'enums': []
>>>>> +            }))
>>>>>
>>>>>        for unique_key, bits in sorted_fields:
>>>>>            enums_list = bits.get('enums', [])
>


Reply via email to