summaryrefslogtreecommitdiff
path: root/gdb/mips-linux-nat.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <dan@debian.org>2007-06-13 18:47:58 +0000
committerDaniel Jacobowitz <dan@debian.org>2007-06-13 18:47:58 +0000
commit1d3b46a43e49f76e7784e5f98f04594e30a95629 (patch)
tree7016a7feabb642ae2e3d6260a1a4c6d23715e264 /gdb/mips-linux-nat.c
parentce3b14b7917ffa57ae889030f6916b0427c9355c (diff)
downloadgdb-1d3b46a43e49f76e7784e5f98f04594e30a95629.tar.gz
* 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.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/gdb/mips-linux-nat.c b/gdb/mips-linux-nat.c
index 2a383ab47e4..79fa3584ebc 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);
}