From 65554feff896c16ec797d63442e63f0bbe433685 Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Wed, 13 Feb 2002 22:03:46 +0000 Subject: [PATCH] 2002-02-13 Michael Snyder * procfs.c (procfs_make_note_section): Make the default implementation return an error. 2002-02-13 Rodney Brown * procfs.c (procfs_make_note_section): Provide a default definition (for alpha-dec-osf4.0f). Fix typos. 2002-02-11 Michael Snyder * procfs.c: Include elf-bfd.h (for elfcore_write functions). (gcore section): Ifdef for Solaris and Unixware only. (procfs_do_thread_registers): Unixware needs one lwpstatus per thread (not one prstatus or pstatus). (procfs_make_note_section): Iterate only over kernel threads (lwps), not over all gdb threads. For unixware, call elfcore_write_pstatus once before iterating over threads. --- gdb/ChangeLog | 25 +++++++++++++++++++++++-- gdb/procfs.c | 50 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7973f67cdb..778714149e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2002-02-13 Michael Snyder + + * procfs.c (procfs_make_note_section): Make the default + implementation return an error. + +2002-02-13 Rodney Brown + + * procfs.c (procfs_make_note_section): Provide a default definition + (for alpha-dec-osf4.0f). Fix typos. + 2002-02-13 Elena Zannoni * linux-proc.c: Add include of regcache.h. @@ -6,8 +16,9 @@ 2002-02-13 Andrew Cagney From 2002-01-18 Greg McGary : - * memattr.c (create_mem_region): Disallow useless empty region. Regions - are half-open intervals, so allow [A..B) [B..C) as non-overlapping. + * memattr.c (create_mem_region): Disallow useless empty region. + Regions are half-open intervals, so allow [A..B) [B..C) as + non-overlapping. 2002-02-13 Michael Chastain @@ -57,6 +68,16 @@ * arm-linux-nat.c: Really include arm-tdep.h. * config/arm/tm-linux.h (struct type, struct value): Declare. +2002-02-11 Michael Snyder + + * procfs.c: Include elf-bfd.h (for elfcore_write functions). + (gcore section): Ifdef for Solaris and Unixware only. + (procfs_do_thread_registers): Unixware needs one lwpstatus + per thread (not one prstatus or pstatus). + (procfs_make_note_section): Iterate only over kernel threads (lwps), + not over all gdb threads. For unixware, call elfcore_write_pstatus + once before iterating over threads. + 2002-02-11 Richard Earnshaw * arm-tdep.h: New file. diff --git a/gdb/procfs.c b/gdb/procfs.c index 1714970e96..aec61bcc86 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -23,6 +23,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "inferior.h" #include "target.h" #include "gdbcore.h" +#include "elf-bfd.h" /* for elfcore_write_* */ #include "gdbcmd.h" #include "gdbthread.h" @@ -55,7 +56,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ * Unixware * AIX5 * - * /proc works by immitating a file system: you open a simulated file + * /proc works by imitating a file system: you open a simulated file * that represents the process you wish to interact with, and * perform operations on that "file" in order to examine or change * the state of the other process. @@ -5704,7 +5705,7 @@ Specify keyword 'mappings' for detailed info on memory mappings."); -/* miscelaneous stubs: */ +/* miscellaneous stubs: */ /* The following satisfy a few random symbols mostly created by */ /* the solaris threads implementation, which I will chase down */ /* later. */ @@ -5721,6 +5722,8 @@ procfs_first_available (void) } /* =================== GCORE .NOTE "MODULE" =================== */ +#if defined (UNIXWARE) || defined (PIOCOPENLWP) || defined (PCAGENT) +/* gcore only implemented on solaris and unixware (so far) */ static char * procfs_do_thread_registers (bfd *obfd, ptid_t ptid, @@ -5733,12 +5736,21 @@ procfs_do_thread_registers (bfd *obfd, ptid_t ptid, merged_pid = TIDGET (ptid) << 16 | PIDGET (ptid); fill_gregset (&gregs, -1); +#if defined (UNIXWARE) + note_data = (char *) elfcore_write_lwpstatus (obfd, + note_data, + note_size, + merged_pid, + stop_signal, + &gregs); +#else note_data = (char *) elfcore_write_prstatus (obfd, - note_data, - note_size, + note_data, + note_size, merged_pid, stop_signal, - &gregs); + &gregs); +#endif fill_fpregset (&fpregs, -1); note_data = (char *) elfcore_write_prfpreg (obfd, note_data, @@ -5755,16 +5767,15 @@ struct procfs_corefile_thread_data { }; static int -procfs_corefile_thread_callback (struct thread_info *ti, void *data) +procfs_corefile_thread_callback (procinfo *pi, procinfo *thread, void *data) { struct procfs_corefile_thread_data *args = data; - procinfo *pi = find_procinfo (PIDGET (ti->ptid), TIDGET (ti->ptid)); - if (pi != NULL && TIDGET (ti->ptid) != 0) + if (pi != NULL && thread->tid != 0) { ptid_t saved_ptid = inferior_ptid; - inferior_ptid = ti->ptid; - args->note_data = procfs_do_thread_registers (args->obfd, ti->ptid, + inferior_ptid = MERGEPID (pi->pid, thread->tid); + args->note_data = procfs_do_thread_registers (args->obfd, inferior_ptid, args->note_data, args->note_size); inferior_ptid = saved_ptid; @@ -5804,10 +5815,18 @@ procfs_make_note_section (bfd *obfd, int *note_size) fname, psargs); +#ifdef UNIXWARE + fill_gregset (&gregs, -1); + note_data = elfcore_write_pstatus (obfd, note_data, note_size, + PIDGET (inferior_ptid), + stop_signal, &gregs); +#endif + thread_args.obfd = obfd; thread_args.note_data = note_data; thread_args.note_size = note_size; - iterate_over_threads (procfs_corefile_thread_callback, &thread_args); + proc_iterate_over_threads (pi, procfs_corefile_thread_callback, &thread_args); + if (thread_args.note_data == note_data) { /* iterate_over_threads didn't come up with any threads; @@ -5823,5 +5842,12 @@ procfs_make_note_section (bfd *obfd, int *note_size) make_cleanup (xfree, note_data); return note_data; } - +#else /* !(Solaris or Unixware) */ +static char * +procfs_make_note_section (bfd *obfd, int *note_size) +{ + error ("gcore not implemented for this host."); + return NULL; /* lint */ +} +#endif /* Solaris or Unixware */ /* =================== END GCORE .NOTE "MODULE" =================== */