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~ >