* mips-linux-nat.c: Include "gdb_proc_service.h".
authorDaniel Jacobowitz <drow@false.org>
Wed, 15 Mar 2006 16:08:24 +0000 (16:08 +0000)
committerDaniel Jacobowitz <drow@false.org>
Wed, 15 Mar 2006 16:08:24 +0000 (16:08 +0000)
(PTRACE_GET_THREAD_AREA): Define.
(ps_get_thread_area): New.
* Makefile.in (mips-linux-nat.o): Update.

gdb/ChangeLog
gdb/Makefile.in
gdb/mips-linux-nat.c

index 44f5ea4..826678c 100644 (file)
@@ -1,3 +1,10 @@
+2006-03-15  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * mips-linux-nat.c: Include "gdb_proc_service.h".
+       (PTRACE_GET_THREAD_AREA): Define.
+       (ps_get_thread_area): New.
+       * Makefile.in (mips-linux-nat.o): Update.
+
 2006-03-13  Jim Blandy  <jimb@codesourcery.com>
 
        * MAINTAINERS: Use my work address.
index d5abb4f..74bdf0b 100644 (file)
@@ -2295,7 +2295,7 @@ mips64obsd-tdep.o: mips64obsd-tdep.c $(defs_h) $(osabi_h) $(regcache_h) \
        $(gdb_string_h) $(mips_tdep_h) $(solib_svr4_h)
 mips-irix-tdep.o: mips-irix-tdep.c $(defs_h) $(osabi_h) $(elf_bfd_h)
 mips-linux-nat.o: mips-linux-nat.c $(defs_h) $(mips_tdep_h) $(target_h) \
-       $(linux_nat_h)
+       $(linux_nat_h) $(gdb_proc_service_h)
 mips-linux-tdep.o: mips-linux-tdep.c $(defs_h) $(gdbcore_h) $(target_h) \
        $(solib_svr4_h) $(osabi_h) $(mips_tdep_h) $(gdb_string_h) \
        $(gdb_assert_h) $(frame_h) $(regcache_h) $(trad_frame_h) \
index 0d581d1..1f18771 100644 (file)
@@ -1,6 +1,7 @@
 /* Native-dependent code for GNU/Linux on MIPS processors.
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "target.h"
 #include "linux-nat.h"
 
+#include "gdb_proc_service.h"
+
+#ifndef PTRACE_GET_THREAD_AREA
+#define PTRACE_GET_THREAD_AREA 25
+#endif
+
 /* Pseudo registers can not be read.  ptrace does not provide a way to
    read (or set) MIPS_PS_REGNUM, and there's no point in reading or
    setting MIPS_ZERO_REGNUM.  We also can not set BADVADDR, CAUSE, or
@@ -65,6 +72,23 @@ mips_linux_cannot_store_register (int regno)
     return 1;
 }
 
+/* Fetch the thread-local storage pointer for libthread_db.  */
+
+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;
+}
+
 void _initialize_mips_linux_nat (void);
 
 void