diff options
author | Kevin Buettner <kevinb@redhat.com> | 2010-12-15 20:53:08 +0000 |
---|---|---|
committer | Kevin Buettner <kevinb@redhat.com> | 2010-12-15 20:53:08 +0000 |
commit | 8bdf35dcae2506a183214562484f24b4aaffe3ab (patch) | |
tree | 82acaa428ca7fca18b14d9e3ed6e012870702792 | |
parent | 45ccdddcbfd0eea3165b732191613dc85f016b8c (diff) | |
download | gdb-8bdf35dcae2506a183214562484f24b4aaffe3ab.zip gdb-8bdf35dcae2506a183214562484f24b4aaffe3ab.tar.gz gdb-8bdf35dcae2506a183214562484f24b4aaffe3ab.tar.bz2 |
* mips-tdep.c (mips_pseudo_register_write): Sign extend 32-bit
cooked values that are being transferred to 64-bit raw registers.
(mips_pseudo_register_read): Revise to preserve symmetry with
mips_pseudo_register_write().
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/mips-tdep.c | 22 |
2 files changed, 23 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 013ff83..629abfe 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-12-15 Kevin Buettner <kevinb@redhat.com> + + * mips-tdep.c (mips_pseudo_register_write): Sign extend 32-bit + cooked values that are being transferred to 64-bit raw registers. + (mips_pseudo_register_read): Revise to preserve symmetry with + mips_pseudo_register_write(). + 2010-12-15 Greg Watson <g.watson@computer.org> * f-exp.y (yylex): Check entire token against keywords. diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 98e7a3e..36d59dd 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -559,11 +559,15 @@ mips_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, else if (register_size (gdbarch, rawnum) > register_size (gdbarch, cookednum)) { - if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p - || gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) + if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p) regcache_raw_read_part (regcache, rawnum, 0, 4, buf); else - regcache_raw_read_part (regcache, rawnum, 4, 4, buf); + { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + LONGEST regval; + regcache_raw_read_signed (regcache, rawnum, ®val); + store_signed_integer (buf, 4, byte_order, regval); + } } else internal_error (__FILE__, __LINE__, _("bad register size")); @@ -582,11 +586,17 @@ mips_pseudo_register_write (struct gdbarch *gdbarch, else if (register_size (gdbarch, rawnum) > register_size (gdbarch, cookednum)) { - if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p - || gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) + if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p) regcache_raw_write_part (regcache, rawnum, 0, 4, buf); else - regcache_raw_write_part (regcache, rawnum, 4, 4, buf); + { + /* Sign extend the shortened version of the register prior + to placing it in the raw register. This is required for + some mips64 parts in order to avoid unpredictable behavior. */ + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + LONGEST regval = extract_signed_integer (buf, 4, byte_order); + regcache_raw_write_signed (regcache, rawnum, regval); + } } else internal_error (__FILE__, __LINE__, _("bad register size")); |