This patch adds support for threaded debugging on the CRISv32 architecture. It's been floating around for several years now in our local repository so it's way overdue pushing upstream. Patch included inline for review and as attachement for use. Suggested-by: Edgar Iglisias Signed-off-by: Ricard Wanderlof 2013-08-30 Ricard Wanderlof * cris-tdep.c: Fix typedef for elf_greg_t. (cris_gdbarch_init): Add call to set_gdbarch_fetch_tls_load_module_address. gdbserver * linux-crisv32-low.c (ps_get_thread_area): New function. diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c index 03041e4..dce2724 100644 --- a/gdb/cris-tdep.c +++ b/gdb/cris-tdep.c @@ -3820,7 +3820,7 @@ cris_delayed_get_disassembler (bfd_vma addr, struct disassemble_info *info) } /* Copied from . */ -typedef unsigned long elf_greg_t; +typedef uint32_t elf_greg_t; /* Same as user_regs_struct struct in . */ #define CRISV10_ELF_NGREG 35 @@ -4137,6 +4137,9 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_single_step_through_delay (gdbarch, crisv32_single_step_through_delay); + 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