This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH v2][CRISv32] Add support for threaded debugging



This patch adds support for threaded debugging on the CRISv32
architecture. In its original form it's been floating around for several
years now in our local repository so it's way overdue pushing upstream.

Tested by debugging a small program on a CRISv32 target which uses
multiple threads, and verify that the __thread variables can be properly
accessed for every thread.

Patch included inline for review and as attachement for use.


Suggested-by: Edgar Iglesias <edgar.iglesias@gmail.com>
Signed-off-by: Ricard Wanderlof <ricardw@axis.com>


2013-09-03  Ricard Wanderlof  <ricardw@axis.com>

 	* cris-tdep.c:
 	(cris_gdbarch_init): Add call to
 	get_gdbarch_fetch_tls_load_module_address.

gdbserver

 	* linux-crisv32-low.c: PTRACE_GET_THREAD_AREA: New macro.
 	(ps_get_thread_area): New function.


diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c
index 1b0e3cd..ef2746d 100644
--- a/gdb/cris-tdep.c
+++ b/gdb/cris-tdep.c
@@ -4137,6 +4137,11 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        set_gdbarch_single_step_through_delay
  	(gdbarch, crisv32_single_step_through_delay);

+      /* FIXME: Ricard W/2013-09-03: Linux-specific stuff like this
+         should really go in (a new) cris-linux-tdep.c. */
+      set_gdbarch_fetch_tls_load_module_address (gdbarch,
+                                                 svr4_fetch_objfile_link_map);
+
        break;

      default:
diff --git a/gdb/gdbserver/linux-crisv32-low.c b/gdb/gdbserver/linux-crisv32-low.c
index 2849d02..84cb7ff 100644
--- a/gdb/gdbserver/linux-crisv32-low.c
+++ b/gdb/gdbserver/linux-crisv32-low.c
@@ -27,6 +27,10 @@ extern const struct target_desc *tdesc_crisv32;
  /* CRISv32 */
  #define cris_num_regs 49

+#ifndef PTRACE_GET_THREAD_AREA
+#define PTRACE_GET_THREAD_AREA 25
+#endif
+
  /* Note: Ignoring USP (having the stack pointer in two locations causes trouble
     without any significant gain).  */

@@ -339,6 +343,20 @@ cris_stopped_data_address (void)
    return eda;
  }

+ps_err_e
+ps_get_thread_area (const struct ps_prochandle *ph,
+                    lwpid_t lwpid, int idx, void **base)
+{
+  if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
+    return PS_ERR;
+
+  /* IDX is the bias from the thread pointer to the beginning of the
+     thread descriptor.  It has to be subtracted due to implementation
+     quirks in libthread_db.  */
+  *base = (void *) ((char *) *base - idx);
+  return PS_OK;
+}
+
  static void
  cris_fill_gregset (struct regcache *regcache, void *buf)
  {


/Ricard
--
Ricard Wolf WanderlÃf                           ricardw(at)axis.com
Axis Communications AB, Lund, Sweden            www.axis.com
Phone +46 46 272 2016                           Fax +46 46 13 61 30
diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c
index 1b0e3cd..ef2746d 100644
--- a/gdb/cris-tdep.c
+++ b/gdb/cris-tdep.c
@@ -4137,6 +4137,11 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       set_gdbarch_single_step_through_delay 
 	(gdbarch, crisv32_single_step_through_delay);
 
+      /* FIXME: Ricard W/2013-09-03: Linux-specific stuff like this
+         should really go in (a new) cris-linux-tdep.c. */
+      set_gdbarch_fetch_tls_load_module_address (gdbarch,
+                                                 svr4_fetch_objfile_link_map);
+
       break;
 
     default:
diff --git a/gdb/gdbserver/linux-crisv32-low.c b/gdb/gdbserver/linux-crisv32-low.c
index 2849d02..84cb7ff 100644
--- a/gdb/gdbserver/linux-crisv32-low.c
+++ b/gdb/gdbserver/linux-crisv32-low.c
@@ -27,6 +27,10 @@ extern const struct target_desc *tdesc_crisv32;
 /* CRISv32 */
 #define cris_num_regs 49
 
+#ifndef PTRACE_GET_THREAD_AREA
+#define PTRACE_GET_THREAD_AREA 25
+#endif
+
 /* Note: Ignoring USP (having the stack pointer in two locations causes trouble
    without any significant gain).  */
 
@@ -339,6 +343,20 @@ cris_stopped_data_address (void)
   return eda;
 }
 
+ps_err_e
+ps_get_thread_area (const struct ps_prochandle *ph,
+                    lwpid_t lwpid, int idx, void **base)
+{
+  if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
+    return PS_ERR;
+
+  /* IDX is the bias from the thread pointer to the beginning of the
+     thread descriptor.  It has to be subtracted due to implementation
+     quirks in libthread_db.  */
+  *base = (void *) ((char *) *base - idx);
+  return PS_OK;
+}
+
 static void
 cris_fill_gregset (struct regcache *regcache, void *buf)
 {

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]