TaiseiIto <taisei1...@outlook.jp> writes:
> This is a ping to the patch below. > > https://patchew.org/QEMU/ty0pr0101mb4285923fbe9ad97ce832d95ba4...@ty0pr0101mb4285.apcprd01.prod.exchangelabs.com/ > > Before this commit, when GDB attached an OS working on QEMU, order of FPU > stack registers printed by GDB command 'info float' was wrong. There was a > bug causing the problem in 'g' packets sent by QEMU to GDB. The packets have > values of registers of machine emulated by QEMU containing FPU stack > registers. There are 2 ways to specify a x87 FPU stack register. The first > is specifying by absolute indexed register names (R0, ..., R7). The second > is specifying by stack top relative indexed register names (ST0, ..., ST7). > Values of the FPU stack registers should be located in 'g' packet and be > ordered by the relative index. But QEMU had located these registers ordered > by the absolute index. After this commit, when QEMU reads registers to make > a 'g' packet, QEMU specifies FPU stack registers by the relative index. > Then, the registers are ordered correctly in the packet. As a result, GDB, > the packet receiver, can print FPU stack registers in the correct order. > > Signed-off-by: TaiseiIto <taisei1...@outlook.jp> I'm confused what changed between v1 and v2? Why isn't Richard's tag applied? > --- > target/i386/gdbstub.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/target/i386/gdbstub.c b/target/i386/gdbstub.c > index c3a2cf6f28..786971284a 100644 > --- a/target/i386/gdbstub.c > +++ b/target/i386/gdbstub.c > @@ -121,7 +121,9 @@ int x86_cpu_gdb_read_register(CPUState *cs, GByteArray > *mem_buf, int n) > return gdb_get_reg32(mem_buf, env->regs[gpr_map32[n]]); > } > } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) { > - floatx80 *fp = (floatx80 *) &env->fpregs[n - IDX_FP_REGS]; > + int st_index = n - IDX_FP_REGS; > + int r_index = (st_index + env->fpstt) % 8; > + floatx80 *fp = &env->fpregs[r_index].d; > int len = gdb_get_reg64(mem_buf, cpu_to_le64(fp->low)); > len += gdb_get_reg16(mem_buf, cpu_to_le16(fp->high)); > return len; -- Alex Bennée Virtualisation Tech Lead @ Linaro