Message ID | 20200414200631.12799-15-alex.bennee@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | more randome fixes (user, pie, docker and gdbstub) | expand |
On 4/14/20 1:06 PM, Alex Bennée wrote: > From: Philippe Mathieu-Daudé <philmd@redhat.com> > > When converted to use GByteArray in commits 462474d760c and > a010bdbe719, the call to stfq_p() was removed. This call > serialize a float. > Since we now use a GByteArray, we can not use stfq_p() directly. > Introduce the gdb_get_float64() helper to load a float64 register. > > Fixes: 462474d760c ("target/m68k: use gdb_get_reg helpers") > Fixes: a010bdbe719 ("extend GByteArray to read register helpers") > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Message-Id: <20200414163853.12164-3-philmd@redhat.com> > --- > include/exec/gdbstub.h | 11 +++++++++++ > target/m68k/helper.c | 3 ++- > target/ppc/gdbstub.c | 4 ++-- > target/ppc/translate_init.inc.c | 2 +- > 4 files changed, 16 insertions(+), 4 deletions(-) Not for 5.0, please. As I mentioned in reply to Phil, this is not a bug fix. Unlike the float32 sh4 usage, the places changed properly use gdb_get_reg64(). r~
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h index 20e10726929..4a2b8e30893 100644 --- a/include/exec/gdbstub.h +++ b/include/exec/gdbstub.h @@ -134,6 +134,17 @@ static inline int gdb_get_float32(GByteArray *array, float32 val) return sizeof(buf); } + +static inline int gdb_get_float64(GByteArray *array, float64 val) +{ + uint8_t buf[sizeof(CPU_DoubleU)]; + + stfq_p(buf, val); + g_byte_array_append(array, buf, sizeof(buf)); + + return sizeof(buf); +} + static inline int gdb_get_zeroes(GByteArray *array, size_t len) { guint oldlen = array->len; diff --git a/target/m68k/helper.c b/target/m68k/helper.c index cad40838956..79b0b10ea9b 100644 --- a/target/m68k/helper.c +++ b/target/m68k/helper.c @@ -72,7 +72,8 @@ static int cf_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *mem_buf, int n) { if (n < 8) { float_status s; - return gdb_get_reg64(mem_buf, floatx80_to_float64(env->fregs[n].d, &s)); + return gdb_get_float64(mem_buf, + floatx80_to_float64(env->fregs[n].d, &s)); } switch (n) { case 8: /* fpcontrol */ diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c index eb362dd9aec..5c11c88b2a8 100644 --- a/target/ppc/gdbstub.c +++ b/target/ppc/gdbstub.c @@ -130,7 +130,7 @@ int ppc_cpu_gdb_read_register(CPUState *cs, GByteArray *buf, int n) gdb_get_regl(buf, env->gpr[n]); } else if (n < 64) { /* fprs */ - gdb_get_reg64(buf, *cpu_fpr_ptr(env, n - 32)); + gdb_get_float64(buf, *cpu_fpr_ptr(env, n - 32)); } else { switch (n) { case 64: @@ -184,7 +184,7 @@ int ppc_cpu_gdb_read_register_apple(CPUState *cs, GByteArray *buf, int n) gdb_get_reg64(buf, env->gpr[n]); } else if (n < 64) { /* fprs */ - gdb_get_reg64(buf, *cpu_fpr_ptr(env, n - 32)); + gdb_get_float64(buf, *cpu_fpr_ptr(env, n - 32)); } else if (n < 96) { /* Altivec */ gdb_get_reg64(buf, n - 64); diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index e853164a865..d825cb59758 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -9881,7 +9881,7 @@ static int gdb_get_float_reg(CPUPPCState *env, GByteArray *buf, int n) { uint8_t *mem_buf; if (n < 32) { - gdb_get_reg64(buf, *cpu_fpr_ptr(env, n)); + gdb_get_float64(buf, *cpu_fpr_ptr(env, n)); mem_buf = gdb_get_reg_ptr(buf, 8); ppc_maybe_bswap_register(env, mem_buf, 8); return 8;