Re: [RFC PATCH v3 02/19] scripts: bug fixes in update-aarch64-cpu-sysreg-properties

Eric Auger <[email protected]>
Newsgroups org.nongnu.qemu-arm,dev.linux.lists.kvmarm,org.nongnu.qemu-devel
Message-ID <[email protected]>

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.
>
> 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. 
>
>>> - 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', [])
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.