target/loongarch/gdbstub: Fix gdbstub incorrectly handling some registers

Write operation with R32 (orig_a0) and R34 (CSR_BADV) is discarded on
gdbstub implementation for LoongArch system. And return value should
be register size rather than 0, since it is used to calculate offset of
next register such as R33 (PC) in function handle_write_all_regs().

Cc: qemu-stable@nongnu.org
Fixes: ca61e75071c6 ("target/loongarch: Add gdb support.")
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
This commit is contained in:
Bibo Mao 2025-02-18 11:20:27 +08:00
parent b61b9d8913
commit 7bd4eaa847

View File

@ -63,23 +63,24 @@ int loongarch_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
{ {
CPULoongArchState *env = cpu_env(cs); CPULoongArchState *env = cpu_env(cs);
target_ulong tmp; target_ulong tmp;
int read_length;
int length = 0; int length = 0;
if (n < 0 || n > 34) {
return 0;
}
if (is_la64(env)) { if (is_la64(env)) {
tmp = ldq_le_p(mem_buf); tmp = ldq_le_p(mem_buf);
read_length = 8; length = 8;
} else { } else {
tmp = ldl_le_p(mem_buf); tmp = ldl_le_p(mem_buf);
read_length = 4; length = 4;
} }
if (0 <= n && n < 32) { if (0 <= n && n < 32) {
env->gpr[n] = tmp; env->gpr[n] = tmp;
length = read_length;
} else if (n == 33) { } else if (n == 33) {
set_pc(env, tmp); set_pc(env, tmp);
length = read_length;
} }
return length; return length;
} }