diff options
author | Daniel Jacobowitz <drow@false.org> | 2007-06-13 18:47:58 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2007-06-13 18:47:58 +0000 |
commit | 822b65708d4030ccb4fd2a979de5292f730e30b8 (patch) | |
tree | fb06d73c9429eb083bee074143a9292126d709ec /gdb/mips-linux-nat.c | |
parent | f8b73d13b7ca749dee450b60e4e401b4c096bed6 (diff) | |
download | gdb-822b65708d4030ccb4fd2a979de5292f730e30b8.zip gdb-822b65708d4030ccb4fd2a979de5292f730e30b8.tar.gz gdb-822b65708d4030ccb4fd2a979de5292f730e30b8.tar.bz2 |
* config/mips/linux.mh (TDEP_XML): New.
* features/mips-linux.xml, features/mips64-linux.xml: New files.
* mips-linux-nat.c (mips_linux_register_addr): Handle
MIPS_RESTART_REGNUM.
(mips64_linux_register_addr): Likewise.
(super_xfer_partial, mips_linux_xfer_partial): New.
(_initialize_mips_linux_nat): Add them to the target_ops.
* mips-linux-tdep.c (mips_supply_gregset): Handle MIPS_RESTART_REGNUM.
(mips_fill_gregset, mips64_supply_gregset, mips64_fill_gregset)
(mips_linux_o32_sigframe_init)
(mips_linux_n32n64_sigframe_init): Likewise.
(mips_linux_write_pc, mips_linux_restart_reg_p): New.
(mips_linux_init_abi): Use mips_linux_write_pc. Check for the
"org.gnu.gdb.mips.linux" feature.
* mips-linux-tdep.h (MIPS_RESTART_REGNUM): New constant.
(mips_linux_restart_reg_p): New prototype.
* mips-tdep.c (mips_gdbarch_init): Pass tdesc_data to the OS/ABI
initialization routine.
* Makefile.in (mips-linux-tdep.o, mips-linux-nat.o): Update.
* gdb.texinfo (MIPS Features): Document org.gnu.gdb.mips.linux.
Diffstat (limited to 'gdb/mips-linux-nat.c')
-rw-r--r-- | gdb/mips-linux-nat.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gdb/mips-linux-nat.c b/gdb/mips-linux-nat.c index 2a383ab..79fa358 100644 --- a/gdb/mips-linux-nat.c +++ b/gdb/mips-linux-nat.c @@ -27,10 +27,13 @@ #include "regcache.h" #include "linux-nat.h" #include "mips-linux-tdep.h" +#include "target-descriptions.h" +#include "xml-support.h" #include "gdb_proc_service.h" #include "gregset.h" +#include <sgidefs.h> #include <sys/ptrace.h> #ifndef PTRACE_GET_THREAD_AREA @@ -81,6 +84,8 @@ mips_linux_register_addr (struct gdbarch *gdbarch, int regno, int store) regaddr = FPC_CSR; else if (regno == mips_regnum (gdbarch)->fp_implementation_revision) regaddr = store? (CORE_ADDR) -1 : FPC_EIR; + else if (mips_linux_restart_reg_p (gdbarch) && regno == MIPS_RESTART_REGNUM) + regaddr = 0; else regaddr = (CORE_ADDR) -1; @@ -114,6 +119,8 @@ mips64_linux_register_addr (struct gdbarch *gdbarch, int regno, int store) regaddr = MIPS64_FPC_CSR; else if (regno == mips_regnum (gdbarch)->fp_implementation_revision) regaddr = store? (CORE_ADDR) -1 : MIPS64_FPC_EIR; + else if (mips_linux_restart_reg_p (gdbarch) && regno == MIPS_RESTART_REGNUM) + regaddr = 0; else regaddr = (CORE_ADDR) -1; @@ -335,6 +342,36 @@ mips_linux_register_u_offset (struct gdbarch *gdbarch, int regno, int store_p) return mips_linux_register_addr (gdbarch, regno, store_p); } +static LONGEST (*super_xfer_partial) (struct target_ops *, enum target_object, + const char *, gdb_byte *, const gdb_byte *, + ULONGEST, LONGEST); + +static LONGEST +mips_linux_xfer_partial (struct target_ops *ops, + enum target_object object, + const char *annex, + gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST offset, LONGEST len) +{ + if (object == TARGET_OBJECT_AVAILABLE_FEATURES) + { + if (annex != NULL && strcmp (annex, "target.xml") == 0) + { + /* Report that target registers are a size we know for sure + that we can get from ptrace. */ + if (_MIPS_SIM == _ABIO32) + annex = "mips-linux.xml"; + else + annex = "mips64-linux.xml"; + } + + return xml_builtin_xfer_partial (annex, readbuf, writebuf, offset, len); + } + + return super_xfer_partial (ops, object, annex, readbuf, writebuf, + offset, len); +} + void _initialize_mips_linux_nat (void); void @@ -348,5 +385,9 @@ _initialize_mips_linux_nat (void) t->to_fetch_registers = mips64_linux_fetch_registers; t->to_store_registers = mips64_linux_store_registers; + /* Override the default to_xfer_partial. */ + super_xfer_partial = t->to_xfer_partial; + t->to_xfer_partial = mips_linux_xfer_partial; + linux_nat_add_target (t); } |