This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/gdb-8.0-branch] [ARM] Access FPSCR on vfpv2


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=50e64da58e648ff8708935add5b2a87b4e590edf

commit 50e64da58e648ff8708935add5b2a87b4e590edf
Author: Yao Qi <yao.qi@linaro.org>
Date:   Tue Jul 25 10:15:25 2017 +0100

    [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.

Diff:
---
 gdb/ChangeLog       | 7 +++++++
 gdb/arm-linux-nat.c | 6 ++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 283411d..11ff1c9 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-06-04  Joel Brobecker  <brobecker@adacore.com>
 
 	* version.in: Set GDB version number to 8.0.0.DATE-git.
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
index ad3085a..4039d1e 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);
     }
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]