diff options
author | John Baldwin <jhb@FreeBSD.org> | 2017-04-18 10:49:44 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2017-05-23 12:02:35 -0700 |
commit | d489d81d0934c4fda8c8aa68fbec1b1315cf8df0 (patch) | |
tree | 6713fd5ddb5c94562c0a67627efd6847fde06275 /gdb/mips-fbsd-nat.c | |
parent | 6e92fed5946111a76064feb8a2a184d224deae1a (diff) | |
download | binutils-gdb-d489d81d0934c4fda8c8aa68fbec1b1315cf8df0.tar.gz |
Cleanups to FreeBSD/mips native register operations.
Compare against the "raw" PC register number instead of the cooked
register number when determining if a register was handled by
PT_GETREGS. Previously the register fetch/store operations only tried
PT_GETREGS to fetch any individual register. The result was that
fetching or storing an individual register not covered by PT_GETREGS
(such as floating point registers) did not work.
While here, remove an early exit to simplify the code flow from the
PT_GETREGS / PT_SETREGS case, and add a getfpregs_supplies similar to
getregs_supplies to describe the registers supplied by PT_GETFPREGS
and PT_SETFPREGS.
gdb/ChangeLog:
* mips-fbsd-nat.c (getregs_supplies): Fix upper bound comparison.
(getpfpregs_supplies): New function.
(mips_fbsd_fetch_inferior_registers): Remove early exit and use
getfpregs_supplies.
(mips_fbsd_store_inferior_registers): Likewise.
Diffstat (limited to 'gdb/mips-fbsd-nat.c')
-rw-r--r-- | gdb/mips-fbsd-nat.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/gdb/mips-fbsd-nat.c b/gdb/mips-fbsd-nat.c index 078df52db67..53817d7cd76 100644 --- a/gdb/mips-fbsd-nat.c +++ b/gdb/mips-fbsd-nat.c @@ -31,13 +31,22 @@ #include "mips-fbsd-tdep.h" #include "inf-ptrace.h" -/* Determine if PT_GETREGS fetches this register. */ +/* Determine if PT_GETREGS fetches REGNUM. */ static bool getregs_supplies (struct gdbarch *gdbarch, int regnum) { return (regnum >= MIPS_ZERO_REGNUM - && regnum <= gdbarch_pc_regnum (gdbarch)); + && regnum <= mips_regnum (gdbarch)->pc); +} + +/* Determine if PT_GETFPREGS fetches REGNUM. */ + +static bool +getfpregs_supplies (struct gdbarch *gdbarch, int regnum) +{ + return (regnum >= mips_regnum (gdbarch)->fp0 + && regnum < mips_regnum (gdbarch)->fp_implementation_revision); } /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this @@ -58,12 +67,9 @@ mips_fbsd_fetch_inferior_registers (struct target_ops *ops, perror_with_name (_("Couldn't get registers")); mips_fbsd_supply_gregs (regcache, regnum, ®s, sizeof (register_t)); - if (regnum != -1) - return; } - if (regnum == -1 - || regnum >= gdbarch_fp0_regnum (get_regcache_arch (regcache))) + if (regnum == -1 || getfpregs_supplies (gdbarch, regnum)) { struct fpreg fpregs; @@ -97,13 +103,9 @@ mips_fbsd_store_inferior_registers (struct target_ops *ops, if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); - - if (regnum != -1) - return; } - if (regnum == -1 - || regnum >= gdbarch_fp0_regnum (get_regcache_arch (regcache))) + if (regnum == -1 || getfpregs_supplies (gdbarch, regnum)) { struct fpreg fpregs; |