Hi Kushit,

On 6/19/26 8:28 AM, Khushit Shah wrote:
> From f0e489cebdac1ba94b8082bc240f2d889555f7ea Mon Sep 17 00:00:00 2001
> From: Khushit Shah <[email protected]>
> Date: Fri, 19 Jun 2026 11:54:29 +0530
> Subject: [PATCH] scripts: bug fixes in update-aarch64-cpu-sysreg-properties
>
> Signed-off-by: Khushit Shah <[email protected]>
> ---
> While rebasing I found two bugs here:
> - It outputs incorrect value for field that defined a ValueRange.
>    For example, CTX_CMPs (and all similar fields).
I attached the diff it generates. I am not sure this is exactly what we
want. 

for ValueRange such as SMIDR_EL1.HIP

                          "_type": "Values.ValueRange",
                          "end": {
                            "_type": "Values.Value",
                            "meaning": null,
                            "value": "'1111'"
                          },
                          "meaning": null,
                          "start": {
                            "_type": "Values.Value",
                            "meaning": null,
                            "value": "'0001'"

I guess you want all values between 1 and 15
whereas the script currently generates a single value.

Also in the diff I don't see any wrong parsing of 

"decimal 10 might be incorrectly parsed as to 2" fixed by the script. 
Nevertheless can be a proper issue

Thanks

Eric

> - decimal 10 might be incorrectly parsed as to 2.
>
> Sending inline patch that I have added.
> ---
>  .../update-aarch64-cpu-sysreg-properties.py   | 56 ++++++++++++-------
>  1 file changed, 35 insertions(+), 21 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..2e28b03598
> --- 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):
> --
> 2.52.0
>
>
>
--- target/arm/cpu-idregs.h.inc	2026-07-20 14:44:43.174603741 +0200
+++ target/arm/cpu-idregs.h.inc.red	2026-07-20 14:44:07.917890712 +0200
@@ -133,13 +133,17 @@
         IDREG_FIELD_ARCH_VAL(5)
         IDREG_FIELD_ARCH_VAL(6)
     IDREG_FIELD_END(ID_AA64DFR0_EL1, PMSVer)
-    IDREG_FIELD(ID_AA64DFR0_EL1, CTX_CMPs, 28, 4)
+    IDREG_FIELD_START(ID_AA64DFR0_EL1, CTX_CMPs, 28, 4)
+        IDREG_FIELD_ARCH_VAL(15)
+    IDREG_FIELD_END(ID_AA64DFR0_EL1, CTX_CMPs)
     IDREG_FIELD(ID_AA64DFR0_EL1, WRPs, 20, 4)
     IDREG_FIELD_START(ID_AA64DFR0_EL1, PMSS, 16, 4)
         IDREG_FIELD_ARCH_VAL(0)
         IDREG_FIELD_ARCH_VAL(1)
     IDREG_FIELD_END(ID_AA64DFR0_EL1, PMSS)
-    IDREG_FIELD(ID_AA64DFR0_EL1, BRPs, 12, 4)
+    IDREG_FIELD_START(ID_AA64DFR0_EL1, BRPs, 12, 4)
+        IDREG_FIELD_ARCH_VAL(15)
+    IDREG_FIELD_END(ID_AA64DFR0_EL1, BRPs)
     IDREG_FIELD_START(ID_AA64DFR0_EL1, PMUVer, 8, 4)
         IDREG_FIELD_ARCH_VAL(0)
         IDREG_FIELD_ARCH_VAL(1)
@@ -192,9 +196,15 @@
         IDREG_FIELD_ARCH_VAL(1)
         IDREG_FIELD_ARCH_VAL(2)
     IDREG_FIELD_END(ID_AA64DFR1_EL1, SPMU)
-    IDREG_FIELD(ID_AA64DFR1_EL1, CTX_CMPs, 24, 8)
-    IDREG_FIELD(ID_AA64DFR1_EL1, WRPs, 16, 8)
-    IDREG_FIELD(ID_AA64DFR1_EL1, BRPs, 8, 8)
+    IDREG_FIELD_START(ID_AA64DFR1_EL1, CTX_CMPs, 24, 8)
+        IDREG_FIELD_ARCH_VAL(0)
+    IDREG_FIELD_END(ID_AA64DFR1_EL1, CTX_CMPs)
+    IDREG_FIELD_START(ID_AA64DFR1_EL1, WRPs, 16, 8)
+        IDREG_FIELD_ARCH_VAL(0)
+    IDREG_FIELD_END(ID_AA64DFR1_EL1, WRPs)
+    IDREG_FIELD_START(ID_AA64DFR1_EL1, BRPs, 8, 8)
+        IDREG_FIELD_ARCH_VAL(0)
+    IDREG_FIELD_END(ID_AA64DFR1_EL1, BRPs)
     IDREG_FIELD(ID_AA64DFR1_EL1, SYSPMUID, 0, 8)
 IDREG_END(ID_AA64DFR1_EL1)
 
@@ -2049,8 +2059,13 @@
 IDREG_END(REVIDR_EL1)
 
 IDREG_START(SMIDR_EL1)
-    IDREG_FIELD(SMIDR_EL1, NSMC, 56, 4)
-    IDREG_FIELD(SMIDR_EL1, HIP, 52, 4)
+    IDREG_FIELD_START(SMIDR_EL1, NSMC, 56, 4)
+        IDREG_FIELD_ARCH_VAL(0)
+        IDREG_FIELD_ARCH_VAL(15)
+    IDREG_FIELD_END(SMIDR_EL1, NSMC)
+    IDREG_FIELD_START(SMIDR_EL1, HIP, 52, 4)
+        IDREG_FIELD_ARCH_VAL(0)
+    IDREG_FIELD_END(SMIDR_EL1, HIP)
     IDREG_FIELD(SMIDR_EL1, Affinity2, 32, 20)
     IDREG_FIELD_START(SMIDR_EL1, Implementer, 24, 8)
         IDREG_FIELD_ARCH_VAL(0)

Reply via email to