summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2017-07-21 16:35:23 +0100
committerYao Qi <yao.qi@linaro.org>2017-07-25 10:05:58 +0100
commit02ad7fc29f824a9742f8386bcf5793b81ff798f5 (patch)
tree986e7cf77671f278cb77c53acca8136789d433d5
parentc26bb06769ba85818bcf61126c94c2d517182fd9 (diff)
downloadbinutils-gdb-02ad7fc29f824a9742f8386bcf5793b81ff798f5.tar.gz
[ARM] Access FPSCR on vfpv2
GDB can fetch or store FPSCR on vfpv3, which has 32 VFP registers, but fail to do so on vfpv2, which has 16 VFP registers. GDB code is incorrect for vfpv2, else if (tdep->vfp_register_count > 0 && regno >= ARM_D0_REGNUM && regno <= ARM_D0_REGNUM + tdep->vfp_register_count) while FPSCR register number is defined as ARM_D0_REGNUM + 32. ARM_D0_REGNUM, /* VFP double-precision registers. */ ARM_D31_REGNUM = ARM_D0_REGNUM + 31, ARM_FPSCR_REGNUM, The code above uses "<=" rather than "<", in order to put FPSCR in the range, but it is only correct when tdep->vfp_register_count is 32. On vpfv2, it is 16, and FPSCR is out of the range, so fetch_vfp_regs or store_vfp_regs are not called. gdb: 2017-07-25 Yao Qi <yao.qi@linaro.org> PR tdep/21717 * arm-linux-nat.c (arm_linux_fetch_inferior_registers): Update condition for FPSCR. (arm_linux_store_inferior_registers): Likewise.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/arm-linux-nat.c6
2 files changed, 11 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8944833fbbd..eb49001c58e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2017-07-25 Yao Qi <yao.qi@linaro.org>
+
+ PR tdep/21717
+ * arm-linux-nat.c (arm_linux_fetch_inferior_registers): Update
+ condition for FPSCR.
+ (arm_linux_store_inferior_registers): Likewise.
+
2017-07-22 Tom Tromey <tom@tromey.com>
* break-catch-syscall.c (struct catch_syscall_inferior_data)
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
index ad3085a25c6..4039d1e8d8b 100644
--- a/gdb/arm-linux-nat.c
+++ b/gdb/arm-linux-nat.c
@@ -402,7 +402,8 @@ arm_linux_fetch_inferior_registers (struct target_ops *ops,
fetch_wmmx_regs (regcache);
else if (tdep->vfp_register_count > 0
&& regno >= ARM_D0_REGNUM
- && regno <= ARM_D0_REGNUM + tdep->vfp_register_count)
+ && (regno < ARM_D0_REGNUM + tdep->vfp_register_count
+ || regno == ARM_FPSCR_REGNUM))
fetch_vfp_regs (regcache);
}
}
@@ -439,7 +440,8 @@ arm_linux_store_inferior_registers (struct target_ops *ops,
store_wmmx_regs (regcache);
else if (tdep->vfp_register_count > 0
&& regno >= ARM_D0_REGNUM
- && regno <= ARM_D0_REGNUM + tdep->vfp_register_count)
+ && (regno < ARM_D0_REGNUM + tdep->vfp_register_count
+ || regno == ARM_FPSCR_REGNUM))
store_vfp_regs (regcache);
}
}