Skip to content

Commit

Permalink
[ARM] Access FPSCR on vfpv2
Browse files Browse the repository at this point in the history
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  <[email protected]>

	PR tdep/21717
	* arm-linux-nat.c (arm_linux_fetch_inferior_registers): Update
	condition for FPSCR.
	(arm_linux_store_inferior_registers): Likewise.
  • Loading branch information
Yao Qi committed Jul 25, 2017
1 parent c26bb06 commit 02ad7fc
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
7 changes: 7 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2017-07-25 Yao Qi <[email protected]>

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 <[email protected]>

* break-catch-syscall.c (struct catch_syscall_inferior_data)
Expand Down
6 changes: 4 additions & 2 deletions gdb/arm-linux-nat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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);
}
}
Expand Down

0 comments on commit 02ad7fc

Please sign in to comment.