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~