svn commit: r216734 - in stable/8: contrib/binutils/bfd contrib/binutils/binutils contrib/binutils/include/elf contrib/file contrib/gdb/gdb gnu/usr.bin/gdb/libgdb sys/compat/freebsd32 sys/kern sys/...

Attilio Rao attilio at FreeBSD.org
Mon Dec 27 12:39:25 UTC 2010


Author: attilio
Date: Mon Dec 27 12:39:24 2010
New Revision: 216734
URL: http://svn.freebsd.org/changeset/base/216734

Log:
  MFC r215679:
  Add the ability for GDB to printout the thread name along with other thread
  specific informations.
  In order to achieve that, for both on-line debugging and core analysis,
  a new member to PT_LWPINFO ptrace(2) interface is added and a new
  ELF note (NT_THRMISC) as well.
  
  Sponsored by:	Sandvine Incorporated

Modified:
  stable/8/contrib/binutils/bfd/elf-bfd.h
  stable/8/contrib/binutils/bfd/elf.c
  stable/8/contrib/binutils/binutils/readelf.c
  stable/8/contrib/binutils/include/elf/common.h
  stable/8/contrib/file/readelf.h
  stable/8/contrib/gdb/gdb/fbsd-proc.c
  stable/8/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
  stable/8/sys/compat/freebsd32/freebsd32.h
  stable/8/sys/kern/imgact_elf.c
  stable/8/sys/kern/sys_process.c
  stable/8/sys/sys/elf_common.h
  stable/8/sys/sys/procfs.h
  stable/8/sys/sys/ptrace.h
  stable/8/usr.bin/gcore/elfcore.c
Directory Properties:
  stable/8/contrib/binutils/   (props changed)
  stable/8/contrib/file/   (props changed)
  stable/8/contrib/gdb/   (props changed)
  stable/8/gnu/usr.bin/gdb/   (props changed)
  stable/8/gnu/usr.bin/gdb/kgdb/   (props changed)
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/usr.bin/gcore/   (props changed)

Modified: stable/8/contrib/binutils/bfd/elf-bfd.h
==============================================================================
--- stable/8/contrib/binutils/bfd/elf-bfd.h	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/contrib/binutils/bfd/elf-bfd.h	Mon Dec 27 12:39:24 2010	(r216734)
@@ -1673,6 +1673,8 @@ extern char * elfcore_write_pstatus
   (bfd *, char *, int *, long, int, const void *);
 extern char *elfcore_write_prfpreg
   (bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_thrmisc
+  (bfd *, char *, int *, const char *, int);
 extern char *elfcore_write_prxfpreg
   (bfd *, char *, int *, const void *, int);
 extern char *elfcore_write_lwpstatus

Modified: stable/8/contrib/binutils/bfd/elf.c
==============================================================================
--- stable/8/contrib/binutils/bfd/elf.c	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/contrib/binutils/bfd/elf.c	Mon Dec 27 12:39:24 2010	(r216734)
@@ -6316,6 +6316,12 @@ _bfd_elf_rel_vtable_reloc_fn
 
 #ifdef HAVE_SYS_PROCFS_H
 # include <sys/procfs.h>
+
+/* Define HAVE_THRMISC_T for consistency with other similar GNU-type stubs. */
+#undef	HAVE_THRMISC_T
+#if defined (THRMISC_VERSION)
+#define	HAVE_THRMISC_T	1
+#endif
 #endif
 
 /* FIXME: this is kinda wrong, but it's what gdb wants.  */
@@ -6497,6 +6503,16 @@ elfcore_grok_prxfpreg (bfd *abfd, Elf_In
   return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
 }
 
+#if defined (HAVE_THRMISC_T)
+
+static bfd_boolean
+elfcore_grok_thrmisc (bfd *abfd, Elf_Internal_Note *note)
+{
+  return elfcore_make_note_pseudosection (abfd, ".tname", note);
+}
+
+#endif /* defined (HAVE_THRMISC_T) */
+
 #if defined (HAVE_PRPSINFO_T)
 typedef prpsinfo_t   elfcore_psinfo_t;
 #if defined (HAVE_PRPSINFO32_T)		/* Sparc64 cross Sparc32 */
@@ -6863,6 +6879,12 @@ elfcore_grok_note (bfd *abfd, Elf_Intern
 
 	return TRUE;
       }
+
+#if defined (HAVE_THRMISC_T)
+    case NT_THRMISC:
+      return elfcore_grok_thrmisc (abfd, note);
+#endif
+
     }
 }
 
@@ -7245,6 +7267,22 @@ elfcore_write_prfpreg (bfd *abfd,
 }
 
 char *
+elfcore_write_thrmisc (bfd *abfd,
+		       char *buf,
+		       int *bufsiz,
+		       const char *tname,
+		       int size)
+{
+#if defined (HAVE_THRMISC_T)
+  char *note_name = "CORE";
+  return elfcore_write_note (abfd, buf, bufsiz,
+			     note_name, NT_THRMISC, tname, size);
+#else
+  return buf;
+#endif
+}
+
+char *
 elfcore_write_prxfpreg (bfd *abfd,
 			char *buf,
 			int *bufsiz,

Modified: stable/8/contrib/binutils/binutils/readelf.c
==============================================================================
--- stable/8/contrib/binutils/binutils/readelf.c	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/contrib/binutils/binutils/readelf.c	Mon Dec 27 12:39:24 2010	(r216734)
@@ -9908,6 +9908,7 @@ get_note_type (unsigned e_type)
     case NT_PSTATUS:	return _("NT_PSTATUS (pstatus structure)");
     case NT_FPREGS:	return _("NT_FPREGS (floating point registers)");
     case NT_PSINFO:	return _("NT_PSINFO (psinfo structure)");
+    case NT_THRMISC:	return _("NT_THRMISC (thrmisc structure)");
     case NT_LWPSTATUS:	return _("NT_LWPSTATUS (lwpstatus_t structure)");
     case NT_LWPSINFO:	return _("NT_LWPSINFO (lwpsinfo_t structure)");
     case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus structure)");

Modified: stable/8/contrib/binutils/include/elf/common.h
==============================================================================
--- stable/8/contrib/binutils/include/elf/common.h	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/contrib/binutils/include/elf/common.h	Mon Dec 27 12:39:24 2010	(r216734)
@@ -366,6 +366,7 @@
 #define NT_PRPSINFO	3		/* Contains copy of prpsinfo struct */
 #define NT_TASKSTRUCT	4		/* Contains copy of task struct */
 #define NT_AUXV		6		/* Contains copy of Elfxx_auxv_t */
+#define NT_THRMISC	7		/* Contains copy of thrmisc struct */
 #define NT_PRXFPREG	0x46e62b7f	/* Contains a user_xfpregs_struct; */
 					/*   note name must be "LINUX".  */
 

Modified: stable/8/contrib/file/readelf.h
==============================================================================
--- stable/8/contrib/file/readelf.h	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/contrib/file/readelf.h	Mon Dec 27 12:39:24 2010	(r216734)
@@ -224,6 +224,7 @@ typedef struct {
 #define NT_TASKSTRUCT	4
 #define	NT_PLATFORM	5
 #define	NT_AUXV		6
+#define	NT_THRMISC	7
 
 /* Note types used in executables */
 /* NetBSD executables (name = "NetBSD") */

Modified: stable/8/contrib/gdb/gdb/fbsd-proc.c
==============================================================================
--- stable/8/contrib/gdb/gdb/fbsd-proc.c	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/contrib/gdb/gdb/fbsd-proc.c	Mon Dec 27 12:39:24 2010	(r216734)
@@ -124,6 +124,7 @@ fbsd_make_corefile_notes (bfd *obfd, int
   fpregset_t fpregs;
   char *note_data = NULL;
   Elf_Internal_Ehdr *i_ehdrp;
+  char fakename;
 
   /* Put a "FreeBSD" label in the ELF header.  */
   i_ehdrp = elf_elfheader (obfd);
@@ -138,6 +139,10 @@ fbsd_make_corefile_notes (bfd *obfd, int
   note_data = elfcore_write_prfpreg (obfd, note_data, note_size,
 				     &fpregs, sizeof (fpregs));
 
+  fakename = '\0';
+  note_data = elfcore_write_thrmisc (obfd, note_data, note_size,
+				     &fakename, sizeof (fakename));
+
   if (get_exec_file (0))
     {
       char *fname = strrchr (get_exec_file (0), '/') + 1;

Modified: stable/8/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
==============================================================================
--- stable/8/gnu/usr.bin/gdb/libgdb/fbsd-threads.c	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/gnu/usr.bin/gdb/libgdb/fbsd-threads.c	Mon Dec 27 12:39:24 2010	(r216734)
@@ -426,6 +426,46 @@ fbsd_thread_deactivate (void)
   init_thread_list ();
 }
 
+static char * 
+fbsd_thread_get_name (lwpid_t lwpid)
+{
+  static char last_thr_name[MAXCOMLEN + 1];
+  char section_name[32];
+  struct ptrace_lwpinfo lwpinfo;
+  bfd_size_type size;
+  struct bfd_section *section;
+
+  if (target_has_execution)
+    {
+      if (ptrace (PT_LWPINFO, lwpid, (caddr_t)&lwpinfo, sizeof (lwpinfo)) == -1)
+        goto fail;
+      strncpy (last_thr_name, lwpinfo.pl_tdname, sizeof (last_thr_name) - 1);
+    }
+  else
+    {
+      snprintf (section_name, sizeof (section_name), ".tname/%u", lwpid);
+      section = bfd_get_section_by_name (core_bfd, section_name);
+      if (! section)
+        goto fail;
+
+      /* Section size fix-up. */
+      size = bfd_section_size (core_bfd, section);
+      if (size > sizeof (last_thr_name))
+        size = sizeof (last_thr_name);
+
+      if (! bfd_get_section_contents (core_bfd, section, last_thr_name,
+	       (file_ptr)0, size))
+        goto fail;
+      if (last_thr_name[0] == '\0')
+        goto fail;
+    }
+    last_thr_name[sizeof (last_thr_name) - 1] = '\0';
+    return last_thr_name;
+fail:
+     strcpy (last_thr_name, "<unknown>");
+     return last_thr_name;
+}
+
 static void
 fbsd_thread_new_objfile (struct objfile *objfile)
 {
@@ -1158,7 +1198,7 @@ fbsd_thread_find_new_threads (void)
 static char *
 fbsd_thread_pid_to_str (ptid_t ptid)
 {
-  static char buf[64];
+  static char buf[64 + MAXCOMLEN];
 
   if (IS_THREAD (ptid))
     {
@@ -1178,8 +1218,9 @@ fbsd_thread_pid_to_str (ptid_t ptid)
 
       if (ti.ti_lid != 0)
         {
-          snprintf (buf, sizeof (buf), "Thread %llx (LWP %d)",
-                    (unsigned long long)th.th_thread, ti.ti_lid);
+          snprintf (buf, sizeof (buf), "Thread %llx (LWP %d/%s)",
+                    (unsigned long long)th.th_thread, ti.ti_lid,
+                    fbsd_thread_get_name (ti.ti_lid));
         }
       else
         {

Modified: stable/8/sys/compat/freebsd32/freebsd32.h
==============================================================================
--- stable/8/sys/compat/freebsd32/freebsd32.h	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/sys/compat/freebsd32/freebsd32.h	Mon Dec 27 12:39:24 2010	(r216734)
@@ -240,6 +240,11 @@ struct prpsinfo32 {
         char    pr_psargs[PRARGSZ+1];
 };
 
+struct thrmisc32 {
+        char    pr_tname[MAXCOMLEN+1];
+        u_int   _pad;
+};
+
 struct mq_attr32 {
 	int	mq_flags;
 	int	mq_maxmsg;

Modified: stable/8/sys/kern/imgact_elf.c
==============================================================================
--- stable/8/sys/kern/imgact_elf.c	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/sys/kern/imgact_elf.c	Mon Dec 27 12:39:24 2010	(r216734)
@@ -1213,12 +1213,14 @@ typedef struct prpsinfo32 elf_prpsinfo_t
 typedef struct fpreg32 elf_prfpregset_t;
 typedef struct fpreg32 elf_fpregset_t;
 typedef struct reg32 elf_gregset_t;
+typedef struct thrmisc32 elf_thrmisc_t;
 #else
 typedef prstatus_t elf_prstatus_t;
 typedef prpsinfo_t elf_prpsinfo_t;
 typedef prfpregset_t elf_prfpregset_t;
 typedef prfpregset_t elf_fpregset_t;
 typedef gregset_t elf_gregset_t;
+typedef thrmisc_t elf_thrmisc_t;
 #endif
 
 static void
@@ -1228,10 +1230,12 @@ __elfN(puthdr)(struct thread *td, void *
 		elf_prstatus_t status;
 		elf_prfpregset_t fpregset;
 		elf_prpsinfo_t psinfo;
+		elf_thrmisc_t thrmisc;
 	} *tempdata;
 	elf_prstatus_t *status;
 	elf_prfpregset_t *fpregset;
 	elf_prpsinfo_t *psinfo;
+	elf_thrmisc_t *thrmisc;
 	struct proc *p;
 	struct thread *thr;
 	size_t ehoff, noteoff, notesz, phoff;
@@ -1254,11 +1258,13 @@ __elfN(puthdr)(struct thread *td, void *
 		status = &tempdata->status;
 		fpregset = &tempdata->fpregset;
 		psinfo = &tempdata->psinfo;
+		thrmisc = &tempdata->thrmisc;
 	} else {
 		tempdata = NULL;
 		status = NULL;
 		fpregset = NULL;
 		psinfo = NULL;
+		thrmisc = NULL;
 	}
 
 	if (dst != NULL) {
@@ -1298,11 +1304,15 @@ __elfN(puthdr)(struct thread *td, void *
 			fill_regs(thr, &status->pr_reg);
 			fill_fpregs(thr, fpregset);
 #endif
+			memset(&thrmisc->_pad, 0, sizeof (thrmisc->_pad));
+			strcpy(thrmisc->pr_tname, thr->td_name);
 		}
 		__elfN(putnote)(dst, off, "FreeBSD", NT_PRSTATUS, status,
 		    sizeof *status);
 		__elfN(putnote)(dst, off, "FreeBSD", NT_FPREGSET, fpregset,
 		    sizeof *fpregset);
+		__elfN(putnote)(dst, off, "FreeBSD", NT_THRMISC, thrmisc,
+		    sizeof *thrmisc);
 		/*
 		 * Allow for MD specific notes, as well as any MD
 		 * specific preparations for writing MI notes.

Modified: stable/8/sys/kern/sys_process.c
==============================================================================
--- stable/8/sys/kern/sys_process.c	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/sys/kern/sys_process.c	Mon Dec 27 12:39:24 2010	(r216734)
@@ -92,6 +92,7 @@ struct ptrace_lwpinfo32 {
 	sigset_t	pl_sigmask;	/* LWP signal mask */
 	sigset_t	pl_siglist;	/* LWP pending signal */
 	struct siginfo32 pl_siginfo;	/* siginfo for signal */
+	char	pl_tdname[MAXCOMLEN + 1];	/* LWP name. */
 };
 
 #endif
@@ -517,6 +518,7 @@ ptrace_lwpinfo_to32(const struct ptrace_
 	pl32->pl_sigmask = pl->pl_sigmask;
 	pl32->pl_siglist = pl->pl_siglist;
 	siginfo_to_siginfo32(&pl->pl_siginfo, &pl32->pl_siginfo);
+	strcpy(pl32->pl_tdname, pl->pl_tdname);
 }
 #endif /* COMPAT_FREEBSD32 */
 
@@ -1172,6 +1174,7 @@ kern_ptrace(struct thread *td, int req, 
 			pl->pl_flags |= PL_FLAG_EXEC;
 		pl->pl_sigmask = td2->td_sigmask;
 		pl->pl_siglist = td2->td_siglist;
+		strcpy(pl->pl_tdname, td2->td_name);
 #ifdef COMPAT_FREEBSD32
 		if (wrap32)
 			ptrace_lwpinfo_to32(pl, pl32);

Modified: stable/8/sys/sys/elf_common.h
==============================================================================
--- stable/8/sys/sys/elf_common.h	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/sys/sys/elf_common.h	Mon Dec 27 12:39:24 2010	(r216734)
@@ -480,6 +480,7 @@ typedef struct {
 #define	NT_PRSTATUS	1	/* Process status. */
 #define	NT_FPREGSET	2	/* Floating point registers. */
 #define	NT_PRPSINFO	3	/* Process state info. */
+#define	NT_THRMISC	7	/* Thread miscellaneous info. */
 
 /* Symbol Binding - ELFNN_ST_BIND - st_info */
 #define	STB_LOCAL	0	/* Local symbol */

Modified: stable/8/sys/sys/procfs.h
==============================================================================
--- stable/8/sys/sys/procfs.h	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/sys/sys/procfs.h	Mon Dec 27 12:39:24 2010	(r216734)
@@ -80,6 +80,13 @@ typedef struct prpsinfo {
     char	pr_psargs[PRARGSZ+1];	/* Arguments, null terminated (1) */
 } prpsinfo_t;
 
+#define THRMISC_VERSION		1	/* Current version of thrmisc_t */
+
+typedef struct thrmisc {
+    char	pr_tname[MAXCOMLEN+1];	/* Thread name, null terminated (1) */
+    u_int	_pad;			/* Convenience pad, 0-filled (1) */
+} thrmisc_t;
+
 typedef uint64_t psaddr_t;	/* An address in the target process. */
 
 #endif /* _SYS_PROCFS_H_ */

Modified: stable/8/sys/sys/ptrace.h
==============================================================================
--- stable/8/sys/sys/ptrace.h	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/sys/sys/ptrace.h	Mon Dec 27 12:39:24 2010	(r216734)
@@ -34,6 +34,7 @@
 #define	_SYS_PTRACE_H_
 
 #include <sys/signal.h>
+#include <sys/param.h>
 #include <machine/reg.h>
 
 #define	PT_TRACE_ME	0	/* child declares it's being traced */
@@ -106,6 +107,7 @@ struct ptrace_lwpinfo {
 	sigset_t	pl_sigmask;	/* LWP signal mask */
 	sigset_t	pl_siglist;	/* LWP pending signal */
 	struct __siginfo pl_siginfo;	/* siginfo for signal */
+	char		pl_tdname[MAXCOMLEN + 1]; /* LWP name */
 };
 
 /* Argument structure for PT_VM_ENTRY. */

Modified: stable/8/usr.bin/gcore/elfcore.c
==============================================================================
--- stable/8/usr.bin/gcore/elfcore.c	Mon Dec 27 12:06:38 2010	(r216733)
+++ stable/8/usr.bin/gcore/elfcore.c	Mon Dec 27 12:39:24 2010	(r216734)
@@ -284,10 +284,12 @@ elf_getstatus(pid_t pid, prpsinfo_t *psi
 static void
 elf_puthdr(pid_t pid, vm_map_entry_t map, void *dst, size_t *off, int numsegs)
 {
+	struct ptrace_lwpinfo lwpinfo;
 	struct {
 		prstatus_t status;
 		prfpregset_t fpregset;
 		prpsinfo_t psinfo;
+		thrmisc_t thrmisc;
 	} *tempdata;
 	size_t ehoff;
 	size_t phoff;
@@ -300,6 +302,7 @@ elf_puthdr(pid_t pid, vm_map_entry_t map
 	prstatus_t *status;
 	prfpregset_t *fpregset;
 	prpsinfo_t *psinfo;
+	thrmisc_t *thrmisc;
 
 	ehoff = *off;
 	*off += sizeof(Elf_Ehdr);
@@ -315,11 +318,13 @@ elf_puthdr(pid_t pid, vm_map_entry_t map
 		status = &tempdata->status;
 		fpregset = &tempdata->fpregset;
 		psinfo = &tempdata->psinfo;
+		thrmisc = &tempdata->thrmisc;
 	} else {
 		tempdata = NULL;
 		status = NULL;
 		fpregset = NULL;
 		psinfo = NULL;
+		thrmisc = NULL;
 	}
 
 	errno = 0;
@@ -356,11 +361,17 @@ elf_puthdr(pid_t pid, vm_map_entry_t map
 
 			ptrace(PT_GETREGS, tids[i], (void *)&status->pr_reg, 0);
 			ptrace(PT_GETFPREGS, tids[i], (void *)fpregset, 0);
+			ptrace(PT_LWPINFO, tids[i], (void *)&lwpinfo,
+			    sizeof(lwpinfo));
+			memset(&thrmisc->_pad, 0, sizeof(thrmisc->_pad));
+			strcpy(thrmisc->pr_tname, lwpinfo.pl_tdname);
 		}
 		elf_putnote(dst, off, "FreeBSD", NT_PRSTATUS, status,
 		    sizeof *status);
 		elf_putnote(dst, off, "FreeBSD", NT_FPREGSET, fpregset,
 		    sizeof *fpregset);
+		elf_putnote(dst, off, "FreeBSD", NT_THRMISC, thrmisc,
+		    sizeof *thrmisc);
 	}
 
 	notesz = *off - noteoff;


More information about the svn-src-stable mailing list