aboutsummaryrefslogtreecommitdiff
path: root/gdb/procfs.c
diff options
context:
space:
mode:
authorMichael Snyder <msnyder@vmware.com>2002-02-13 22:03:46 +0000
committerMichael Snyder <msnyder@vmware.com>2002-02-13 22:03:46 +0000
commit65554feff896c16ec797d63442e63f0bbe433685 (patch)
tree59866be515d664437a3cbd9e478ca32d235474ad /gdb/procfs.c
parent51316059ccf20325064353ec76fe94d2403393c1 (diff)
downloadgdb-65554feff896c16ec797d63442e63f0bbe433685.zip
gdb-65554feff896c16ec797d63442e63f0bbe433685.tar.gz
gdb-65554feff896c16ec797d63442e63f0bbe433685.tar.bz2
2002-02-13 Michael Snyder <msnyder@redhat.com>
* procfs.c (procfs_make_note_section): Make the default implementation return an error. 2002-02-13 Rodney Brown <rbrown64@csc.com.au> * procfs.c (procfs_make_note_section): Provide a default definition (for alpha-dec-osf4.0f). Fix typos. 2002-02-11 Michael Snyder <msnyder@redhat.com> * 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.
Diffstat (limited to 'gdb/procfs.c')
-rw-r--r--gdb/procfs.c50
1 files changed, 38 insertions, 12 deletions
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 1714970..aec61bc 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" =================== */