diff options
author | David S. Miller <davem@redhat.com> | 2012-11-23 20:30:23 +0000 |
---|---|---|
committer | David S. Miller <davem@redhat.com> | 2012-11-23 20:30:23 +0000 |
commit | db75c7177045ed2551fe9f8a71bb454f6b71cd5f (patch) | |
tree | 8962e84e56e4138f9f881acf3a144b5b3712fd49 /gdb/sparc-tdep.c | |
parent | 776fc41826bb3fba1c6ced6c28f54347004a694b (diff) | |
download | gdb-db75c7177045ed2551fe9f8a71bb454f6b71cd5f.zip gdb-db75c7177045ed2551fe9f8a71bb454f6b71cd5f.tar.gz gdb-db75c7177045ed2551fe9f8a71bb454f6b71cd5f.tar.bz2 |
Fix Sparc %fsr regset offset for BSD and Linux.
gdb/
* sparc-tdep.h (struct sparc_fpregset): New data structure.
(sparc32_sunos4_fpregset, sparc32_bsd_fpregset,
sparc32_sol2_fpregset): Declare new globals.
(sparc32_supply_fpregset, sparc32_collect_fpregset): Add new
'fpregset' argument.
* sparc64-tdep.h (sparc64_supply_fpregset,
sparc64_collect_fpregset): Likewise.
(sparc64_sol2_fpregset, sparc64_bsd_fpregset): Declare new
globals.
* sparc-nat.h (struct sparc_fpregset): Add forward declaration.
(sparc_fpregset): Declare new global.
(sparc_supply_fpregset, sparc_collect_fpregset): Add new
'fpregset' argument.
* sparc-linux-nat.c (supply_fpregset): Pass sparc_fpregset down
into handler.
(fill_fpregset): Likewise.
(_initialize_sparc_linux_nat): Set sparc_fpregset to
sparc32_bsd_fpregset.
* sparc-linux-tdep.c (sparc32_linux_supply_core_fpregset): Pass
sparc32_bsd_fpregset down into handler.
(sparc32_linux_collect_core_fpregset): Likewise.
* sparc-nat.c (sparc_fpregset): Define.
(sparc_supply_fpregset): Add 'fpregset' argument.
(sparc_collect_fpregset): Likewise.
(sparc_fetch_inferior_registers): Pass sparc_fpregset down
into fpregset handler.
(sparc_store_inferior_registers): Likewise.
(_initialize_sparc_nat): Set sparc_fpregset to
sparc32_sunos4_fpregset if NULL.
* sparc-sol2-nat.c (supply_gregset): Pass sparc_sol2_fpregset
down into handler.
(fill_fpregset): Likewise.
* sparc-sol2-tdep.c (sparc32_sol2_fpregset): Define.
* sparc-tdep.c (sparc32_supply_fpregset): Add fpregset arg and
use it to compute offsets.
(sparc32_collect_fpregset): Likewise.
(sparc32_sunos4_fpregset, sparc32_bsd_fpregset): Define.
* sparc64-linux-nat.c (supply_fpregset): Pass sparc64_bsd_fpregset
down into handler.
(fill_fpregset): Likewise.
* sparc64-linux-tdep.c (sparc64_linux_supply_core_fpregset):
Likewise.
(sparc64_linux_collect_core_fpregset): Likewise.
* sparc64-sol2-tdep.c (sparc64_sol2_fpregset): Define.
* sparc64-tdep.c (sparc64_supply_fpregset): Add fpregset arg and
use it to compute offsets.
(sparc64_collect_fpregset): Likewise.
(sparc64_bsd_fpregset): Define.
* sparc64fbsd-tdep.c (sparc64fbsd_supply_fpregset): Padd
sparc64_bsd_fpregset down into handler.
(sparc64fbsd_collect_fpregset): Likewise.
* sparc64nbsd-nat.c (sparc64nbsd_supply_fpregset): Add fpregset arg
and pass sparc{32,64}_bsd_fpregset down into handler.
(sparc64nbsd_collect_fpregset): Likewise.
* sparc64nbsd-tdep.c (sparc64nbsd_supply_fpregset): Pass
sparc64_bsd_fpregset down into handler.
* sparc64obsd-tdep.c (sparc64obsd_supply_gregset): Likewise.
* sparcnbsd-nat.c (_initialize_sparcnbsd_nat): Set sparc_fpregset
to sparc32_bsd_fpregset.
* sparcnbsd-tdep.c (sparc32nbsd_supply_gregset): Pass
sparc32_bsd_fpregset down into sparc32_supply_fpregset.
(sparc32nbsd_supply_fpregset): Likewise.
Diffstat (limited to 'gdb/sparc-tdep.c')
-rw-r--r-- | gdb/sparc-tdep.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c index 6da2297..3164ed3 100644 --- a/gdb/sparc-tdep.c +++ b/gdb/sparc-tdep.c @@ -1953,7 +1953,8 @@ sparc32_collect_gregset (const struct sparc_gregset *gregset, } void -sparc32_supply_fpregset (struct regcache *regcache, +sparc32_supply_fpregset (const struct sparc_fpregset *fpregset, + struct regcache *regcache, int regnum, const void *fpregs) { const gdb_byte *regs = fpregs; @@ -1962,15 +1963,18 @@ sparc32_supply_fpregset (struct regcache *regcache, for (i = 0; i < 32; i++) { if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1) - regcache_raw_supply (regcache, SPARC_F0_REGNUM + i, regs + (i * 4)); + regcache_raw_supply (regcache, SPARC_F0_REGNUM + i, + regs + fpregset->r_f0_offset + (i * 4)); } if (regnum == SPARC32_FSR_REGNUM || regnum == -1) - regcache_raw_supply (regcache, SPARC32_FSR_REGNUM, regs + (32 * 4) + 4); + regcache_raw_supply (regcache, SPARC32_FSR_REGNUM, + regs + fpregset->r_fsr_offset); } void -sparc32_collect_fpregset (const struct regcache *regcache, +sparc32_collect_fpregset (const struct sparc_fpregset *fpregset, + const struct regcache *regcache, int regnum, void *fpregs) { gdb_byte *regs = fpregs; @@ -1979,11 +1983,13 @@ sparc32_collect_fpregset (const struct regcache *regcache, for (i = 0; i < 32; i++) { if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1) - regcache_raw_collect (regcache, SPARC_F0_REGNUM + i, regs + (i * 4)); + regcache_raw_collect (regcache, SPARC_F0_REGNUM + i, + regs + fpregset->r_f0_offset + (i * 4)); } if (regnum == SPARC32_FSR_REGNUM || regnum == -1) - regcache_raw_collect (regcache, SPARC32_FSR_REGNUM, regs + (32 * 4) + 4); + regcache_raw_collect (regcache, SPARC32_FSR_REGNUM, + regs + fpregset->r_fsr_offset); } @@ -2001,6 +2007,18 @@ const struct sparc_gregset sparc32_sunos4_gregset = 4 * 4, /* %g1 */ -1 /* %l0 */ }; + +const struct sparc_fpregset sparc32_sunos4_fpregset = +{ + 0 * 4, /* %f0 */ + 33 * 4, /* %fsr */ +}; + +const struct sparc_fpregset sparc32_bsd_fpregset = +{ + 0 * 4, /* %f0 */ + 32 * 4, /* %fsr */ +}; /* Provide a prototype to silence -Wmissing-prototypes. */ |