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', [])