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

Khushit Shah <[email protected]>
Newsgroups org.nongnu.qemu-arm,dev.linux.lists.kvmarm,org.nongnu.qemu-devel
Message-ID <[email protected]>
- handle quoted bitstrings  and decimal
- skip Values.ValueRange entries.
- Emit unique RESx_{lsb} names for reserved fields so no two fields in
  a register share a name.
- Emit a dummy 64-bit VAL field for registers with no defined fields,
  such as AIDR_EL1 and REVIDR_EL1.

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