Hi Richard,

Thank you for the feedback! I have sent an updated version your way with
the suggested changes!

Thanks,
Vacha

On Mon, Jul 14, 2025 at 3:41 PM Richard Henderson <
richard.hender...@linaro.org> wrote:

> On 7/14/25 11:43, Vacha Bhavsar wrote:
> > diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c
> > index 64ee9b3b56..c39d636caa 100644
> > --- a/target/arm/gdbstub64.c
> > +++ b/target/arm/gdbstub64.c
> > @@ -228,6 +228,87 @@ int aarch64_gdb_set_sve_reg(CPUState *cs, uint8_t
> *buf, int reg)
> >       return 0;
> >   }
> >
> > +int aarch64_gdb_get_sme_reg(CPUState *cs, GByteArray *buf, int reg)
> > +{
> > +    ARMCPU *cpu = ARM_CPU(cs);
> > +    CPUARMState *env = &cpu->env;
> > +    bool streaming_mode = ((env->svcr & 0x01) != 0);
>
> env->svcr & R_SVCR_SM_MASK, although perhaps
>
> > +
> > +    switch (reg) {
> > +    /* Svg register */
> > +    case 0:
> > +    {
> > +        int vq;
> > +        if (streaming_mode) {
> > +            vq = sve_vqm1_for_el_sm(env, arm_current_el(env),
> > +                     streaming_mode) + 1;
> > +        } else {
> > +            vq = 0;
> > +        }
> > +        /* svg = vector granules (2 * vector quardwords) in streaming
> mode */
> > +        return gdb_get_reg64(buf, vq * 2);
>
>      int vq = 0;
>      if (FIELD_EX64(env->svcr, SVCR, SM)) {
>          vq = ...
>      }
>
> is clearer.
>
>
> > +    }
> > +    case 1:
> > +        return gdb_get_reg64(buf, env->svcr);
> > +    case 2:
> > +    {
> > +        int q;
> > +        int len = 0;
> > +        int vq = cpu->sve_max_vq;
>
> sme_max_vq.
>
> > +        int svl = vq * 16;
> > +        for (int i = 0; i < svl; i++) {
> > +            for (q = 0; q < vq; q++) {
>
> for (int q = 0
>
> > +                len += gdb_get_reg128(buf,
> > +                           env->za_state.za[i].d[q * 2 + 1],
> > +                           env->za_state.za[i].d[q * 2]);
> > +            }
> > +        }
> > +        return len;
> > +    }
> > +    default:
> > +        /* gdbstub asked for something out of range */
> > +        qemu_log_mask(LOG_UNIMP, "%s: out of range register %d",
> __func__, reg);
> > +        break;
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> > +int aarch64_gdb_set_sme_reg(CPUState *cs, uint8_t *buf, int reg)
> > +{
> > +    ARMCPU *cpu = ARM_CPU(cs);
> > +    CPUARMState *env = &cpu->env;
> > +
> > +    switch (reg) {
> > +    case 0:
> > +    {
> > +        /* cannot set svg via gdbstub */
> > +        return 0;
> > +    }
>
> I think you return 8 anyway to ignore.
>
> > +    case 1:
> > +        aarch64_set_svcr(env, *(uint64_t *)buf,
>
> ldq_le_p(buf)
>
> > +            R_SVCR_SM_MASK | R_SVCR_ZA_MASK);
> > +        return 8;
> > +    case 2:
> > +        int vq, len = 0;
> > +        int svl = cpu->sve_max_vq * 16;
>
> sme_max_vq.
>
> > +        uint64_t *p = (uint64_t *) buf;
> > +        for (int i = 0; i < svl; i++) {
> > +            for (vq = 0; vq < cpu->sve_max_vq; vq++) {
>
> Mirror the q/vq loop from above.
>
> > +                env->za_state.za[i].d[vq * 2 + 1] = *p++;
> > +                env->za_state.za[i].d[vq * 2] = *p++;
> > +                len += 16;
> > +            }
> > +        }
> > +        return len;
> > +    default:
> > +        /* gdbstub asked for something out of range */
> > +        break;
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> >   int aarch64_gdb_get_pauth_reg(CPUState *cs, GByteArray *buf, int reg)
> >   {
> >       ARMCPU *cpu = ARM_CPU(cs);
> > @@ -392,6 +473,43 @@ GDBFeature *arm_gen_dynamic_svereg_feature(CPUState
> *cs, int base_reg)
> >       return &cpu->dyn_svereg_feature.desc;
> >   }
> >
> > +GDBFeature *arm_gen_dynamic_smereg_feature(CPUState *cs, int base_reg)
> > +{
> > +    ARMCPU *cpu = ARM_CPU(cs);
> > +    int vq = cpu->sve_max_vq;
>
> sme_max_vq.
>
>
> r~
>

Reply via email to