[PATCH v2 08/37] target/arm: Use cpreg_field_type in arm_gen_one_feature_sysreg

Richard Henderson posted 37 patches 1 month ago
Maintainers: Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>, Peter Maydell <peter.maydell@linaro.org>, Alexander Graf <agraf@csgraf.de>, Mads Ynddal <mads@ynddal.dk>, Paolo Bonzini <pbonzini@redhat.com>
[PATCH v2 08/37] target/arm: Use cpreg_field_type in arm_gen_one_feature_sysreg
Posted by Richard Henderson 1 month ago
Deduce bitsize from cpreg_field_type.  With this, we can
simplify arm_register_sysreg_for_feature.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/arm/gdbstub.c | 40 +++++++++++++++++++---------------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
index 8d2229f519..89324e4ae9 100644
--- a/target/arm/gdbstub.c
+++ b/target/arm/gdbstub.c
@@ -274,8 +274,9 @@ static int arm_gdb_set_sysreg(CPUState *cs, uint8_t *buf, int reg)
 static void arm_gen_one_feature_sysreg(GDBFeatureBuilder *builder,
                                        DynamicGDBFeatureInfo *dyn_feature,
                                        ARMCPRegInfo *ri, uint32_t ri_key,
-                                       int bitsize, int n)
+                                       int n)
 {
+    int bitsize = 8 << cpreg_field_type(ri);
     gdb_feature_builder_append_reg(builder, ri->name, bitsize, n,
                                    "int", "cp_regs");
 
@@ -292,28 +293,25 @@ static void arm_register_sysreg_for_feature(gpointer key, gpointer value,
     CPUARMState *env = &cpu->env;
     DynamicGDBFeatureInfo *dyn_feature = &cpu->dyn_sysreg_feature;
 
-    if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB))) {
-        if (arm_feature(env, ARM_FEATURE_AARCH64)) {
-            if (ri->state == ARM_CP_STATE_AA64) {
-                arm_gen_one_feature_sysreg(&param->builder, dyn_feature,
-                                           ri, ri_key, 64, param->n++);
-            }
-        } else {
-            if (ri->state == ARM_CP_STATE_AA32) {
-                if (!arm_feature(env, ARM_FEATURE_EL3) &&
-                    (ri->secure & ARM_CP_SECSTATE_S)) {
-                    return;
-                }
-                if (ri->type & ARM_CP_64BIT) {
-                    arm_gen_one_feature_sysreg(&param->builder, dyn_feature,
-                                               ri, ri_key, 64, param->n++);
-                } else {
-                    arm_gen_one_feature_sysreg(&param->builder, dyn_feature,
-                                               ri, ri_key, 32, param->n++);
-                }
-            }
+    if (ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB)) {
+        return;
+    }
+    if (arm_feature(env, ARM_FEATURE_AARCH64)) {
+        if (ri->state != ARM_CP_STATE_AA64) {
+            return;
+        }
+    } else {
+        if (ri->state != ARM_CP_STATE_AA32) {
+            return;
+        }
+        if (!arm_feature(env, ARM_FEATURE_EL3)
+            && (ri->secure & ARM_CP_SECSTATE_S)) {
+            return;
         }
     }
+
+    arm_gen_one_feature_sysreg(&param->builder, dyn_feature,
+                               ri, ri_key, param->n++);
 }
 
 static GDBFeature *arm_gen_dynamic_sysreg_feature(CPUState *cs, int base_reg)
-- 
2.43.0
Re: [PATCH v2 08/37] target/arm: Use cpreg_field_type in arm_gen_one_feature_sysreg
Posted by Peter Maydell 4 weeks ago
On Tue, 14 Oct 2025 at 21:13, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Deduce bitsize from cpreg_field_type.  With this, we can
> simplify arm_register_sysreg_for_feature.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM