gdb/
authorYao Qi <yao@codesourcery.com>
Sun, 14 Aug 2011 13:03:13 +0000 (13:03 +0000)
committerYao Qi <yao@codesourcery.com>
Sun, 14 Aug 2011 13:03:13 +0000 (13:03 +0000)
        * remote.c (PACKET_qXfer_fdpic): New enum value.
        (remote_protocol_features): Add qXfer:fdpic:read packet.
        (remote_xfer_partial): Support TARGET_OBJECT_FDPIC.
        (_initialize_remote): Add set/show remote read-fdpic-loadmap command.
        * target.h (enum target_object): Add TARGET_OBJECT_FDPIC.

        gdb/gdbserver:
        * target.h (struct target_ops): Add read_loadmap.
        * linux-low.c (struct target_loadseg): New type.
        (struct target_loadmap): New type.
        (linux_read_loadmap): New function.
        (linux_target_ops): Add linux_read_loadmap.
        * server.c (handle_query): Support qXfer:fdpic:read packet.
* win32-low.c (win32_target_ops): Initialize field `read_loadmap' to NULL.

        gdb/doc/
        * gdb.texinfo : Document qXfer:fdpic:read packet.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/server.c
gdb/gdbserver/target.h
gdb/gdbserver/win32-low.c
gdb/remote.c
gdb/target.h

index d6db027bf5bf45b99380eabfef8dd35ea078506a..534de9b1dbd15f72e074ff56dc483debee9764ef 100644 (file)
@@ -1,3 +1,12 @@
+2011-08-14  Andrew Stubbs <ams@codesourcery.com>
+           Yao Qi  <yao@codesourcery.com>
+
+       * remote.c (PACKET_qXfer_fdpic): New enum value.
+       (remote_protocol_features): Add qXfer:fdpic:read packet.
+       (remote_xfer_partial): Support TARGET_OBJECT_FDPIC.
+       (_initialize_remote): Add set/show remote read-fdpic-loadmap command.
+       * target.h (enum target_object): Add TARGET_OBJECT_FDPIC.
+
 2011-08-14  Yao Qi  <yao@codesourcery.com>
 
        Target description for tic6x.
index 74bf56e8b4cb70fbb1b5c598f8d6d5ae888b890b..de65be63768b6b2c8cfa7494d0c03991f2918178 100644 (file)
@@ -1,6 +1,10 @@
 2011-08-14  Yao Qi  <yao@codesourcery.com>
 
-       * gdb.texinfo: (Standard Target Features): Document C6x features.
+       * gdb.texinfo (General Query Packets): Document qXfer:fdpic:read packet.
+
+2011-08-14  Yao Qi  <yao@codesourcery.com>
+
+       * gdb.texinfo (Standard Target Features): Document C6x features.
        (TIC6x Features): New node.
 
 2011-08-12  Doug Evans  <dje@google.com>
index aa6327ed68c82c435523ea7caea93f201a84b1c0..b477cf383b14b10e31d55a6cd40eddb9b4ac48c1 100644 (file)
@@ -33776,6 +33776,10 @@ These are the currently defined stub features and their properties:
 @tab @samp{-}
 @tab Yes
 
+@item @samp{qXfer:fdpic:read}
+@tab No
+@tab @samp{-}
+@tab Yes
 
 @item @samp{QNonStop}
 @tab No
@@ -33887,6 +33891,10 @@ The remote stub understands the @samp{qXfer:threads:read} packet
 The remote stub understands the @samp{qXfer:traceframe-info:read}
 packet (@pxref{qXfer traceframe info read}).
 
+@item qXfer:fdpic:read
+The remote stub understands the @samp{qXfer:fdpic:read}
+packet (@pxref{qXfer fdpic loadmap read}).
+
 @item QNonStop
 The remote stub understands the @samp{QNonStop} packet
 (@pxref{QNonStop}).
@@ -34142,6 +34150,15 @@ Return a description of the current traceframe's contents.
 This packet is not probed by default; the remote stub must request it,
 by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
 
+@item qXfer:fdpic:read:@var{annex}:@var{offset},@var{length}
+@anchor{qXfer fdpic loadmap read}
+Read contents of @code{loadmap}s on the target system.  The
+annex, either @samp{exec} or @samp{interp}, specifies which @code{loadmap},
+executable @code{loadmap} or interpreter @code{loadmap} to read.
+
+This packet is not probed by default; the remote stub must request it,
+by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
+
 @item qXfer:osdata:read::@var{offset},@var{length}
 @anchor{qXfer osdata read}
 Access the target's @dfn{operating system information}.  
index c8512f41e54547da2f33e3230c9bebcf360004a0..7b2b165a1e97f90dd982f195469fa94dcba75873 100644 (file)
@@ -1,3 +1,14 @@
+2011-08-14  Andrew Stubbs <ams@codesourcery.com>
+           Yao Qi  <yao@codesourcery.com>
+
+       * target.h (struct target_ops): Add read_loadmap.
+       * linux-low.c (struct target_loadseg): New type.
+       (struct target_loadmap): New type.
+       (linux_read_loadmap): New function.
+       (linux_target_ops): Add linux_read_loadmap.
+       * server.c (handle_query): Support qXfer:fdpic:read packet.
+       * win32-low.c (win32_target_ops): Initialize field `read_loadmap' to NULL.
+
 2011-08-05  Eli Zaretskii  <eliz@gnu.org>
 
        * win32-low.c: Include <stdint.h>.
index a9cdacac51a47edaed8a547dfce077e20d05db66..999ca92c8fa902e1feaf162891bfd20a6fed897e 100644 (file)
@@ -4654,6 +4654,66 @@ linux_qxfer_spu (const char *annex, unsigned char *readbuf,
   return ret;
 }
 
+#if defined PT_GETDSBT
+struct target_loadseg
+{
+  /* Core address to which the segment is mapped.  */
+  Elf32_Addr addr;
+  /* VMA recorded in the program header.  */
+  Elf32_Addr p_vaddr;
+  /* Size of this segment in memory.  */
+  Elf32_Word p_memsz;
+};
+
+struct target_loadmap
+{
+  /* Protocol version number, must be zero.  */
+  Elf32_Word version;
+  /* Pointer to the DSBT table, its size, and the DSBT index.  */
+  unsigned *dsbt_table;
+  unsigned dsbt_size, dsbt_index;
+  /* Number of segments in this map.  */
+  Elf32_Word nsegs;
+  /* The actual memory map.  */
+  struct target_loadseg segs[/*nsegs*/];
+};
+#endif
+
+#if defined PT_GETDSBT
+static int
+linux_read_loadmap (const char *annex, CORE_ADDR offset,
+                   unsigned char *myaddr, unsigned int len)
+{
+  int pid = lwpid_of (get_thread_lwp (current_inferior));
+  int addr = -1;
+  struct target_loadmap *data = NULL;
+  unsigned int actual_length, copy_length;
+
+  if (strcmp (annex, "exec") == 0)
+    addr= (int) PTRACE_GETDSBT_EXEC;
+  else if (strcmp (annex, "interp") == 0)
+    addr = (int) PTRACE_GETDSBT_INTERP;
+  else
+    return -1;
+
+  if (ptrace (PT_GETDSBT, pid, addr, &data) != 0)
+    return -1;
+
+  if (data == NULL)
+    return -1;
+
+  actual_length = sizeof (struct target_loadmap)
+    + sizeof (struct target_loadseg) * data->nsegs;
+
+  if (offset < 0 || offset > actual_length)
+    return -1;
+
+  copy_length = actual_length - offset < len ? actual_length - offset : len;
+  memcpy (myaddr, (char *) data + offset, copy_length);
+  return copy_length;
+}
+#endif /* defined PT_GETDSBT */
+
 static void
 linux_process_qsupported (const char *query)
 {
@@ -4802,6 +4862,11 @@ static struct target_ops linux_target_ops = {
   NULL,
 #endif
   linux_common_core_of_thread,
+#if defined PT_GETDSBT
+  linux_read_loadmap,
+#else
+  NULL,
+#endif
   linux_process_qsupported,
   linux_supports_tracepoints,
   linux_read_pc,
index a87aef558a1eeb0b0ad96e5f2cc70a06ef5f909a..a97bf861387e58875b8e0ebe045f7d9ebb220278 100644 (file)
@@ -1171,9 +1171,25 @@ handle_qxfer_traceframe_info (const char *annex,
   return len;
 }
 
+/* Handle qXfer:fdpic:read.  */
+
+static int
+handle_qxfer_fdpic (const char *annex, gdb_byte *readbuf,
+                   const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
+{
+  if (the_target->read_loadmap == NULL)
+    return -2;
+
+  if (!target_running ())
+    return -1;
+
+  return (*the_target->read_loadmap) (annex, offset, readbuf, len);
+}
+
 static const struct qxfer qxfer_packets[] =
   {
     { "auxv", handle_qxfer_auxv },
+    { "fdpic", handle_qxfer_fdpic},
     { "features", handle_qxfer_features },
     { "libraries", handle_qxfer_libraries },
     { "osdata", handle_qxfer_osdata },
@@ -1509,6 +1525,9 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
       if (the_target->qxfer_siginfo != NULL)
        strcat (own_buf, ";qXfer:siginfo:read+;qXfer:siginfo:write+");
 
+      if (the_target->read_loadmap != NULL)
+       strcat (own_buf, ";qXfer:fdpic:read+");
+
       /* We always report qXfer:features:read, as targets may
         install XML files on a subsequent call to arch_setup.
         If we reported to GDB on startup that we don't support
index 00214db469add1daad79aa3428c62f531aba387b..3a823a146f999bc3b7fdd127f37c8299d71fb0df 100644 (file)
@@ -311,6 +311,10 @@ struct target_ops
   /* Returns the core given a thread, or -1 if not known.  */
   int (*core_of_thread) (ptid_t);
 
+  /* Read loadmaps.  Read LEN bytes at OFFSET into a buffer at MYADDR.  */
+  int (*read_loadmap) (const char *annex, CORE_ADDR offset,
+                            unsigned char *myaddr, unsigned int len);
+
   /* Target specific qSupported support.  */
   void (*process_qsupported) (const char *);
 
index cc4e23dff526a711be1802da908e0b0e34f3b2c8..728af50a35a117ee8cc156e61d33ca7eb6652d02 100644 (file)
@@ -1811,6 +1811,7 @@ static struct target_ops win32_target_ops = {
   NULL, /* supports_multi_process */
   NULL, /* handle_monitor_command */
   NULL, /* core_of_thread */
+  NULL, /* read_fdpic_loadmap */
   NULL, /* process_qsupported */
   NULL, /* supports_tracepoints */
   NULL, /* read_pc */
index fd4852fa2ece8ac2bdd639fcb5240663d40c7d95..7acbc71d79dfe1381b8971430c4b155a47f30116 100644 (file)
@@ -1262,6 +1262,7 @@ enum {
   PACKET_bs,
   PACKET_TracepointSource,
   PACKET_QAllow,
+  PACKET_qXfer_fdpic,
   PACKET_MAX
 };
 
@@ -3758,6 +3759,8 @@ static struct protocol_feature remote_protocol_features[] = {
     PACKET_QAllow },
   { "EnableDisableTracepoints", PACKET_DISABLE,
     remote_enable_disable_tracepoint_feature, -1 },
+  { "qXfer:fdpic:read", PACKET_DISABLE, remote_supported_packet,
+    PACKET_qXfer_fdpic },
 };
 
 static char *remote_support_xml;
@@ -8302,6 +8305,10 @@ remote_xfer_partial (struct target_ops *ops, enum target_object object,
       return remote_read_qxfer
        (ops, "traceframe-info", annex, readbuf, offset, len,
         &remote_protocol_packets[PACKET_qXfer_traceframe_info]);
+
+    case TARGET_OBJECT_FDPIC:
+      return remote_read_qxfer (ops, "fdpic", annex, readbuf, offset, len,
+                               &remote_protocol_packets[PACKET_qXfer_fdpic]);
     default:
       return -1;
     }
@@ -10930,6 +10937,9 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL,
   add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_statictrace_read],
                          "qXfer:statictrace:read", "read-sdata-object", 0);
 
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_fdpic],
+                        "qXfer:fdpic:read", "read-fdpic-loadmap", 0);
+
   /* Keep the old ``set remote Z-packet ...'' working.  Each individual
      Z sub-packet has its own set and show commands, but users may
      have sets to this variable in their .gdbinit files (or in their
index 3b39d6f74b27af202f994cc5ffdacdd12cf1fcf2..e2646571e3f4a3ca812fc408a090e95169ae34ac 100644 (file)
@@ -274,6 +274,8 @@ enum target_object
   TARGET_OBJECT_HPUX_SOLIB_GOT,
   /* Traceframe info, in XML format.  */
   TARGET_OBJECT_TRACEFRAME_INFO,
+  /* Load maps for FDPIC systems.  */
+  TARGET_OBJECT_FDPIC,
   /* Possible future objects: TARGET_OBJECT_FILE, ...  */
 };