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