target/loongarch: Split fcc register to fcc0-7 in gdbstub

Since GDB 13.1(GDB commit ea3352172), GDB LoongArch changed to use
fcc0-7 instead of fcc register. This commit partially reverts commit
2f149c759 (`target/loongarch: Update gdb_set_fpu() and gdb_get_fpu()`)
to match the behavior of GDB.

Note that it is a breaking change for GDB 13.0 or earlier, but it is
also required for GDB 13.1 or later to work.

Signed-off-by: Jiajie Chen <c@jia.je>
Acked-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20230808054315.3391465-1-c@jia.je>
Signed-off-by: Song Gao <gaosong@loongson.cn>
This commit is contained in:
Jiajie Chen 2023-08-08 13:42:47 +08:00 committed by Song Gao
parent 2948c1fb6b
commit 17ffe331a9
No known key found for this signature in database
GPG key ID: 40A2FFF239263EDF
2 changed files with 15 additions and 10 deletions

View file

@ -45,6 +45,13 @@
<reg name="f29" bitsize="64" type="fputype" group="float"/> <reg name="f29" bitsize="64" type="fputype" group="float"/>
<reg name="f30" bitsize="64" type="fputype" group="float"/> <reg name="f30" bitsize="64" type="fputype" group="float"/>
<reg name="f31" bitsize="64" type="fputype" group="float"/> <reg name="f31" bitsize="64" type="fputype" group="float"/>
<reg name="fcc" bitsize="64" type="uint64" group="float"/> <reg name="fcc0" bitsize="8" type="uint8" group="float"/>
<reg name="fcc1" bitsize="8" type="uint8" group="float"/>
<reg name="fcc2" bitsize="8" type="uint8" group="float"/>
<reg name="fcc3" bitsize="8" type="uint8" group="float"/>
<reg name="fcc4" bitsize="8" type="uint8" group="float"/>
<reg name="fcc5" bitsize="8" type="uint8" group="float"/>
<reg name="fcc6" bitsize="8" type="uint8" group="float"/>
<reg name="fcc7" bitsize="8" type="uint8" group="float"/>
<reg name="fcsr" bitsize="32" type="uint32" group="float"/> <reg name="fcsr" bitsize="32" type="uint32" group="float"/>
</feature> </feature>

View file

@ -88,10 +88,9 @@ static int loongarch_gdb_get_fpu(CPULoongArchState *env,
{ {
if (0 <= n && n < 32) { if (0 <= n && n < 32) {
return gdb_get_reg64(mem_buf, env->fpr[n].vreg.D(0)); return gdb_get_reg64(mem_buf, env->fpr[n].vreg.D(0));
} else if (n == 32) { } else if (32 <= n && n < 40) {
uint64_t val = read_fcc(env); return gdb_get_reg8(mem_buf, env->cf[n - 32]);
return gdb_get_reg64(mem_buf, val); } else if (n == 40) {
} else if (n == 33) {
return gdb_get_reg32(mem_buf, env->fcsr0); return gdb_get_reg32(mem_buf, env->fcsr0);
} }
return 0; return 0;
@ -105,11 +104,10 @@ static int loongarch_gdb_set_fpu(CPULoongArchState *env,
if (0 <= n && n < 32) { if (0 <= n && n < 32) {
env->fpr[n].vreg.D(0) = ldq_p(mem_buf); env->fpr[n].vreg.D(0) = ldq_p(mem_buf);
length = 8; length = 8;
} else if (n == 32) { } else if (32 <= n && n < 40) {
uint64_t val = ldq_p(mem_buf); env->cf[n - 32] = ldub_p(mem_buf);
write_fcc(env, val); length = 1;
length = 8; } else if (n == 40) {
} else if (n == 33) {
env->fcsr0 = ldl_p(mem_buf); env->fcsr0 = ldl_p(mem_buf);
length = 4; length = 4;
} }