1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
3 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 Written by Michael Snyder at Cygnus Solutions.
7 Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
9 This file is part of GDB.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
28 #include "elf-bfd.h" /* for elfcore_write_* */
30 #include "gdbthread.h"
32 #include "inf-child.h"
34 #if defined (NEW_PROC_API)
35 #define _STRUCTURED_PROC 1 /* Should be done by configure script. */
38 #include <sys/procfs.h>
39 #ifdef HAVE_SYS_FAULT_H
40 #include <sys/fault.h>
42 #ifdef HAVE_SYS_SYSCALL_H
43 #include <sys/syscall.h>
45 #include <sys/errno.h>
49 #include "gdb_string.h"
50 #include "gdb_assert.h"
58 * This module provides the interface between GDB and the
59 * /proc file system, which is used on many versions of Unix
60 * as a means for debuggers to control other processes.
61 * Examples of the systems that use this interface are:
68 * /proc works by imitating a file system: you open a simulated file
69 * that represents the process you wish to interact with, and
70 * perform operations on that "file" in order to examine or change
71 * the state of the other process.
73 * The most important thing to know about /proc and this module
74 * is that there are two very different interfaces to /proc:
75 * One that uses the ioctl system call, and
76 * another that uses read and write system calls.
77 * This module has to support both /proc interfaces. This means
78 * that there are two different ways of doing every basic operation.
80 * In order to keep most of the code simple and clean, I have
81 * defined an interface "layer" which hides all these system calls.
82 * An ifdef (NEW_PROC_API) determines which interface we are using,
83 * and most or all occurrances of this ifdef should be confined to
84 * this interface layer.
88 /* Determine which /proc API we are using:
89 The ioctl API defines PIOCSTATUS, while
90 the read/write (multiple fd) API never does. */
93 #include <sys/types.h>
94 #include "gdb_dirent.h" /* opendir/readdir, for listing the LWP's */
97 #include <fcntl.h> /* for O_RDONLY */
98 #include <unistd.h> /* for "X_OK" */
99 #include "gdb_stat.h" /* for struct stat */
101 /* Note: procfs-utils.h must be included after the above system header
102 files, because it redefines various system calls using macros.
103 This may be incompatible with the prototype declarations. */
105 #include "proc-utils.h"
107 /* Prototypes for supply_gregset etc. */
110 /* =================== TARGET_OPS "MODULE" =================== */
113 * This module defines the GDB target vector and its methods.
116 static void procfs_attach (struct target_ops *, char *, int);
117 static void procfs_detach (struct target_ops *, char *, int);
118 static void procfs_resume (struct target_ops *,
119 ptid_t, int, enum target_signal);
120 static void procfs_stop (ptid_t);
121 static void procfs_files_info (struct target_ops *);
122 static void procfs_fetch_registers (struct target_ops *,
123 struct regcache *, int);
124 static void procfs_store_registers (struct target_ops *,
125 struct regcache *, int);
126 static void procfs_notice_signals (ptid_t);
127 static void procfs_kill_inferior (struct target_ops *ops);
128 static void procfs_mourn_inferior (struct target_ops *ops);
129 static void procfs_create_inferior (struct target_ops *, char *,
130 char *, char **, int);
131 static ptid_t procfs_wait (struct target_ops *,
132 ptid_t, struct target_waitstatus *, int);
133 static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
134 struct mem_attrib *attrib,
135 struct target_ops *);
136 static LONGEST procfs_xfer_partial (struct target_ops *ops,
137 enum target_object object,
139 gdb_byte *readbuf, const gdb_byte *writebuf,
140 ULONGEST offset, LONGEST len);
142 static int procfs_thread_alive (struct target_ops *ops, ptid_t);
144 void procfs_find_new_threads (struct target_ops *ops);
145 char *procfs_pid_to_str (struct target_ops *, ptid_t);
147 static int proc_find_memory_regions (int (*) (CORE_ADDR,
153 static char * procfs_make_note_section (bfd *, int *);
155 static int procfs_can_use_hw_breakpoint (int, int, int);
157 #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
158 /* When GDB is built as 64-bit application on Solaris, the auxv data is
159 presented in 64-bit format. We need to provide a custom parser to handle
162 procfs_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
163 gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
165 gdb_byte *ptr = *readptr;
170 if (endptr - ptr < 8 * 2)
173 *typep = extract_unsigned_integer (ptr, 4);
175 /* The size of data is always 64-bit. If the application is 32-bit,
176 it will be zero extended, as expected. */
177 *valp = extract_unsigned_integer (ptr, 8);
188 struct target_ops *t = inf_child_target ();
190 t->to_shortname = "procfs";
191 t->to_longname = "Unix /proc child process";
193 "Unix /proc child process (started by the \"run\" command).";
194 t->to_create_inferior = procfs_create_inferior;
195 t->to_kill = procfs_kill_inferior;
196 t->to_mourn_inferior = procfs_mourn_inferior;
197 t->to_attach = procfs_attach;
198 t->to_detach = procfs_detach;
199 t->to_wait = procfs_wait;
200 t->to_resume = procfs_resume;
201 t->to_fetch_registers = procfs_fetch_registers;
202 t->to_store_registers = procfs_store_registers;
203 t->to_xfer_partial = procfs_xfer_partial;
204 t->deprecated_xfer_memory = procfs_xfer_memory;
205 t->to_notice_signals = procfs_notice_signals;
206 t->to_files_info = procfs_files_info;
207 t->to_stop = procfs_stop;
209 t->to_find_new_threads = procfs_find_new_threads;
210 t->to_thread_alive = procfs_thread_alive;
211 t->to_pid_to_str = procfs_pid_to_str;
213 t->to_has_thread_control = tc_schedlock;
214 t->to_find_memory_regions = proc_find_memory_regions;
215 t->to_make_corefile_notes = procfs_make_note_section;
217 #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
218 t->to_auxv_parse = procfs_auxv_parse;
221 t->to_magic = OPS_MAGIC;
226 /* =================== END, TARGET_OPS "MODULE" =================== */
231 * Put any typedefs, defines etc. here that are required for
232 * the unification of code that handles different versions of /proc.
235 #ifdef NEW_PROC_API /* Solaris 7 && 8 method for watchpoints */
237 enum { READ_WATCHFLAG = WA_READ,
238 WRITE_WATCHFLAG = WA_WRITE,
239 EXEC_WATCHFLAG = WA_EXEC,
240 AFTER_WATCHFLAG = WA_TRAPAFTER
243 #else /* Irix method for watchpoints */
244 enum { READ_WATCHFLAG = MA_READ,
245 WRITE_WATCHFLAG = MA_WRITE,
246 EXEC_WATCHFLAG = MA_EXEC,
247 AFTER_WATCHFLAG = 0 /* trapafter not implemented */
252 #ifdef HAVE_PR_SIGSET_T
253 typedef pr_sigset_t gdb_sigset_t;
255 typedef sigset_t gdb_sigset_t;
259 #ifdef HAVE_PR_SIGACTION64_T
260 typedef pr_sigaction64_t gdb_sigaction_t;
262 typedef struct sigaction gdb_sigaction_t;
266 #ifdef HAVE_PR_SIGINFO64_T
267 typedef pr_siginfo64_t gdb_siginfo_t;
269 typedef struct siginfo gdb_siginfo_t;
272 /* gdb_premptysysset */
274 #define gdb_premptysysset premptysysset
276 #define gdb_premptysysset premptyset
281 #define gdb_praddsysset praddsysset
283 #define gdb_praddsysset praddset
288 #define gdb_prdelsysset prdelsysset
290 #define gdb_prdelsysset prdelset
293 /* prissyssetmember */
294 #ifdef prissyssetmember
295 #define gdb_pr_issyssetmember prissyssetmember
297 #define gdb_pr_issyssetmember prismember
300 /* As a feature test, saying ``#if HAVE_PRSYSENT_T'' everywhere isn't
301 as intuitively descriptive as it could be, so we'll define
302 DYNAMIC_SYSCALLS to mean the same thing. Anyway, at the time of
303 this writing, this feature is only found on AIX5 systems and
304 basically means that the set of syscalls is not fixed. I.e,
305 there's no nice table that one can #include to get all of the
306 syscall numbers. Instead, they're stored in /proc/PID/sysent
307 for each process. We are at least guaranteed that they won't
308 change over the lifetime of the process. But each process could
309 (in theory) have different syscall numbers.
311 #ifdef HAVE_PRSYSENT_T
312 #define DYNAMIC_SYSCALLS
317 /* =================== STRUCT PROCINFO "MODULE" =================== */
319 /* FIXME: this comment will soon be out of date W.R.T. threads. */
321 /* The procinfo struct is a wrapper to hold all the state information
322 concerning a /proc process. There should be exactly one procinfo
323 for each process, and since GDB currently can debug only one
324 process at a time, that means there should be only one procinfo.
325 All of the LWP's of a process can be accessed indirectly thru the
326 single process procinfo.
328 However, against the day when GDB may debug more than one process,
329 this data structure is kept in a list (which for now will hold no
330 more than one member), and many functions will have a pointer to a
331 procinfo as an argument.
333 There will be a separate procinfo structure for use by the (not yet
334 implemented) "info proc" command, so that we can print useful
335 information about any random process without interfering with the
336 inferior's procinfo information. */
339 /* format strings for /proc paths */
340 # ifndef CTL_PROC_NAME_FMT
341 # define MAIN_PROC_NAME_FMT "/proc/%d"
342 # define CTL_PROC_NAME_FMT "/proc/%d/ctl"
343 # define AS_PROC_NAME_FMT "/proc/%d/as"
344 # define MAP_PROC_NAME_FMT "/proc/%d/map"
345 # define STATUS_PROC_NAME_FMT "/proc/%d/status"
346 # define MAX_PROC_NAME_SIZE sizeof("/proc/99999/lwp/8096/lstatus")
348 /* the name of the proc status struct depends on the implementation */
349 typedef pstatus_t gdb_prstatus_t;
350 typedef lwpstatus_t gdb_lwpstatus_t;
351 #else /* ! NEW_PROC_API */
352 /* format strings for /proc paths */
353 # ifndef CTL_PROC_NAME_FMT
354 # define MAIN_PROC_NAME_FMT "/proc/%05d"
355 # define CTL_PROC_NAME_FMT "/proc/%05d"
356 # define AS_PROC_NAME_FMT "/proc/%05d"
357 # define MAP_PROC_NAME_FMT "/proc/%05d"
358 # define STATUS_PROC_NAME_FMT "/proc/%05d"
359 # define MAX_PROC_NAME_SIZE sizeof("/proc/ttttppppp")
361 /* the name of the proc status struct depends on the implementation */
362 typedef prstatus_t gdb_prstatus_t;
363 typedef prstatus_t gdb_lwpstatus_t;
364 #endif /* NEW_PROC_API */
366 typedef struct procinfo {
367 struct procinfo *next;
368 int pid; /* Process ID */
369 int tid; /* Thread/LWP id */
373 int ignore_next_sigstop;
375 /* The following four fd fields may be identical, or may contain
376 several different fd's, depending on the version of /proc
377 (old ioctl or new read/write). */
379 int ctl_fd; /* File descriptor for /proc control file */
381 * The next three file descriptors are actually only needed in the
382 * read/write, multiple-file-descriptor implemenation (NEW_PROC_API).
383 * However, to avoid a bunch of #ifdefs in the code, we will use
384 * them uniformly by (in the case of the ioctl single-file-descriptor
385 * implementation) filling them with copies of the control fd.
387 int status_fd; /* File descriptor for /proc status file */
388 int as_fd; /* File descriptor for /proc as file */
390 char pathname[MAX_PROC_NAME_SIZE]; /* Pathname to /proc entry */
392 fltset_t saved_fltset; /* Saved traced hardware fault set */
393 gdb_sigset_t saved_sigset; /* Saved traced signal set */
394 gdb_sigset_t saved_sighold; /* Saved held signal set */
395 sysset_t *saved_exitset; /* Saved traced system call exit set */
396 sysset_t *saved_entryset; /* Saved traced system call entry set */
398 gdb_prstatus_t prstatus; /* Current process status info */
401 gdb_fpregset_t fpregset; /* Current floating point registers */
404 #ifdef DYNAMIC_SYSCALLS
405 int num_syscalls; /* Total number of syscalls */
406 char **syscall_names; /* Syscall number to name map */
409 struct procinfo *thread_list;
411 int status_valid : 1;
413 int fpregs_valid : 1;
414 int threads_valid: 1;
417 static char errmsg[128]; /* shared error msg buffer */
419 /* Function prototypes for procinfo module: */
421 static procinfo *find_procinfo_or_die (int pid, int tid);
422 static procinfo *find_procinfo (int pid, int tid);
423 static procinfo *create_procinfo (int pid, int tid);
424 static void destroy_procinfo (procinfo * p);
425 static void do_destroy_procinfo_cleanup (void *);
426 static void dead_procinfo (procinfo * p, char *msg, int killp);
427 static int open_procinfo_files (procinfo * p, int which);
428 static void close_procinfo_files (procinfo * p);
429 static int sysset_t_size (procinfo *p);
430 static sysset_t *sysset_t_alloc (procinfo * pi);
431 #ifdef DYNAMIC_SYSCALLS
432 static void load_syscalls (procinfo *pi);
433 static void free_syscalls (procinfo *pi);
434 static int find_syscall (procinfo *pi, char *name);
435 #endif /* DYNAMIC_SYSCALLS */
437 /* The head of the procinfo list: */
438 static procinfo * procinfo_list;
441 * Function: find_procinfo
443 * Search the procinfo list.
445 * Returns: pointer to procinfo, or NULL if not found.
449 find_procinfo (int pid, int tid)
453 for (pi = procinfo_list; pi; pi = pi->next)
460 /* Don't check threads_valid. If we're updating the
461 thread_list, we want to find whatever threads are already
462 here. This means that in general it is the caller's
463 responsibility to check threads_valid and update before
464 calling find_procinfo, if the caller wants to find a new
467 for (pi = pi->thread_list; pi; pi = pi->next)
476 * Function: find_procinfo_or_die
478 * Calls find_procinfo, but errors on failure.
482 find_procinfo_or_die (int pid, int tid)
484 procinfo *pi = find_procinfo (pid, tid);
489 error (_("procfs: couldn't find pid %d (kernel thread %d) in procinfo list."),
492 error (_("procfs: couldn't find pid %d in procinfo list."), pid);
497 /* open_with_retry() is a wrapper for open(). The appropriate
498 open() call is attempted; if unsuccessful, it will be retried as
499 many times as needed for the EAGAIN and EINTR conditions.
501 For other conditions, open_with_retry() will retry the open() a
502 limited number of times. In addition, a short sleep is imposed
503 prior to retrying the open(). The reason for this sleep is to give
504 the kernel a chance to catch up and create the file in question in
505 the event that GDB "wins" the race to open a file before the kernel
509 open_with_retry (const char *pathname, int flags)
511 int retries_remaining, status;
513 retries_remaining = 2;
517 status = open (pathname, flags);
519 if (status >= 0 || retries_remaining == 0)
521 else if (errno != EINTR && errno != EAGAIN)
532 * Function: open_procinfo_files
534 * Open the file descriptor for the process or LWP.
535 * ifdef NEW_PROC_API, we only open the control file descriptor;
536 * the others are opened lazily as needed.
537 * else (if not NEW_PROC_API), there is only one real
538 * file descriptor, but we keep multiple copies of it so that
539 * the code that uses them does not have to be #ifdef'd.
541 * Return: file descriptor, or zero for failure.
544 enum { FD_CTL, FD_STATUS, FD_AS };
547 open_procinfo_files (procinfo *pi, int which)
550 char tmp[MAX_PROC_NAME_SIZE];
555 * This function is getting ALMOST long enough to break up into several.
556 * Here is some rationale:
558 * NEW_PROC_API (Solaris 2.6, Solaris 2.7, Unixware):
559 * There are several file descriptors that may need to be open
560 * for any given process or LWP. The ones we're intereted in are:
561 * - control (ctl) write-only change the state
562 * - status (status) read-only query the state
563 * - address space (as) read/write access memory
564 * - map (map) read-only virtual addr map
565 * Most of these are opened lazily as they are needed.
566 * The pathnames for the 'files' for an LWP look slightly
567 * different from those of a first-class process:
568 * Pathnames for a process (<proc-id>):
569 * /proc/<proc-id>/ctl
570 * /proc/<proc-id>/status
572 * /proc/<proc-id>/map
573 * Pathnames for an LWP (lwp-id):
574 * /proc/<proc-id>/lwp/<lwp-id>/lwpctl
575 * /proc/<proc-id>/lwp/<lwp-id>/lwpstatus
576 * An LWP has no map or address space file descriptor, since
577 * the memory map and address space are shared by all LWPs.
579 * Everyone else (Solaris 2.5, Irix, OSF)
580 * There is only one file descriptor for each process or LWP.
581 * For convenience, we copy the same file descriptor into all
582 * three fields of the procinfo struct (ctl_fd, status_fd, and
583 * as_fd, see NEW_PROC_API above) so that code that uses them
584 * doesn't need any #ifdef's.
589 * Each LWP has an independent file descriptor, but these
590 * are not obtained via the 'open' system call like the rest:
591 * instead, they're obtained thru an ioctl call (PIOCOPENLWP)
592 * to the file descriptor of the parent process.
595 * These do not even have their own independent file descriptor.
596 * All operations are carried out on the file descriptor of the
597 * parent process. Therefore we just call open again for each
598 * thread, getting a new handle for the same 'file'.
603 * In this case, there are several different file descriptors that
604 * we might be asked to open. The control file descriptor will be
605 * opened early, but the others will be opened lazily as they are
609 strcpy (tmp, pi->pathname);
610 switch (which) { /* which file descriptor to open? */
613 strcat (tmp, "/lwpctl");
615 strcat (tmp, "/ctl");
616 fd = open_with_retry (tmp, O_WRONLY);
623 return 0; /* there is no 'as' file descriptor for an lwp */
625 fd = open_with_retry (tmp, O_RDWR);
632 strcat (tmp, "/lwpstatus");
634 strcat (tmp, "/status");
635 fd = open_with_retry (tmp, O_RDONLY);
641 return 0; /* unknown file descriptor */
643 #else /* not NEW_PROC_API */
645 * In this case, there is only one file descriptor for each procinfo
646 * (ie. each process or LWP). In fact, only the file descriptor for
647 * the process can actually be opened by an 'open' system call.
648 * The ones for the LWPs have to be obtained thru an IOCTL call
649 * on the process's file descriptor.
651 * For convenience, we copy each procinfo's single file descriptor
652 * into all of the fields occupied by the several file descriptors
653 * of the NEW_PROC_API implementation. That way, the code that uses
654 * them can be written without ifdefs.
658 #ifdef PIOCTSTATUS /* OSF */
659 /* Only one FD; just open it. */
660 if ((fd = open_with_retry (pi->pathname, O_RDWR)) == 0)
662 #else /* Sol 2.5, Irix, other? */
663 if (pi->tid == 0) /* Master procinfo for the process */
665 fd = open_with_retry (pi->pathname, O_RDWR);
669 else /* LWP thread procinfo */
671 #ifdef PIOCOPENLWP /* Sol 2.5, thread/LWP */
675 /* Find the procinfo for the entire process. */
676 if ((process = find_procinfo (pi->pid, 0)) == NULL)
679 /* Now obtain the file descriptor for the LWP. */
680 if ((fd = ioctl (process->ctl_fd, PIOCOPENLWP, &lwpid)) <= 0)
682 #else /* Irix, other? */
683 return 0; /* Don't know how to open threads */
684 #endif /* Sol 2.5 PIOCOPENLWP */
686 #endif /* OSF PIOCTSTATUS */
687 pi->ctl_fd = pi->as_fd = pi->status_fd = fd;
688 #endif /* NEW_PROC_API */
690 return 1; /* success */
694 * Function: create_procinfo
696 * Allocate a data structure and link it into the procinfo list.
697 * (First tries to find a pre-existing one (FIXME: why?)
699 * Return: pointer to new procinfo struct.
703 create_procinfo (int pid, int tid)
705 procinfo *pi, *parent = NULL;
707 if ((pi = find_procinfo (pid, tid)))
708 return pi; /* Already exists, nothing to do. */
710 /* find parent before doing malloc, to save having to cleanup */
712 parent = find_procinfo_or_die (pid, 0); /* FIXME: should I
714 doesn't exist yet? */
716 pi = (procinfo *) xmalloc (sizeof (procinfo));
717 memset (pi, 0, sizeof (procinfo));
721 #ifdef DYNAMIC_SYSCALLS
725 pi->saved_entryset = sysset_t_alloc (pi);
726 pi->saved_exitset = sysset_t_alloc (pi);
728 /* Chain into list. */
731 sprintf (pi->pathname, MAIN_PROC_NAME_FMT, pid);
732 pi->next = procinfo_list;
738 sprintf (pi->pathname, "/proc/%05d/lwp/%d", pid, tid);
740 sprintf (pi->pathname, MAIN_PROC_NAME_FMT, pid);
742 pi->next = parent->thread_list;
743 parent->thread_list = pi;
749 * Function: close_procinfo_files
751 * Close all file descriptors associated with the procinfo
755 close_procinfo_files (procinfo *pi)
762 if (pi->status_fd > 0)
763 close (pi->status_fd);
765 pi->ctl_fd = pi->as_fd = pi->status_fd = 0;
769 * Function: destroy_procinfo
771 * Destructor function. Close, unlink and deallocate the object.
775 destroy_one_procinfo (procinfo **list, procinfo *pi)
779 /* Step one: unlink the procinfo from its list */
783 for (ptr = *list; ptr; ptr = ptr->next)
786 ptr->next = pi->next;
790 /* Step two: close any open file descriptors */
791 close_procinfo_files (pi);
793 /* Step three: free the memory. */
794 #ifdef DYNAMIC_SYSCALLS
797 xfree (pi->saved_entryset);
798 xfree (pi->saved_exitset);
803 destroy_procinfo (procinfo *pi)
807 if (pi->tid != 0) /* destroy a thread procinfo */
809 tmp = find_procinfo (pi->pid, 0); /* find the parent process */
810 destroy_one_procinfo (&tmp->thread_list, pi);
812 else /* destroy a process procinfo and all its threads */
814 /* First destroy the children, if any; */
815 while (pi->thread_list != NULL)
816 destroy_one_procinfo (&pi->thread_list, pi->thread_list);
817 /* Then destroy the parent. Genocide!!! */
818 destroy_one_procinfo (&procinfo_list, pi);
823 do_destroy_procinfo_cleanup (void *pi)
825 destroy_procinfo (pi);
828 enum { NOKILL, KILL };
831 * Function: dead_procinfo
833 * To be called on a non_recoverable error for a procinfo.
834 * Prints error messages, optionally sends a SIGKILL to the process,
835 * then destroys the data structure.
839 dead_procinfo (procinfo *pi, char *msg, int kill_p)
845 print_sys_errmsg (pi->pathname, errno);
849 sprintf (procfile, "process %d", pi->pid);
850 print_sys_errmsg (procfile, errno);
853 kill (pi->pid, SIGKILL);
855 destroy_procinfo (pi);
860 * Function: sysset_t_size
862 * Returns the (complete) size of a sysset_t struct. Normally, this
863 * is just sizeof (syset_t), but in the case of Monterey/64, the actual
864 * size of sysset_t isn't known until runtime.
868 sysset_t_size (procinfo * pi)
870 #ifndef DYNAMIC_SYSCALLS
871 return sizeof (sysset_t);
873 return sizeof (sysset_t) - sizeof (uint64_t)
874 + sizeof (uint64_t) * ((pi->num_syscalls + (8 * sizeof (uint64_t) - 1))
875 / (8 * sizeof (uint64_t)));
879 /* Function: sysset_t_alloc
881 Allocate and (partially) initialize a sysset_t struct. */
884 sysset_t_alloc (procinfo * pi)
887 int size = sysset_t_size (pi);
888 ret = xmalloc (size);
889 #ifdef DYNAMIC_SYSCALLS
890 ret->pr_size = (pi->num_syscalls + (8 * sizeof (uint64_t) - 1))
891 / (8 * sizeof (uint64_t));
896 #ifdef DYNAMIC_SYSCALLS
898 /* Function: load_syscalls
900 Extract syscall numbers and names from /proc/<pid>/sysent. Initialize
901 pi->num_syscalls with the number of syscalls and pi->syscall_names
902 with the names. (Certain numbers may be skipped in which case the
903 names for these numbers will be left as NULL.) */
905 #define MAX_SYSCALL_NAME_LENGTH 256
906 #define MAX_SYSCALLS 65536
909 load_syscalls (procinfo *pi)
911 char pathname[MAX_PROC_NAME_SIZE];
914 prsyscall_t *syscalls;
915 int i, size, maxcall;
917 pi->num_syscalls = 0;
918 pi->syscall_names = 0;
920 /* Open the file descriptor for the sysent file */
921 sprintf (pathname, "/proc/%d/sysent", pi->pid);
922 sysent_fd = open_with_retry (pathname, O_RDONLY);
925 error (_("load_syscalls: Can't open /proc/%d/sysent"), pi->pid);
928 size = sizeof header - sizeof (prsyscall_t);
929 if (read (sysent_fd, &header, size) != size)
931 error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid);
934 if (header.pr_nsyscalls == 0)
936 error (_("load_syscalls: /proc/%d/sysent contains no syscalls!"), pi->pid);
939 size = header.pr_nsyscalls * sizeof (prsyscall_t);
940 syscalls = xmalloc (size);
942 if (read (sysent_fd, syscalls, size) != size)
945 error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid);
948 /* Find maximum syscall number. This may not be the same as
949 pr_nsyscalls since that value refers to the number of entries
950 in the table. (Also, the docs indicate that some system
951 call numbers may be skipped.) */
953 maxcall = syscalls[0].pr_number;
955 for (i = 1; i < header.pr_nsyscalls; i++)
956 if (syscalls[i].pr_number > maxcall
957 && syscalls[i].pr_nameoff > 0
958 && syscalls[i].pr_number < MAX_SYSCALLS)
959 maxcall = syscalls[i].pr_number;
961 pi->num_syscalls = maxcall+1;
962 pi->syscall_names = xmalloc (pi->num_syscalls * sizeof (char *));
964 for (i = 0; i < pi->num_syscalls; i++)
965 pi->syscall_names[i] = NULL;
967 /* Read the syscall names in */
968 for (i = 0; i < header.pr_nsyscalls; i++)
970 char namebuf[MAX_SYSCALL_NAME_LENGTH];
974 if (syscalls[i].pr_number >= MAX_SYSCALLS
975 || syscalls[i].pr_number < 0
976 || syscalls[i].pr_nameoff <= 0
977 || (lseek (sysent_fd, (off_t) syscalls[i].pr_nameoff, SEEK_SET)
978 != (off_t) syscalls[i].pr_nameoff))
981 nread = read (sysent_fd, namebuf, sizeof namebuf);
985 callnum = syscalls[i].pr_number;
987 if (pi->syscall_names[callnum] != NULL)
989 /* FIXME: Generate warning */
993 namebuf[nread-1] = '\0';
994 size = strlen (namebuf) + 1;
995 pi->syscall_names[callnum] = xmalloc (size);
996 strncpy (pi->syscall_names[callnum], namebuf, size-1);
997 pi->syscall_names[callnum][size-1] = '\0';
1004 /* Function: free_syscalls
1006 Free the space allocated for the syscall names from the procinfo
1010 free_syscalls (procinfo *pi)
1012 if (pi->syscall_names)
1016 for (i = 0; i < pi->num_syscalls; i++)
1017 if (pi->syscall_names[i] != NULL)
1018 xfree (pi->syscall_names[i]);
1020 xfree (pi->syscall_names);
1021 pi->syscall_names = 0;
1025 /* Function: find_syscall
1027 Given a name, look up (and return) the corresponding syscall number.
1028 If no match is found, return -1. */
1031 find_syscall (procinfo *pi, char *name)
1034 for (i = 0; i < pi->num_syscalls; i++)
1036 if (pi->syscall_names[i] && strcmp (name, pi->syscall_names[i]) == 0)
1043 /* =================== END, STRUCT PROCINFO "MODULE" =================== */
1045 /* =================== /proc "MODULE" =================== */
1048 * This "module" is the interface layer between the /proc system API
1049 * and the gdb target vector functions. This layer consists of
1050 * access functions that encapsulate each of the basic operations
1051 * that we need to use from the /proc API.
1053 * The main motivation for this layer is to hide the fact that
1054 * there are two very different implementations of the /proc API.
1055 * Rather than have a bunch of #ifdefs all thru the gdb target vector
1056 * functions, we do our best to hide them all in here.
1059 int proc_get_status (procinfo * pi);
1060 long proc_flags (procinfo * pi);
1061 int proc_why (procinfo * pi);
1062 int proc_what (procinfo * pi);
1063 int proc_set_run_on_last_close (procinfo * pi);
1064 int proc_unset_run_on_last_close (procinfo * pi);
1065 int proc_set_inherit_on_fork (procinfo * pi);
1066 int proc_unset_inherit_on_fork (procinfo * pi);
1067 int proc_set_async (procinfo * pi);
1068 int proc_unset_async (procinfo * pi);
1069 int proc_stop_process (procinfo * pi);
1070 int proc_trace_signal (procinfo * pi, int signo);
1071 int proc_ignore_signal (procinfo * pi, int signo);
1072 int proc_clear_current_fault (procinfo * pi);
1073 int proc_set_current_signal (procinfo * pi, int signo);
1074 int proc_clear_current_signal (procinfo * pi);
1075 int proc_set_gregs (procinfo * pi);
1076 int proc_set_fpregs (procinfo * pi);
1077 int proc_wait_for_stop (procinfo * pi);
1078 int proc_run_process (procinfo * pi, int step, int signo);
1079 int proc_kill (procinfo * pi, int signo);
1080 int proc_parent_pid (procinfo * pi);
1081 int proc_get_nthreads (procinfo * pi);
1082 int proc_get_current_thread (procinfo * pi);
1083 int proc_set_held_signals (procinfo * pi, gdb_sigset_t * sighold);
1084 int proc_set_traced_sysexit (procinfo * pi, sysset_t * sysset);
1085 int proc_set_traced_sysentry (procinfo * pi, sysset_t * sysset);
1086 int proc_set_traced_faults (procinfo * pi, fltset_t * fltset);
1087 int proc_set_traced_signals (procinfo * pi, gdb_sigset_t * sigset);
1089 int proc_update_threads (procinfo * pi);
1090 int proc_iterate_over_threads (procinfo * pi,
1091 int (*func) (procinfo *, procinfo *, void *),
1094 gdb_gregset_t *proc_get_gregs (procinfo * pi);
1095 gdb_fpregset_t *proc_get_fpregs (procinfo * pi);
1096 sysset_t *proc_get_traced_sysexit (procinfo * pi, sysset_t * save);
1097 sysset_t *proc_get_traced_sysentry (procinfo * pi, sysset_t * save);
1098 fltset_t *proc_get_traced_faults (procinfo * pi, fltset_t * save);
1099 gdb_sigset_t *proc_get_traced_signals (procinfo * pi, gdb_sigset_t * save);
1100 gdb_sigset_t *proc_get_held_signals (procinfo * pi, gdb_sigset_t * save);
1101 gdb_sigset_t *proc_get_pending_signals (procinfo * pi, gdb_sigset_t * save);
1102 gdb_sigaction_t *proc_get_signal_actions (procinfo * pi, gdb_sigaction_t *save);
1104 void proc_warn (procinfo * pi, char *func, int line);
1105 void proc_error (procinfo * pi, char *func, int line);
1108 proc_warn (procinfo *pi, char *func, int line)
1110 sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
1111 print_sys_errmsg (errmsg, errno);
1115 proc_error (procinfo *pi, char *func, int line)
1117 sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
1118 perror_with_name (errmsg);
1122 * Function: proc_get_status
1124 * Updates the status struct in the procinfo.
1125 * There is a 'valid' flag, to let other functions know when
1126 * this function needs to be called (so the status is only
1127 * read when it is needed). The status file descriptor is
1128 * also only opened when it is needed.
1130 * Return: non-zero for success, zero for failure.
1134 proc_get_status (procinfo *pi)
1136 /* Status file descriptor is opened "lazily" */
1137 if (pi->status_fd == 0 &&
1138 open_procinfo_files (pi, FD_STATUS) == 0)
1140 pi->status_valid = 0;
1145 if (lseek (pi->status_fd, 0, SEEK_SET) < 0)
1146 pi->status_valid = 0; /* fail */
1149 /* Sigh... I have to read a different data structure,
1150 depending on whether this is a main process or an LWP. */
1152 pi->status_valid = (read (pi->status_fd,
1153 (char *) &pi->prstatus.pr_lwp,
1154 sizeof (lwpstatus_t))
1155 == sizeof (lwpstatus_t));
1158 pi->status_valid = (read (pi->status_fd,
1159 (char *) &pi->prstatus,
1160 sizeof (gdb_prstatus_t))
1161 == sizeof (gdb_prstatus_t));
1162 #if 0 /*def UNIXWARE*/
1163 if (pi->status_valid &&
1164 (pi->prstatus.pr_lwp.pr_flags & PR_ISTOP) &&
1165 pi->prstatus.pr_lwp.pr_why == PR_REQUESTED)
1166 /* Unixware peculiarity -- read the damn thing again! */
1167 pi->status_valid = (read (pi->status_fd,
1168 (char *) &pi->prstatus,
1169 sizeof (gdb_prstatus_t))
1170 == sizeof (gdb_prstatus_t));
1171 #endif /* UNIXWARE */
1174 #else /* ioctl method */
1175 #ifdef PIOCTSTATUS /* osf */
1176 if (pi->tid == 0) /* main process */
1178 /* Just read the danged status. Now isn't that simple? */
1180 (ioctl (pi->status_fd, PIOCSTATUS, &pi->prstatus) >= 0);
1187 tid_t pr_error_thread;
1188 struct prstatus status;
1191 thread_status.pr_count = 1;
1192 thread_status.status.pr_tid = pi->tid;
1193 win = (ioctl (pi->status_fd, PIOCTSTATUS, &thread_status) >= 0);
1196 memcpy (&pi->prstatus, &thread_status.status,
1197 sizeof (pi->prstatus));
1198 pi->status_valid = 1;
1202 /* Just read the danged status. Now isn't that simple? */
1203 pi->status_valid = (ioctl (pi->status_fd, PIOCSTATUS, &pi->prstatus) >= 0);
1207 if (pi->status_valid)
1209 PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1212 proc_get_current_thread (pi));
1215 /* The status struct includes general regs, so mark them valid too */
1216 pi->gregs_valid = pi->status_valid;
1218 /* In the read/write multiple-fd model,
1219 the status struct includes the fp regs too, so mark them valid too */
1220 pi->fpregs_valid = pi->status_valid;
1222 return pi->status_valid; /* True if success, false if failure. */
1226 * Function: proc_flags
1228 * returns the process flags (pr_flags field).
1232 proc_flags (procinfo *pi)
1234 if (!pi->status_valid)
1235 if (!proc_get_status (pi))
1236 return 0; /* FIXME: not a good failure value (but what is?) */
1240 /* UnixWare 7.1 puts process status flags, e.g. PR_ASYNC, in
1241 pstatus_t and LWP status flags, e.g. PR_STOPPED, in lwpstatus_t.
1242 The two sets of flags don't overlap. */
1243 return pi->prstatus.pr_flags | pi->prstatus.pr_lwp.pr_flags;
1245 return pi->prstatus.pr_lwp.pr_flags;
1248 return pi->prstatus.pr_flags;
1253 * Function: proc_why
1255 * returns the pr_why field (why the process stopped).
1259 proc_why (procinfo *pi)
1261 if (!pi->status_valid)
1262 if (!proc_get_status (pi))
1263 return 0; /* FIXME: not a good failure value (but what is?) */
1266 return pi->prstatus.pr_lwp.pr_why;
1268 return pi->prstatus.pr_why;
1273 * Function: proc_what
1275 * returns the pr_what field (details of why the process stopped).
1279 proc_what (procinfo *pi)
1281 if (!pi->status_valid)
1282 if (!proc_get_status (pi))
1283 return 0; /* FIXME: not a good failure value (but what is?) */
1286 return pi->prstatus.pr_lwp.pr_what;
1288 return pi->prstatus.pr_what;
1292 #ifndef PIOCSSPCACT /* The following is not supported on OSF. */
1294 * Function: proc_nsysarg
1296 * returns the pr_nsysarg field (number of args to the current syscall).
1300 proc_nsysarg (procinfo *pi)
1302 if (!pi->status_valid)
1303 if (!proc_get_status (pi))
1307 return pi->prstatus.pr_lwp.pr_nsysarg;
1309 return pi->prstatus.pr_nsysarg;
1314 * Function: proc_sysargs
1316 * returns the pr_sysarg field (pointer to the arguments of current syscall).
1320 proc_sysargs (procinfo *pi)
1322 if (!pi->status_valid)
1323 if (!proc_get_status (pi))
1327 return (long *) &pi->prstatus.pr_lwp.pr_sysarg;
1329 return (long *) &pi->prstatus.pr_sysarg;
1334 * Function: proc_syscall
1336 * returns the pr_syscall field (id of current syscall if we are in one).
1340 proc_syscall (procinfo *pi)
1342 if (!pi->status_valid)
1343 if (!proc_get_status (pi))
1347 return pi->prstatus.pr_lwp.pr_syscall;
1349 return pi->prstatus.pr_syscall;
1352 #endif /* PIOCSSPCACT */
1355 * Function: proc_cursig:
1357 * returns the pr_cursig field (current signal).
1361 proc_cursig (struct procinfo *pi)
1363 if (!pi->status_valid)
1364 if (!proc_get_status (pi))
1365 return 0; /* FIXME: not a good failure value (but what is?) */
1368 return pi->prstatus.pr_lwp.pr_cursig;
1370 return pi->prstatus.pr_cursig;
1375 * Function: proc_modify_flag
1377 * === I appologize for the messiness of this function.
1378 * === This is an area where the different versions of
1379 * === /proc are more inconsistent than usual. MVS
1381 * Set or reset any of the following process flags:
1382 * PR_FORK -- forked child will inherit trace flags
1383 * PR_RLC -- traced process runs when last /proc file closed.
1384 * PR_KLC -- traced process is killed when last /proc file closed.
1385 * PR_ASYNC -- LWP's get to run/stop independently.
1387 * There are three methods for doing this function:
1388 * 1) Newest: read/write [PCSET/PCRESET/PCUNSET]
1390 * 2) Middle: PIOCSET/PIOCRESET
1392 * 3) Oldest: PIOCSFORK/PIOCRFORK/PIOCSRLC/PIOCRRLC
1395 * Note: Irix does not define PR_ASYNC.
1396 * Note: OSF does not define PR_KLC.
1397 * Note: OSF is the only one that can ONLY use the oldest method.
1400 * pi -- the procinfo
1401 * flag -- one of PR_FORK, PR_RLC, or PR_ASYNC
1402 * mode -- 1 for set, 0 for reset.
1404 * Returns non-zero for success, zero for failure.
1407 enum { FLAG_RESET, FLAG_SET };
1410 proc_modify_flag (procinfo *pi, long flag, long mode)
1412 long win = 0; /* default to fail */
1415 * These operations affect the process as a whole, and applying
1416 * them to an individual LWP has the same meaning as applying them
1417 * to the main process. Therefore, if we're ever called with a
1418 * pointer to an LWP's procinfo, let's substitute the process's
1419 * procinfo and avoid opening the LWP's file descriptor
1424 pi = find_procinfo_or_die (pi->pid, 0);
1426 #ifdef NEW_PROC_API /* Newest method: UnixWare and newer Solarii */
1427 /* First normalize the PCUNSET/PCRESET command opcode
1428 (which for no obvious reason has a different definition
1429 from one operating system to the next...) */
1431 #define GDBRESET PCUNSET
1434 #define GDBRESET PCRESET
1438 procfs_ctl_t arg[2];
1440 if (mode == FLAG_SET) /* Set the flag (RLC, FORK, or ASYNC) */
1442 else /* Reset the flag */
1446 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
1449 #ifdef PIOCSET /* Irix/Sol5 method */
1450 if (mode == FLAG_SET) /* Set the flag (hopefully RLC, FORK, or ASYNC) */
1452 win = (ioctl (pi->ctl_fd, PIOCSET, &flag) >= 0);
1454 else /* Reset the flag */
1456 win = (ioctl (pi->ctl_fd, PIOCRESET, &flag) >= 0);
1460 #ifdef PIOCSRLC /* Oldest method: OSF */
1463 if (mode == FLAG_SET) /* Set run-on-last-close */
1465 win = (ioctl (pi->ctl_fd, PIOCSRLC, NULL) >= 0);
1467 else /* Clear run-on-last-close */
1469 win = (ioctl (pi->ctl_fd, PIOCRRLC, NULL) >= 0);
1473 if (mode == FLAG_SET) /* Set inherit-on-fork */
1475 win = (ioctl (pi->ctl_fd, PIOCSFORK, NULL) >= 0);
1477 else /* Clear inherit-on-fork */
1479 win = (ioctl (pi->ctl_fd, PIOCRFORK, NULL) >= 0);
1483 win = 0; /* fail -- unknown flag (can't do PR_ASYNC) */
1490 /* The above operation renders the procinfo's cached pstatus obsolete. */
1491 pi->status_valid = 0;
1494 warning (_("procfs: modify_flag failed to turn %s %s"),
1495 flag == PR_FORK ? "PR_FORK" :
1496 flag == PR_RLC ? "PR_RLC" :
1498 flag == PR_ASYNC ? "PR_ASYNC" :
1501 flag == PR_KLC ? "PR_KLC" :
1504 mode == FLAG_RESET ? "off" : "on");
1510 * Function: proc_set_run_on_last_close
1512 * Set the run_on_last_close flag.
1513 * Process with all threads will become runnable
1514 * when debugger closes all /proc fds.
1516 * Returns non-zero for success, zero for failure.
1520 proc_set_run_on_last_close (procinfo *pi)
1522 return proc_modify_flag (pi, PR_RLC, FLAG_SET);
1526 * Function: proc_unset_run_on_last_close
1528 * Reset the run_on_last_close flag.
1529 * Process will NOT become runnable
1530 * when debugger closes its file handles.
1532 * Returns non-zero for success, zero for failure.
1536 proc_unset_run_on_last_close (procinfo *pi)
1538 return proc_modify_flag (pi, PR_RLC, FLAG_RESET);
1543 * Function: proc_set_kill_on_last_close
1545 * Set the kill_on_last_close flag.
1546 * Process with all threads will be killed when debugger
1547 * closes all /proc fds (or debugger exits or dies).
1549 * Returns non-zero for success, zero for failure.
1553 proc_set_kill_on_last_close (procinfo *pi)
1555 return proc_modify_flag (pi, PR_KLC, FLAG_SET);
1559 * Function: proc_unset_kill_on_last_close
1561 * Reset the kill_on_last_close flag.
1562 * Process will NOT be killed when debugger
1563 * closes its file handles (or exits or dies).
1565 * Returns non-zero for success, zero for failure.
1569 proc_unset_kill_on_last_close (procinfo *pi)
1571 return proc_modify_flag (pi, PR_KLC, FLAG_RESET);
1576 * Function: proc_set_inherit_on_fork
1578 * Set inherit_on_fork flag.
1579 * If the process forks a child while we are registered for events
1580 * in the parent, then we will also recieve events from the child.
1582 * Returns non-zero for success, zero for failure.
1586 proc_set_inherit_on_fork (procinfo *pi)
1588 return proc_modify_flag (pi, PR_FORK, FLAG_SET);
1592 * Function: proc_unset_inherit_on_fork
1594 * Reset inherit_on_fork flag.
1595 * If the process forks a child while we are registered for events
1596 * in the parent, then we will NOT recieve events from the child.
1598 * Returns non-zero for success, zero for failure.
1602 proc_unset_inherit_on_fork (procinfo *pi)
1604 return proc_modify_flag (pi, PR_FORK, FLAG_RESET);
1609 * Function: proc_set_async
1611 * Set PR_ASYNC flag.
1612 * If one LWP stops because of a debug event (signal etc.),
1613 * the remaining LWPs will continue to run.
1615 * Returns non-zero for success, zero for failure.
1619 proc_set_async (procinfo *pi)
1621 return proc_modify_flag (pi, PR_ASYNC, FLAG_SET);
1625 * Function: proc_unset_async
1627 * Reset PR_ASYNC flag.
1628 * If one LWP stops because of a debug event (signal etc.),
1629 * then all other LWPs will stop as well.
1631 * Returns non-zero for success, zero for failure.
1635 proc_unset_async (procinfo *pi)
1637 return proc_modify_flag (pi, PR_ASYNC, FLAG_RESET);
1639 #endif /* PR_ASYNC */
1642 * Function: proc_stop_process
1644 * Request the process/LWP to stop. Does not wait.
1645 * Returns non-zero for success, zero for failure.
1649 proc_stop_process (procinfo *pi)
1654 * We might conceivably apply this operation to an LWP, and
1655 * the LWP's ctl file descriptor might not be open.
1658 if (pi->ctl_fd == 0 &&
1659 open_procinfo_files (pi, FD_CTL) == 0)
1664 procfs_ctl_t cmd = PCSTOP;
1665 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1666 #else /* ioctl method */
1667 win = (ioctl (pi->ctl_fd, PIOCSTOP, &pi->prstatus) >= 0);
1668 /* Note: the call also reads the prstatus. */
1671 pi->status_valid = 1;
1672 PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1675 proc_get_current_thread (pi));
1684 * Function: proc_wait_for_stop
1686 * Wait for the process or LWP to stop (block until it does).
1687 * Returns non-zero for success, zero for failure.
1691 proc_wait_for_stop (procinfo *pi)
1696 * We should never have to apply this operation to any procinfo
1697 * except the one for the main process. If that ever changes
1698 * for any reason, then take out the following clause and
1699 * replace it with one that makes sure the ctl_fd is open.
1703 pi = find_procinfo_or_die (pi->pid, 0);
1707 procfs_ctl_t cmd = PCWSTOP;
1708 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1709 /* We been runnin' and we stopped -- need to update status. */
1710 pi->status_valid = 0;
1712 #else /* ioctl method */
1713 win = (ioctl (pi->ctl_fd, PIOCWSTOP, &pi->prstatus) >= 0);
1714 /* Above call also refreshes the prstatus. */
1717 pi->status_valid = 1;
1718 PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1721 proc_get_current_thread (pi));
1729 * Function: proc_run_process
1731 * Make the process or LWP runnable.
1732 * Options (not all are implemented):
1734 * - clear current fault
1735 * - clear current signal
1736 * - abort the current system call
1737 * - stop as soon as finished with system call
1738 * - (ioctl): set traced signal set
1739 * - (ioctl): set held signal set
1740 * - (ioctl): set traced fault set
1741 * - (ioctl): set start pc (vaddr)
1742 * Always clear the current fault.
1743 * Clear the current signal if 'signo' is zero.
1746 * pi the process or LWP to operate on.
1747 * step if true, set the process or LWP to trap after one instr.
1748 * signo if zero, clear the current signal if any.
1749 * if non-zero, set the current signal to this one.
1751 * Returns non-zero for success, zero for failure.
1755 proc_run_process (procinfo *pi, int step, int signo)
1761 * We will probably have to apply this operation to individual threads,
1762 * so make sure the control file descriptor is open.
1765 if (pi->ctl_fd == 0 &&
1766 open_procinfo_files (pi, FD_CTL) == 0)
1771 runflags = PRCFAULT; /* always clear current fault */
1776 else if (signo != -1) /* -1 means do nothing W.R.T. signals */
1777 proc_set_current_signal (pi, signo);
1781 procfs_ctl_t cmd[2];
1785 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1787 #else /* ioctl method */
1791 memset (&prrun, 0, sizeof (prrun));
1792 prrun.pr_flags = runflags;
1793 win = (ioctl (pi->ctl_fd, PIOCRUN, &prrun) >= 0);
1801 * Function: proc_set_traced_signals
1803 * Register to trace signals in the process or LWP.
1804 * Returns non-zero for success, zero for failure.
1808 proc_set_traced_signals (procinfo *pi, gdb_sigset_t *sigset)
1813 * We should never have to apply this operation to any procinfo
1814 * except the one for the main process. If that ever changes
1815 * for any reason, then take out the following clause and
1816 * replace it with one that makes sure the ctl_fd is open.
1820 pi = find_procinfo_or_die (pi->pid, 0);
1826 /* Use char array to avoid alignment issues. */
1827 char sigset[sizeof (gdb_sigset_t)];
1831 memcpy (&arg.sigset, sigset, sizeof (gdb_sigset_t));
1833 win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
1835 #else /* ioctl method */
1836 win = (ioctl (pi->ctl_fd, PIOCSTRACE, sigset) >= 0);
1838 /* The above operation renders the procinfo's cached pstatus obsolete. */
1839 pi->status_valid = 0;
1842 warning (_("procfs: set_traced_signals failed"));
1847 * Function: proc_set_traced_faults
1849 * Register to trace hardware faults in the process or LWP.
1850 * Returns non-zero for success, zero for failure.
1854 proc_set_traced_faults (procinfo *pi, fltset_t *fltset)
1859 * We should never have to apply this operation to any procinfo
1860 * except the one for the main process. If that ever changes
1861 * for any reason, then take out the following clause and
1862 * replace it with one that makes sure the ctl_fd is open.
1866 pi = find_procinfo_or_die (pi->pid, 0);
1872 /* Use char array to avoid alignment issues. */
1873 char fltset[sizeof (fltset_t)];
1877 memcpy (&arg.fltset, fltset, sizeof (fltset_t));
1879 win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
1881 #else /* ioctl method */
1882 win = (ioctl (pi->ctl_fd, PIOCSFAULT, fltset) >= 0);
1884 /* The above operation renders the procinfo's cached pstatus obsolete. */
1885 pi->status_valid = 0;
1891 * Function: proc_set_traced_sysentry
1893 * Register to trace entry to system calls in the process or LWP.
1894 * Returns non-zero for success, zero for failure.
1898 proc_set_traced_sysentry (procinfo *pi, sysset_t *sysset)
1903 * We should never have to apply this operation to any procinfo
1904 * except the one for the main process. If that ever changes
1905 * for any reason, then take out the following clause and
1906 * replace it with one that makes sure the ctl_fd is open.
1910 pi = find_procinfo_or_die (pi->pid, 0);
1914 struct gdb_proc_ctl_pcsentry {
1916 /* Use char array to avoid alignment issues. */
1917 char sysset[sizeof (sysset_t)];
1919 int argp_size = sizeof (struct gdb_proc_ctl_pcsentry)
1921 + sysset_t_size (pi);
1923 argp = xmalloc (argp_size);
1925 argp->cmd = PCSENTRY;
1926 memcpy (&argp->sysset, sysset, sysset_t_size (pi));
1928 win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
1931 #else /* ioctl method */
1932 win = (ioctl (pi->ctl_fd, PIOCSENTRY, sysset) >= 0);
1934 /* The above operation renders the procinfo's cached pstatus obsolete. */
1935 pi->status_valid = 0;
1941 * Function: proc_set_traced_sysexit
1943 * Register to trace exit from system calls in the process or LWP.
1944 * Returns non-zero for success, zero for failure.
1948 proc_set_traced_sysexit (procinfo *pi, sysset_t *sysset)
1953 * We should never have to apply this operation to any procinfo
1954 * except the one for the main process. If that ever changes
1955 * for any reason, then take out the following clause and
1956 * replace it with one that makes sure the ctl_fd is open.
1960 pi = find_procinfo_or_die (pi->pid, 0);
1964 struct gdb_proc_ctl_pcsexit {
1966 /* Use char array to avoid alignment issues. */
1967 char sysset[sizeof (sysset_t)];
1969 int argp_size = sizeof (struct gdb_proc_ctl_pcsexit)
1971 + sysset_t_size (pi);
1973 argp = xmalloc (argp_size);
1975 argp->cmd = PCSEXIT;
1976 memcpy (&argp->sysset, sysset, sysset_t_size (pi));
1978 win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
1981 #else /* ioctl method */
1982 win = (ioctl (pi->ctl_fd, PIOCSEXIT, sysset) >= 0);
1984 /* The above operation renders the procinfo's cached pstatus obsolete. */
1985 pi->status_valid = 0;
1991 * Function: proc_set_held_signals
1993 * Specify the set of blocked / held signals in the process or LWP.
1994 * Returns non-zero for success, zero for failure.
1998 proc_set_held_signals (procinfo *pi, gdb_sigset_t *sighold)
2003 * We should never have to apply this operation to any procinfo
2004 * except the one for the main process. If that ever changes
2005 * for any reason, then take out the following clause and
2006 * replace it with one that makes sure the ctl_fd is open.
2010 pi = find_procinfo_or_die (pi->pid, 0);
2016 /* Use char array to avoid alignment issues. */
2017 char hold[sizeof (gdb_sigset_t)];
2021 memcpy (&arg.hold, sighold, sizeof (gdb_sigset_t));
2022 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2025 win = (ioctl (pi->ctl_fd, PIOCSHOLD, sighold) >= 0);
2027 /* The above operation renders the procinfo's cached pstatus obsolete. */
2028 pi->status_valid = 0;
2034 * Function: proc_get_pending_signals
2036 * returns the set of signals that are pending in the process or LWP.
2037 * Will also copy the sigset if 'save' is non-zero.
2041 proc_get_pending_signals (procinfo *pi, gdb_sigset_t *save)
2043 gdb_sigset_t *ret = NULL;
2046 * We should never have to apply this operation to any procinfo
2047 * except the one for the main process. If that ever changes
2048 * for any reason, then take out the following clause and
2049 * replace it with one that makes sure the ctl_fd is open.
2053 pi = find_procinfo_or_die (pi->pid, 0);
2055 if (!pi->status_valid)
2056 if (!proc_get_status (pi))
2060 ret = &pi->prstatus.pr_lwp.pr_lwppend;
2062 ret = &pi->prstatus.pr_sigpend;
2065 memcpy (save, ret, sizeof (gdb_sigset_t));
2071 * Function: proc_get_signal_actions
2073 * returns the set of signal actions.
2074 * Will also copy the sigactionset if 'save' is non-zero.
2078 proc_get_signal_actions (procinfo *pi, gdb_sigaction_t *save)
2080 gdb_sigaction_t *ret = NULL;
2083 * We should never have to apply this operation to any procinfo
2084 * except the one for the main process. If that ever changes
2085 * for any reason, then take out the following clause and
2086 * replace it with one that makes sure the ctl_fd is open.
2090 pi = find_procinfo_or_die (pi->pid, 0);
2092 if (!pi->status_valid)
2093 if (!proc_get_status (pi))
2097 ret = &pi->prstatus.pr_lwp.pr_action;
2099 ret = &pi->prstatus.pr_action;
2102 memcpy (save, ret, sizeof (gdb_sigaction_t));
2108 * Function: proc_get_held_signals
2110 * returns the set of signals that are held / blocked.
2111 * Will also copy the sigset if 'save' is non-zero.
2115 proc_get_held_signals (procinfo *pi, gdb_sigset_t *save)
2117 gdb_sigset_t *ret = NULL;
2120 * We should never have to apply this operation to any procinfo
2121 * except the one for the main process. If that ever changes
2122 * for any reason, then take out the following clause and
2123 * replace it with one that makes sure the ctl_fd is open.
2127 pi = find_procinfo_or_die (pi->pid, 0);
2130 if (!pi->status_valid)
2131 if (!proc_get_status (pi))
2135 ret = &pi->prstatus.pr_lwp.pr_context.uc_sigmask;
2137 ret = &pi->prstatus.pr_lwp.pr_lwphold;
2138 #endif /* UNIXWARE */
2139 #else /* not NEW_PROC_API */
2141 static gdb_sigset_t sigheld;
2143 if (ioctl (pi->ctl_fd, PIOCGHOLD, &sigheld) >= 0)
2146 #endif /* NEW_PROC_API */
2148 memcpy (save, ret, sizeof (gdb_sigset_t));
2154 * Function: proc_get_traced_signals
2156 * returns the set of signals that are traced / debugged.
2157 * Will also copy the sigset if 'save' is non-zero.
2161 proc_get_traced_signals (procinfo *pi, gdb_sigset_t *save)
2163 gdb_sigset_t *ret = NULL;
2166 * We should never have to apply this operation to any procinfo
2167 * except the one for the main process. If that ever changes
2168 * for any reason, then take out the following clause and
2169 * replace it with one that makes sure the ctl_fd is open.
2173 pi = find_procinfo_or_die (pi->pid, 0);
2176 if (!pi->status_valid)
2177 if (!proc_get_status (pi))
2180 ret = &pi->prstatus.pr_sigtrace;
2183 static gdb_sigset_t sigtrace;
2185 if (ioctl (pi->ctl_fd, PIOCGTRACE, &sigtrace) >= 0)
2190 memcpy (save, ret, sizeof (gdb_sigset_t));
2196 * Function: proc_trace_signal
2198 * Add 'signo' to the set of signals that are traced.
2199 * Returns non-zero for success, zero for failure.
2203 proc_trace_signal (procinfo *pi, int signo)
2208 * We should never have to apply this operation to any procinfo
2209 * except the one for the main process. If that ever changes
2210 * for any reason, then take out the following clause and
2211 * replace it with one that makes sure the ctl_fd is open.
2215 pi = find_procinfo_or_die (pi->pid, 0);
2219 if (proc_get_traced_signals (pi, &temp))
2221 praddset (&temp, signo);
2222 return proc_set_traced_signals (pi, &temp);
2226 return 0; /* failure */
2230 * Function: proc_ignore_signal
2232 * Remove 'signo' from the set of signals that are traced.
2233 * Returns non-zero for success, zero for failure.
2237 proc_ignore_signal (procinfo *pi, int signo)
2242 * We should never have to apply this operation to any procinfo
2243 * except the one for the main process. If that ever changes
2244 * for any reason, then take out the following clause and
2245 * replace it with one that makes sure the ctl_fd is open.
2249 pi = find_procinfo_or_die (pi->pid, 0);
2253 if (proc_get_traced_signals (pi, &temp))
2255 prdelset (&temp, signo);
2256 return proc_set_traced_signals (pi, &temp);
2260 return 0; /* failure */
2264 * Function: proc_get_traced_faults
2266 * returns the set of hardware faults that are traced /debugged.
2267 * Will also copy the faultset if 'save' is non-zero.
2271 proc_get_traced_faults (procinfo *pi, fltset_t *save)
2273 fltset_t *ret = NULL;
2276 * We should never have to apply this operation to any procinfo
2277 * except the one for the main process. If that ever changes
2278 * for any reason, then take out the following clause and
2279 * replace it with one that makes sure the ctl_fd is open.
2283 pi = find_procinfo_or_die (pi->pid, 0);
2286 if (!pi->status_valid)
2287 if (!proc_get_status (pi))
2290 ret = &pi->prstatus.pr_flttrace;
2293 static fltset_t flttrace;
2295 if (ioctl (pi->ctl_fd, PIOCGFAULT, &flttrace) >= 0)
2300 memcpy (save, ret, sizeof (fltset_t));
2306 * Function: proc_get_traced_sysentry
2308 * returns the set of syscalls that are traced /debugged on entry.
2309 * Will also copy the syscall set if 'save' is non-zero.
2313 proc_get_traced_sysentry (procinfo *pi, sysset_t *save)
2315 sysset_t *ret = NULL;
2318 * We should never have to apply this operation to any procinfo
2319 * except the one for the main process. If that ever changes
2320 * for any reason, then take out the following clause and
2321 * replace it with one that makes sure the ctl_fd is open.
2325 pi = find_procinfo_or_die (pi->pid, 0);
2328 if (!pi->status_valid)
2329 if (!proc_get_status (pi))
2332 #ifndef DYNAMIC_SYSCALLS
2333 ret = &pi->prstatus.pr_sysentry;
2334 #else /* DYNAMIC_SYSCALLS */
2336 static sysset_t *sysentry;
2340 sysentry = sysset_t_alloc (pi);
2342 if (pi->status_fd == 0 && open_procinfo_files (pi, FD_STATUS) == 0)
2344 if (pi->prstatus.pr_sysentry_offset == 0)
2346 gdb_premptysysset (sysentry);
2352 if (lseek (pi->status_fd, (off_t) pi->prstatus.pr_sysentry_offset,
2354 != (off_t) pi->prstatus.pr_sysentry_offset)
2356 size = sysset_t_size (pi);
2357 gdb_premptysysset (sysentry);
2358 rsize = read (pi->status_fd, sysentry, size);
2363 #endif /* DYNAMIC_SYSCALLS */
2364 #else /* !NEW_PROC_API */
2366 static sysset_t sysentry;
2368 if (ioctl (pi->ctl_fd, PIOCGENTRY, &sysentry) >= 0)
2371 #endif /* NEW_PROC_API */
2373 memcpy (save, ret, sysset_t_size (pi));
2379 * Function: proc_get_traced_sysexit
2381 * returns the set of syscalls that are traced /debugged on exit.
2382 * Will also copy the syscall set if 'save' is non-zero.
2386 proc_get_traced_sysexit (procinfo *pi, sysset_t *save)
2388 sysset_t * ret = NULL;
2391 * We should never have to apply this operation to any procinfo
2392 * except the one for the main process. If that ever changes
2393 * for any reason, then take out the following clause and
2394 * replace it with one that makes sure the ctl_fd is open.
2398 pi = find_procinfo_or_die (pi->pid, 0);
2401 if (!pi->status_valid)
2402 if (!proc_get_status (pi))
2405 #ifndef DYNAMIC_SYSCALLS
2406 ret = &pi->prstatus.pr_sysexit;
2407 #else /* DYNAMIC_SYSCALLS */
2409 static sysset_t *sysexit;
2413 sysexit = sysset_t_alloc (pi);
2415 if (pi->status_fd == 0 && open_procinfo_files (pi, FD_STATUS) == 0)
2417 if (pi->prstatus.pr_sysexit_offset == 0)
2419 gdb_premptysysset (sysexit);
2425 if (lseek (pi->status_fd, (off_t) pi->prstatus.pr_sysexit_offset, SEEK_SET)
2426 != (off_t) pi->prstatus.pr_sysexit_offset)
2428 size = sysset_t_size (pi);
2429 gdb_premptysysset (sysexit);
2430 rsize = read (pi->status_fd, sysexit, size);
2435 #endif /* DYNAMIC_SYSCALLS */
2438 static sysset_t sysexit;
2440 if (ioctl (pi->ctl_fd, PIOCGEXIT, &sysexit) >= 0)
2445 memcpy (save, ret, sysset_t_size (pi));
2451 * Function: proc_clear_current_fault
2453 * The current fault (if any) is cleared; the associated signal
2454 * will not be sent to the process or LWP when it resumes.
2455 * Returns non-zero for success, zero for failure.
2459 proc_clear_current_fault (procinfo *pi)
2464 * We should never have to apply this operation to any procinfo
2465 * except the one for the main process. If that ever changes
2466 * for any reason, then take out the following clause and
2467 * replace it with one that makes sure the ctl_fd is open.
2471 pi = find_procinfo_or_die (pi->pid, 0);
2475 procfs_ctl_t cmd = PCCFAULT;
2476 win = (write (pi->ctl_fd, (void *) &cmd, sizeof (cmd)) == sizeof (cmd));
2479 win = (ioctl (pi->ctl_fd, PIOCCFAULT, 0) >= 0);
2486 * Function: proc_set_current_signal
2488 * Set the "current signal" that will be delivered next to the process.
2489 * NOTE: semantics are different from those of KILL.
2490 * This signal will be delivered to the process or LWP
2491 * immediately when it is resumed (even if the signal is held/blocked);
2492 * it will NOT immediately cause another event of interest, and will NOT
2493 * first trap back to the debugger.
2495 * Returns non-zero for success, zero for failure.
2499 proc_set_current_signal (procinfo *pi, int signo)
2504 /* Use char array to avoid alignment issues. */
2505 char sinfo[sizeof (gdb_siginfo_t)];
2507 gdb_siginfo_t *mysinfo;
2509 struct target_waitstatus wait_status;
2512 * We should never have to apply this operation to any procinfo
2513 * except the one for the main process. If that ever changes
2514 * for any reason, then take out the following clause and
2515 * replace it with one that makes sure the ctl_fd is open.
2519 pi = find_procinfo_or_die (pi->pid, 0);
2521 #ifdef PROCFS_DONT_PIOCSSIG_CURSIG
2522 /* With Alpha OSF/1 procfs, the kernel gets really confused if it
2523 * receives a PIOCSSIG with a signal identical to the current signal,
2524 * it messes up the current signal. Work around the kernel bug.
2527 signo == proc_cursig (pi))
2528 return 1; /* I assume this is a success? */
2531 /* The pointer is just a type alias. */
2532 mysinfo = (gdb_siginfo_t *) &arg.sinfo;
2533 get_last_target_status (&wait_ptid, &wait_status);
2534 if (ptid_equal (wait_ptid, inferior_ptid)
2535 && wait_status.kind == TARGET_WAITKIND_STOPPED
2536 && wait_status.value.sig == target_signal_from_host (signo)
2537 && proc_get_status (pi)
2539 && pi->prstatus.pr_lwp.pr_info.si_signo == signo
2541 && pi->prstatus.pr_info.si_signo == signo
2544 /* Use the siginfo associated with the signal being
2547 memcpy (mysinfo, &pi->prstatus.pr_lwp.pr_info, sizeof (gdb_siginfo_t));
2549 memcpy (mysinfo, &pi->prstatus.pr_info, sizeof (gdb_siginfo_t));
2553 mysinfo->si_signo = signo;
2554 mysinfo->si_code = 0;
2555 mysinfo->si_pid = getpid (); /* ?why? */
2556 mysinfo->si_uid = getuid (); /* ?why? */
2561 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2563 win = (ioctl (pi->ctl_fd, PIOCSSIG, (void *) &arg.sinfo) >= 0);
2570 * Function: proc_clear_current_signal
2572 * The current signal (if any) is cleared, and
2573 * is not sent to the process or LWP when it resumes.
2574 * Returns non-zero for success, zero for failure.
2578 proc_clear_current_signal (procinfo *pi)
2583 * We should never have to apply this operation to any procinfo
2584 * except the one for the main process. If that ever changes
2585 * for any reason, then take out the following clause and
2586 * replace it with one that makes sure the ctl_fd is open.
2590 pi = find_procinfo_or_die (pi->pid, 0);
2596 /* Use char array to avoid alignment issues. */
2597 char sinfo[sizeof (gdb_siginfo_t)];
2599 gdb_siginfo_t *mysinfo;
2602 /* The pointer is just a type alias. */
2603 mysinfo = (gdb_siginfo_t *) &arg.sinfo;
2604 mysinfo->si_signo = 0;
2605 mysinfo->si_code = 0;
2606 mysinfo->si_errno = 0;
2607 mysinfo->si_pid = getpid (); /* ?why? */
2608 mysinfo->si_uid = getuid (); /* ?why? */
2610 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2613 win = (ioctl (pi->ctl_fd, PIOCSSIG, 0) >= 0);
2619 /* Return the general-purpose registers for the process or LWP
2620 corresponding to PI. Upon failure, return NULL. */
2623 proc_get_gregs (procinfo *pi)
2625 if (!pi->status_valid || !pi->gregs_valid)
2626 if (!proc_get_status (pi))
2629 /* OK, sorry about the ifdef's. There's three cases instead of two,
2630 because in this case Unixware and Solaris/RW differ. */
2633 # ifdef UNIXWARE /* FIXME: Should be autoconfigured. */
2634 return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.gregs;
2636 return &pi->prstatus.pr_lwp.pr_reg;
2639 return &pi->prstatus.pr_reg;
2643 /* Return the general-purpose registers for the process or LWP
2644 corresponding to PI. Upon failure, return NULL. */
2647 proc_get_fpregs (procinfo *pi)
2650 if (!pi->status_valid || !pi->fpregs_valid)
2651 if (!proc_get_status (pi))
2654 # ifdef UNIXWARE /* FIXME: Should be autoconfigured. */
2655 return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.fpregs;
2657 return &pi->prstatus.pr_lwp.pr_fpreg;
2660 #else /* not NEW_PROC_API */
2661 if (pi->fpregs_valid)
2662 return &pi->fpregset; /* Already got 'em. */
2665 if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2674 tid_t pr_error_thread;
2675 tfpregset_t thread_1;
2678 thread_fpregs.pr_count = 1;
2679 thread_fpregs.thread_1.tid = pi->tid;
2682 && ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset) >= 0)
2684 pi->fpregs_valid = 1;
2685 return &pi->fpregset; /* Got 'em now! */
2687 else if (pi->tid != 0
2688 && ioctl (pi->ctl_fd, PIOCTGFPREG, &thread_fpregs) >= 0)
2690 memcpy (&pi->fpregset, &thread_fpregs.thread_1.pr_fpregs,
2691 sizeof (pi->fpregset));
2692 pi->fpregs_valid = 1;
2693 return &pi->fpregset; /* Got 'em now! */
2700 if (ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset) >= 0)
2702 pi->fpregs_valid = 1;
2703 return &pi->fpregset; /* Got 'em now! */
2712 #endif /* NEW_PROC_API */
2715 /* Write the general-purpose registers back to the process or LWP
2716 corresponding to PI. Return non-zero for success, zero for
2720 proc_set_gregs (procinfo *pi)
2722 gdb_gregset_t *gregs;
2725 gregs = proc_get_gregs (pi);
2727 return 0; /* proc_get_regs has already warned. */
2729 if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2738 /* Use char array to avoid alignment issues. */
2739 char gregs[sizeof (gdb_gregset_t)];
2743 memcpy (&arg.gregs, gregs, sizeof (arg.gregs));
2744 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2746 win = (ioctl (pi->ctl_fd, PIOCSREG, gregs) >= 0);
2750 /* Policy: writing the registers invalidates our cache. */
2751 pi->gregs_valid = 0;
2755 /* Write the floating-pointer registers back to the process or LWP
2756 corresponding to PI. Return non-zero for success, zero for
2760 proc_set_fpregs (procinfo *pi)
2762 gdb_fpregset_t *fpregs;
2765 fpregs = proc_get_fpregs (pi);
2767 return 0; /* proc_get_fpregs has already warned. */
2769 if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2778 /* Use char array to avoid alignment issues. */
2779 char fpregs[sizeof (gdb_fpregset_t)];
2783 memcpy (&arg.fpregs, fpregs, sizeof (arg.fpregs));
2784 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2788 win = (ioctl (pi->ctl_fd, PIOCSFPREG, fpregs) >= 0);
2793 tid_t pr_error_thread;
2794 tfpregset_t thread_1;
2797 thread_fpregs.pr_count = 1;
2798 thread_fpregs.thread_1.tid = pi->tid;
2799 memcpy (&thread_fpregs.thread_1.pr_fpregs, fpregs,
2801 win = (ioctl (pi->ctl_fd, PIOCTSFPREG, &thread_fpregs) >= 0);
2804 win = (ioctl (pi->ctl_fd, PIOCSFPREG, fpregs) >= 0);
2806 #endif /* NEW_PROC_API */
2809 /* Policy: writing the registers invalidates our cache. */
2810 pi->fpregs_valid = 0;
2815 * Function: proc_kill
2817 * Send a signal to the proc or lwp with the semantics of "kill()".
2818 * Returns non-zero for success, zero for failure.
2822 proc_kill (procinfo *pi, int signo)
2827 * We might conceivably apply this operation to an LWP, and
2828 * the LWP's ctl file descriptor might not be open.
2831 if (pi->ctl_fd == 0 &&
2832 open_procinfo_files (pi, FD_CTL) == 0)
2839 procfs_ctl_t cmd[2];
2843 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
2844 #else /* ioctl method */
2845 /* FIXME: do I need the Alpha OSF fixups present in
2846 procfs.c/unconditionally_kill_inferior? Perhaps only for SIGKILL? */
2847 win = (ioctl (pi->ctl_fd, PIOCKILL, &signo) >= 0);
2855 * Function: proc_parent_pid
2857 * Find the pid of the process that started this one.
2858 * Returns the parent process pid, or zero.
2862 proc_parent_pid (procinfo *pi)
2865 * We should never have to apply this operation to any procinfo
2866 * except the one for the main process. If that ever changes
2867 * for any reason, then take out the following clause and
2868 * replace it with one that makes sure the ctl_fd is open.
2872 pi = find_procinfo_or_die (pi->pid, 0);
2874 if (!pi->status_valid)
2875 if (!proc_get_status (pi))
2878 return pi->prstatus.pr_ppid;
2882 /* Convert a target address (a.k.a. CORE_ADDR) into a host address
2883 (a.k.a void pointer)! */
2886 procfs_address_to_host_pointer (CORE_ADDR addr)
2888 struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
2891 gdb_assert (sizeof (ptr) == TYPE_LENGTH (ptr_type));
2892 gdbarch_address_to_pointer (target_gdbarch, ptr_type,
2893 (gdb_byte *) &ptr, addr);
2898 * Function: proc_set_watchpoint
2903 proc_set_watchpoint (procinfo *pi, CORE_ADDR addr, int len, int wflags)
2905 #if !defined (PCWATCH) && !defined (PIOCSWATCH)
2906 /* If neither or these is defined, we can't support watchpoints.
2907 This just avoids possibly failing to compile the below on such
2911 /* Horrible hack! Detect Solaris 2.5, because this doesn't work on 2.5 */
2912 #if defined (PIOCOPENLWP) || defined (UNIXWARE) /* Solaris 2.5: bail out */
2917 char watch[sizeof (prwatch_t)];
2921 pwatch = (prwatch_t *) &arg.watch;
2922 /* NOTE: cagney/2003-02-01: Even more horrible hack. Need to
2923 convert a target address into something that can be stored in a
2924 native data structure. */
2925 #ifdef PCAGENT /* Horrible hack: only defined on Solaris 2.6+ */
2926 pwatch->pr_vaddr = (uintptr_t) procfs_address_to_host_pointer (addr);
2928 pwatch->pr_vaddr = (caddr_t) procfs_address_to_host_pointer (addr);
2930 pwatch->pr_size = len;
2931 pwatch->pr_wflags = wflags;
2932 #if defined(NEW_PROC_API) && defined (PCWATCH)
2934 return (write (pi->ctl_fd, &arg, sizeof (arg)) == sizeof (arg));
2936 #if defined (PIOCSWATCH)
2937 return (ioctl (pi->ctl_fd, PIOCSWATCH, pwatch) >= 0);
2939 return 0; /* Fail */
2946 #if (defined(__i386__) || defined(__x86_64__)) && defined (sun)
2948 #include <sys/sysi86.h>
2951 * Function: proc_get_LDT_entry
2957 * The 'key' is actually the value of the lower 16 bits of
2958 * the GS register for the LWP that we're interested in.
2960 * Return: matching ssh struct (LDT entry).
2964 proc_get_LDT_entry (procinfo *pi, int key)
2966 static struct ssd *ldt_entry = NULL;
2968 char pathname[MAX_PROC_NAME_SIZE];
2969 struct cleanup *old_chain = NULL;
2972 /* Allocate space for one LDT entry.
2973 This alloc must persist, because we return a pointer to it. */
2974 if (ldt_entry == NULL)
2975 ldt_entry = (struct ssd *) xmalloc (sizeof (struct ssd));
2977 /* Open the file descriptor for the LDT table. */
2978 sprintf (pathname, "/proc/%d/ldt", pi->pid);
2979 if ((fd = open_with_retry (pathname, O_RDONLY)) < 0)
2981 proc_warn (pi, "proc_get_LDT_entry (open)", __LINE__);
2984 /* Make sure it gets closed again! */
2985 old_chain = make_cleanup_close (fd);
2987 /* Now 'read' thru the table, find a match and return it. */
2988 while (read (fd, ldt_entry, sizeof (struct ssd)) == sizeof (struct ssd))
2990 if (ldt_entry->sel == 0 &&
2991 ldt_entry->bo == 0 &&
2992 ldt_entry->acc1 == 0 &&
2993 ldt_entry->acc2 == 0)
2994 break; /* end of table */
2995 /* If key matches, return this entry. */
2996 if (ldt_entry->sel == key)
2999 /* Loop ended, match not found. */
3003 static int nalloc = 0;
3005 /* Get the number of LDT entries. */
3006 if (ioctl (pi->ctl_fd, PIOCNLDT, &nldt) < 0)
3008 proc_warn (pi, "proc_get_LDT_entry (PIOCNLDT)", __LINE__);
3012 /* Allocate space for the number of LDT entries. */
3013 /* This alloc has to persist, 'cause we return a pointer to it. */
3016 ldt_entry = (struct ssd *)
3017 xrealloc (ldt_entry, (nldt + 1) * sizeof (struct ssd));
3021 /* Read the whole table in one gulp. */
3022 if (ioctl (pi->ctl_fd, PIOCLDT, ldt_entry) < 0)
3024 proc_warn (pi, "proc_get_LDT_entry (PIOCLDT)", __LINE__);
3028 /* Search the table and return the (first) entry matching 'key'. */
3029 for (i = 0; i < nldt; i++)
3030 if (ldt_entry[i].sel == key)
3031 return &ldt_entry[i];
3033 /* Loop ended, match not found. */
3039 * Function: procfs_find_LDT_entry
3042 * ptid_t ptid; // The GDB-style pid-plus-LWP.
3045 * pointer to the corresponding LDT entry.
3049 procfs_find_LDT_entry (ptid_t ptid)
3051 gdb_gregset_t *gregs;
3055 /* Find procinfo for the lwp. */
3056 if ((pi = find_procinfo (PIDGET (ptid), TIDGET (ptid))) == NULL)
3058 warning (_("procfs_find_LDT_entry: could not find procinfo for %d:%ld."),
3059 PIDGET (ptid), TIDGET (ptid));
3062 /* get its general registers. */
3063 if ((gregs = proc_get_gregs (pi)) == NULL)
3065 warning (_("procfs_find_LDT_entry: could not read gregs for %d:%ld."),
3066 PIDGET (ptid), TIDGET (ptid));
3069 /* Now extract the GS register's lower 16 bits. */
3070 key = (*gregs)[GS] & 0xffff;
3072 /* Find the matching entry and return it. */
3073 return proc_get_LDT_entry (pi, key);
3078 /* =============== END, non-thread part of /proc "MODULE" =============== */
3080 /* =================== Thread "MODULE" =================== */
3082 /* NOTE: you'll see more ifdefs and duplication of functions here,
3083 since there is a different way to do threads on every OS. */
3086 * Function: proc_get_nthreads
3088 * Return the number of threads for the process
3091 #if defined (PIOCNTHR) && defined (PIOCTLIST)
3096 proc_get_nthreads (procinfo *pi)
3100 if (ioctl (pi->ctl_fd, PIOCNTHR, &nthreads) < 0)
3101 proc_warn (pi, "procfs: PIOCNTHR failed", __LINE__);
3107 #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */
3109 * Solaris and Unixware version
3112 proc_get_nthreads (procinfo *pi)
3114 if (!pi->status_valid)
3115 if (!proc_get_status (pi))
3119 * NEW_PROC_API: only works for the process procinfo,
3120 * because the LWP procinfos do not get prstatus filled in.
3123 if (pi->tid != 0) /* find the parent process procinfo */
3124 pi = find_procinfo_or_die (pi->pid, 0);
3126 return pi->prstatus.pr_nlwp;
3134 proc_get_nthreads (procinfo *pi)
3142 * Function: proc_get_current_thread (LWP version)
3144 * Return the ID of the thread that had an event of interest.
3145 * (ie. the one that hit a breakpoint or other traced event).
3146 * All other things being equal, this should be the ID of a
3147 * thread that is currently executing.
3150 #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */
3152 * Solaris and Unixware version
3155 proc_get_current_thread (procinfo *pi)
3158 * Note: this should be applied to the root procinfo for the process,
3159 * not to the procinfo for an LWP. If applied to the procinfo for
3160 * an LWP, it will simply return that LWP's ID. In that case,
3161 * find the parent process procinfo.
3165 pi = find_procinfo_or_die (pi->pid, 0);
3167 if (!pi->status_valid)
3168 if (!proc_get_status (pi))
3172 return pi->prstatus.pr_lwp.pr_lwpid;
3174 return pi->prstatus.pr_who;
3179 #if defined (PIOCNTHR) && defined (PIOCTLIST)
3184 proc_get_current_thread (procinfo *pi)
3186 #if 0 /* FIXME: not ready for prime time? */
3187 return pi->prstatus.pr_tid;
3198 proc_get_current_thread (procinfo *pi)
3207 * Function: proc_update_threads
3209 * Discover the IDs of all the threads within the process, and
3210 * create a procinfo for each of them (chained to the parent).
3212 * This unfortunately requires a different method on every OS.
3214 * Return: non-zero for success, zero for failure.
3218 proc_delete_dead_threads (procinfo *parent, procinfo *thread, void *ignore)
3220 if (thread && parent) /* sanity */
3222 thread->status_valid = 0;
3223 if (!proc_get_status (thread))
3224 destroy_one_procinfo (&parent->thread_list, thread);
3226 return 0; /* keep iterating */
3229 #if defined (PIOCLSTATUS)
3231 * Solaris 2.5 (ioctl) version
3234 proc_update_threads (procinfo *pi)
3236 gdb_prstatus_t *prstatus;
3237 struct cleanup *old_chain = NULL;
3242 * We should never have to apply this operation to any procinfo
3243 * except the one for the main process. If that ever changes
3244 * for any reason, then take out the following clause and
3245 * replace it with one that makes sure the ctl_fd is open.
3249 pi = find_procinfo_or_die (pi->pid, 0);
3251 proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3253 if ((nlwp = proc_get_nthreads (pi)) <= 1)
3254 return 1; /* Process is not multi-threaded; nothing to do. */
3256 prstatus = xmalloc (sizeof (gdb_prstatus_t) * (nlwp + 1));
3258 old_chain = make_cleanup (xfree, prstatus);
3259 if (ioctl (pi->ctl_fd, PIOCLSTATUS, prstatus) < 0)
3260 proc_error (pi, "update_threads (PIOCLSTATUS)", __LINE__);
3262 /* Skip element zero, which represents the process as a whole. */
3263 for (i = 1; i < nlwp + 1; i++)
3265 if ((thread = create_procinfo (pi->pid, prstatus[i].pr_who)) == NULL)
3266 proc_error (pi, "update_threads, create_procinfo", __LINE__);
3268 memcpy (&thread->prstatus, &prstatus[i], sizeof (*prstatus));
3269 thread->status_valid = 1;
3271 pi->threads_valid = 1;
3272 do_cleanups (old_chain);
3278 * Unixware and Solaris 6 (and later) version
3281 do_closedir_cleanup (void *dir)
3287 proc_update_threads (procinfo *pi)
3289 char pathname[MAX_PROC_NAME_SIZE + 16];
3290 struct dirent *direntry;
3291 struct cleanup *old_chain = NULL;
3297 * We should never have to apply this operation to any procinfo
3298 * except the one for the main process. If that ever changes
3299 * for any reason, then take out the following clause and
3300 * replace it with one that makes sure the ctl_fd is open.
3304 pi = find_procinfo_or_die (pi->pid, 0);
3306 proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3311 * Note: this brute-force method is the only way I know of
3312 * to accomplish this task on Unixware. This method will
3313 * also work on Solaris 2.6 and 2.7. There is a much simpler
3314 * and more elegant way to do this on Solaris, but the margins
3315 * of this manuscript are too small to write it here... ;-)
3318 strcpy (pathname, pi->pathname);
3319 strcat (pathname, "/lwp");
3320 if ((dirp = opendir (pathname)) == NULL)
3321 proc_error (pi, "update_threads, opendir", __LINE__);
3323 old_chain = make_cleanup (do_closedir_cleanup, dirp);
3324 while ((direntry = readdir (dirp)) != NULL)
3325 if (direntry->d_name[0] != '.') /* skip '.' and '..' */
3327 lwpid = atoi (&direntry->d_name[0]);
3328 if ((thread = create_procinfo (pi->pid, lwpid)) == NULL)
3329 proc_error (pi, "update_threads, create_procinfo", __LINE__);
3331 pi->threads_valid = 1;
3332 do_cleanups (old_chain);
3341 proc_update_threads (procinfo *pi)
3347 * We should never have to apply this operation to any procinfo
3348 * except the one for the main process. If that ever changes
3349 * for any reason, then take out the following clause and
3350 * replace it with one that makes sure the ctl_fd is open.
3354 pi = find_procinfo_or_die (pi->pid, 0);
3356 proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3358 nthreads = proc_get_nthreads (pi);
3360 return 0; /* nothing to do for 1 or fewer threads */
3362 threads = xmalloc (nthreads * sizeof (tid_t));
3364 if (ioctl (pi->ctl_fd, PIOCTLIST, threads) < 0)
3365 proc_error (pi, "procfs: update_threads (PIOCTLIST)", __LINE__);
3367 for (i = 0; i < nthreads; i++)
3369 if (!find_procinfo (pi->pid, threads[i]))
3370 if (!create_procinfo (pi->pid, threads[i]))
3371 proc_error (pi, "update_threads, create_procinfo", __LINE__);
3373 pi->threads_valid = 1;
3381 proc_update_threads (procinfo *pi)
3385 #endif /* OSF PIOCTLIST */
3386 #endif /* NEW_PROC_API */
3387 #endif /* SOL 2.5 PIOCLSTATUS */
3390 * Function: proc_iterate_over_threads
3393 * Given a pointer to a function, call that function once
3394 * for each lwp in the procinfo list, until the function
3395 * returns non-zero, in which event return the value
3396 * returned by the function.
3398 * Note: this function does NOT call update_threads.
3399 * If you want to discover new threads first, you must
3400 * call that function explicitly. This function just makes
3401 * a quick pass over the currently-known procinfos.
3404 * pi - parent process procinfo
3405 * func - per-thread function
3406 * ptr - opaque parameter for function.
3409 * First non-zero return value from the callee, or zero.
3413 proc_iterate_over_threads (procinfo *pi,
3414 int (*func) (procinfo *, procinfo *, void *),
3417 procinfo *thread, *next;
3421 * We should never have to apply this operation to any procinfo
3422 * except the one for the main process. If that ever changes
3423 * for any reason, then take out the following clause and
3424 * replace it with one that makes sure the ctl_fd is open.
3428 pi = find_procinfo_or_die (pi->pid, 0);
3430 for (thread = pi->thread_list; thread != NULL; thread = next)
3432 next = thread->next; /* in case thread is destroyed */
3433 if ((retval = (*func) (pi, thread, ptr)) != 0)
3440 /* =================== END, Thread "MODULE" =================== */
3442 /* =================== END, /proc "MODULE" =================== */
3444 /* =================== GDB "MODULE" =================== */
3447 * Here are all of the gdb target vector functions and their friends.
3450 static ptid_t do_attach (ptid_t ptid);
3451 static void do_detach (int signo);
3452 static int register_gdb_signals (procinfo *, gdb_sigset_t *);
3453 static void proc_trace_syscalls_1 (procinfo *pi, int syscallnum,
3454 int entry_or_exit, int mode, int from_tty);
3455 static int insert_dbx_link_breakpoint (procinfo *pi);
3456 static void remove_dbx_link_breakpoint (void);
3458 /* On mips-irix, we need to insert a breakpoint at __dbx_link during
3459 the startup phase. The following two variables are used to record
3460 the address of the breakpoint, and the code that was replaced by
3462 static int dbx_link_bpt_addr = 0;
3463 static void *dbx_link_bpt;
3466 * Function: procfs_debug_inferior
3468 * Sets up the inferior to be debugged.
3469 * Registers to trace signals, hardware faults, and syscalls.
3470 * Note: does not set RLC flag: caller may want to customize that.
3472 * Returns: zero for success (note! unlike most functions in this module)
3473 * On failure, returns the LINE NUMBER where it failed!
3477 procfs_debug_inferior (procinfo *pi)
3479 fltset_t traced_faults;
3480 gdb_sigset_t traced_signals;
3481 sysset_t *traced_syscall_entries;
3482 sysset_t *traced_syscall_exits;
3485 #ifdef PROCFS_DONT_TRACE_FAULTS
3486 /* On some systems (OSF), we don't trace hardware faults.
3487 Apparently it's enough that we catch them as signals.
3488 Wonder why we don't just do that in general? */
3489 premptyset (&traced_faults); /* don't trace faults. */
3491 /* Register to trace hardware faults in the child. */
3492 prfillset (&traced_faults); /* trace all faults... */
3493 prdelset (&traced_faults, FLTPAGE); /* except page fault. */
3495 if (!proc_set_traced_faults (pi, &traced_faults))
3498 /* Register to trace selected signals in the child. */
3499 premptyset (&traced_signals);
3500 if (!register_gdb_signals (pi, &traced_signals))
3504 /* Register to trace the 'exit' system call (on entry). */
3505 traced_syscall_entries = sysset_t_alloc (pi);
3506 gdb_premptysysset (traced_syscall_entries);
3508 gdb_praddsysset (traced_syscall_entries, SYS_exit);
3511 gdb_praddsysset (traced_syscall_entries, SYS_lwpexit); /* And _lwp_exit... */
3514 gdb_praddsysset (traced_syscall_entries, SYS_lwp_exit);
3516 #ifdef DYNAMIC_SYSCALLS
3518 int callnum = find_syscall (pi, "_exit");
3520 gdb_praddsysset (traced_syscall_entries, callnum);
3524 status = proc_set_traced_sysentry (pi, traced_syscall_entries);
3525 xfree (traced_syscall_entries);
3529 #ifdef PRFS_STOPEXEC /* defined on OSF */
3530 /* OSF method for tracing exec syscalls. Quoting:
3531 Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
3532 exits from exec system calls because of the user level loader. */
3533 /* FIXME: make nice and maybe move into an access function. */
3537 if (ioctl (pi->ctl_fd, PIOCGSPCACT, &prfs_flags) < 0)
3540 prfs_flags |= PRFS_STOPEXEC;
3542 if (ioctl (pi->ctl_fd, PIOCSSPCACT, &prfs_flags) < 0)
3545 #else /* not PRFS_STOPEXEC */
3546 /* Everyone else's (except OSF) method for tracing exec syscalls */
3548 Not all systems with /proc have all the exec* syscalls with the same
3549 names. On the SGI, for example, there is no SYS_exec, but there
3550 *is* a SYS_execv. So, we try to account for that. */
3552 traced_syscall_exits = sysset_t_alloc (pi);
3553 gdb_premptysysset (traced_syscall_exits);
3555 gdb_praddsysset (traced_syscall_exits, SYS_exec);
3558 gdb_praddsysset (traced_syscall_exits, SYS_execve);
3561 gdb_praddsysset (traced_syscall_exits, SYS_execv);
3564 #ifdef SYS_lwpcreate
3565 gdb_praddsysset (traced_syscall_exits, SYS_lwpcreate);
3566 gdb_praddsysset (traced_syscall_exits, SYS_lwpexit);
3569 #ifdef SYS_lwp_create /* FIXME: once only, please */
3570 gdb_praddsysset (traced_syscall_exits, SYS_lwp_create);
3571 gdb_praddsysset (traced_syscall_exits, SYS_lwp_exit);
3574 #ifdef DYNAMIC_SYSCALLS
3576 int callnum = find_syscall (pi, "execve");
3578 gdb_praddsysset (traced_syscall_exits, callnum);
3579 callnum = find_syscall (pi, "ra_execve");
3581 gdb_praddsysset (traced_syscall_exits, callnum);
3585 status = proc_set_traced_sysexit (pi, traced_syscall_exits);
3586 xfree (traced_syscall_exits);
3590 #endif /* PRFS_STOPEXEC */
3595 procfs_attach (struct target_ops *ops, char *args, int from_tty)
3601 error_no_arg (_("process-id to attach"));
3604 if (pid == getpid ())
3605 error (_("Attaching GDB to itself is not a good idea..."));
3609 exec_file = get_exec_file (0);
3612 printf_filtered (_("Attaching to program `%s', %s\n"),
3613 exec_file, target_pid_to_str (pid_to_ptid (pid)));
3615 printf_filtered (_("Attaching to %s\n"),
3616 target_pid_to_str (pid_to_ptid (pid)));
3620 inferior_ptid = do_attach (pid_to_ptid (pid));
3625 procfs_detach (struct target_ops *ops, char *args, int from_tty)
3628 int pid = PIDGET (inferior_ptid);
3637 exec_file = get_exec_file (0);
3638 if (exec_file == NULL)
3641 printf_filtered (_("Detaching from program: %s, %s\n"), exec_file,
3642 target_pid_to_str (pid_to_ptid (pid)));
3643 gdb_flush (gdb_stdout);
3648 inferior_ptid = null_ptid;
3649 detach_inferior (pid);
3650 unpush_target (ops);
3654 do_attach (ptid_t ptid)
3657 struct inferior *inf;
3661 if ((pi = create_procinfo (PIDGET (ptid), 0)) == NULL)
3662 perror (_("procfs: out of memory in 'attach'"));
3664 if (!open_procinfo_files (pi, FD_CTL))
3666 fprintf_filtered (gdb_stderr, "procfs:%d -- ", __LINE__);
3667 sprintf (errmsg, "do_attach: couldn't open /proc file for process %d",
3669 dead_procinfo (pi, errmsg, NOKILL);
3672 /* Stop the process (if it isn't already stopped). */
3673 if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
3675 pi->was_stopped = 1;
3676 proc_prettyprint_why (proc_why (pi), proc_what (pi), 1);
3680 pi->was_stopped = 0;
3681 /* Set the process to run again when we close it. */
3682 if (!proc_set_run_on_last_close (pi))
3683 dead_procinfo (pi, "do_attach: couldn't set RLC.", NOKILL);
3685 /* Now stop the process. */
3686 if (!proc_stop_process (pi))
3687 dead_procinfo (pi, "do_attach: couldn't stop the process.", NOKILL);
3688 pi->ignore_next_sigstop = 1;
3690 /* Save some of the /proc state to be restored if we detach. */
3691 if (!proc_get_traced_faults (pi, &pi->saved_fltset))
3692 dead_procinfo (pi, "do_attach: couldn't save traced faults.", NOKILL);
3693 if (!proc_get_traced_signals (pi, &pi->saved_sigset))
3694 dead_procinfo (pi, "do_attach: couldn't save traced signals.", NOKILL);
3695 if (!proc_get_traced_sysentry (pi, pi->saved_entryset))
3696 dead_procinfo (pi, "do_attach: couldn't save traced syscall entries.",
3698 if (!proc_get_traced_sysexit (pi, pi->saved_exitset))
3699 dead_procinfo (pi, "do_attach: couldn't save traced syscall exits.",
3701 if (!proc_get_held_signals (pi, &pi->saved_sighold))
3702 dead_procinfo (pi, "do_attach: couldn't save held signals.", NOKILL);
3704 if ((fail = procfs_debug_inferior (pi)) != 0)
3705 dead_procinfo (pi, "do_attach: failed in procfs_debug_inferior", NOKILL);
3707 inf = add_inferior (pi->pid);
3708 /* Let GDB know that the inferior was attached. */
3709 inf->attach_flag = 1;
3711 /* Create a procinfo for the current lwp. */
3712 lwpid = proc_get_current_thread (pi);
3713 create_procinfo (pi->pid, lwpid);
3715 /* Add it to gdb's thread list. */
3716 ptid = MERGEPID (pi->pid, lwpid);
3723 do_detach (int signo)
3727 /* Find procinfo for the main process */
3728 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); /* FIXME: threads */
3730 if (!proc_set_current_signal (pi, signo))
3731 proc_warn (pi, "do_detach, set_current_signal", __LINE__);
3733 if (!proc_set_traced_signals (pi, &pi->saved_sigset))
3734 proc_warn (pi, "do_detach, set_traced_signal", __LINE__);
3736 if (!proc_set_traced_faults (pi, &pi->saved_fltset))
3737 proc_warn (pi, "do_detach, set_traced_faults", __LINE__);
3739 if (!proc_set_traced_sysentry (pi, pi->saved_entryset))
3740 proc_warn (pi, "do_detach, set_traced_sysentry", __LINE__);
3742 if (!proc_set_traced_sysexit (pi, pi->saved_exitset))
3743 proc_warn (pi, "do_detach, set_traced_sysexit", __LINE__);
3745 if (!proc_set_held_signals (pi, &pi->saved_sighold))
3746 proc_warn (pi, "do_detach, set_held_signals", __LINE__);
3748 if (signo || (proc_flags (pi) & (PR_STOPPED | PR_ISTOP)))
3749 if (signo || !(pi->was_stopped) ||
3750 query (_("Was stopped when attached, make it runnable again? ")))
3752 /* Clear any pending signal. */
3753 if (!proc_clear_current_fault (pi))
3754 proc_warn (pi, "do_detach, clear_current_fault", __LINE__);
3756 if (signo == 0 && !proc_clear_current_signal (pi))
3757 proc_warn (pi, "do_detach, clear_current_signal", __LINE__);
3759 if (!proc_set_run_on_last_close (pi))
3760 proc_warn (pi, "do_detach, set_rlc", __LINE__);
3763 destroy_procinfo (pi);
3766 /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
3769 ??? Is the following note still relevant? We can't get individual
3770 registers with the PT_GETREGS ptrace(2) request either, yet we
3771 don't bother with caching at all in that case.
3773 NOTE: Since the /proc interface cannot give us individual
3774 registers, we pay no attention to REGNUM, and just fetch them all.
3775 This results in the possibility that we will do unnecessarily many
3776 fetches, since we may be called repeatedly for individual
3777 registers. So we cache the results, and mark the cache invalid
3778 when the process is resumed. */
3781 procfs_fetch_registers (struct target_ops *ops,
3782 struct regcache *regcache, int regnum)
3784 gdb_gregset_t *gregs;
3786 int pid = PIDGET (inferior_ptid);
3787 int tid = TIDGET (inferior_ptid);
3788 struct gdbarch *gdbarch = get_regcache_arch (regcache);
3790 pi = find_procinfo_or_die (pid, tid);
3793 error (_("procfs: fetch_registers failed to find procinfo for %s"),
3794 target_pid_to_str (inferior_ptid));
3796 gregs = proc_get_gregs (pi);
3798 proc_error (pi, "fetch_registers, get_gregs", __LINE__);
3800 supply_gregset (regcache, (const gdb_gregset_t *) gregs);
3802 if (gdbarch_fp0_regnum (gdbarch) >= 0) /* Do we have an FPU? */
3804 gdb_fpregset_t *fpregs;
3806 if ((regnum >= 0 && regnum < gdbarch_fp0_regnum (gdbarch))
3807 || regnum == gdbarch_pc_regnum (gdbarch)
3808 || regnum == gdbarch_sp_regnum (gdbarch))
3809 return; /* Not a floating point register. */
3811 fpregs = proc_get_fpregs (pi);
3813 proc_error (pi, "fetch_registers, get_fpregs", __LINE__);
3815 supply_fpregset (regcache, (const gdb_fpregset_t *) fpregs);
3819 /* Store register REGNUM back into the inferior. If REGNUM is -1, do
3820 this for all registers.
3822 NOTE: Since the /proc interface will not read individual registers,
3823 we will cache these requests until the process is resumed, and only
3824 then write them back to the inferior process.
3826 FIXME: is that a really bad idea? Have to think about cases where
3827 writing one register might affect the value of others, etc. */
3830 procfs_store_registers (struct target_ops *ops,
3831 struct regcache *regcache, int regnum)
3833 gdb_gregset_t *gregs;
3835 int pid = PIDGET (inferior_ptid);
3836 int tid = TIDGET (inferior_ptid);
3837 struct gdbarch *gdbarch = get_regcache_arch (regcache);
3839 pi = find_procinfo_or_die (pid, tid);
3842 error (_("procfs: store_registers: failed to find procinfo for %s"),
3843 target_pid_to_str (inferior_ptid));
3845 gregs = proc_get_gregs (pi);
3847 proc_error (pi, "store_registers, get_gregs", __LINE__);
3849 fill_gregset (regcache, gregs, regnum);
3850 if (!proc_set_gregs (pi))
3851 proc_error (pi, "store_registers, set_gregs", __LINE__);
3853 if (gdbarch_fp0_regnum (gdbarch) >= 0) /* Do we have an FPU? */
3855 gdb_fpregset_t *fpregs;
3857 if ((regnum >= 0 && regnum < gdbarch_fp0_regnum (gdbarch))
3858 || regnum == gdbarch_pc_regnum (gdbarch)
3859 || regnum == gdbarch_sp_regnum (gdbarch))
3860 return; /* Not a floating point register. */
3862 fpregs = proc_get_fpregs (pi);
3864 proc_error (pi, "store_registers, get_fpregs", __LINE__);
3866 fill_fpregset (regcache, fpregs, regnum);
3867 if (!proc_set_fpregs (pi))
3868 proc_error (pi, "store_registers, set_fpregs", __LINE__);
3873 syscall_is_lwp_exit (procinfo *pi, int scall)
3877 if (scall == SYS_lwp_exit)
3881 if (scall == SYS_lwpexit)
3888 syscall_is_exit (procinfo *pi, int scall)
3891 if (scall == SYS_exit)
3894 #ifdef DYNAMIC_SYSCALLS
3895 if (find_syscall (pi, "_exit") == scall)
3902 syscall_is_exec (procinfo *pi, int scall)
3905 if (scall == SYS_exec)
3909 if (scall == SYS_execv)
3913 if (scall == SYS_execve)
3916 #ifdef DYNAMIC_SYSCALLS
3917 if (find_syscall (pi, "_execve"))
3919 if (find_syscall (pi, "ra_execve"))
3926 syscall_is_lwp_create (procinfo *pi, int scall)
3928 #ifdef SYS_lwp_create
3929 if (scall == SYS_lwp_create)
3932 #ifdef SYS_lwpcreate
3933 if (scall == SYS_lwpcreate)
3940 * Function: target_wait
3942 * Retrieve the next stop event from the child process.
3943 * If child has not stopped yet, wait for it to stop.
3944 * Translate /proc eventcodes (or possibly wait eventcodes)
3945 * into gdb internal event codes.
3947 * Return: id of process (and possibly thread) that incurred the event.
3948 * event codes are returned thru a pointer parameter.
3952 procfs_wait (struct target_ops *ops,
3953 ptid_t ptid, struct target_waitstatus *status, int options)
3955 /* First cut: loosely based on original version 2.1 */
3959 ptid_t retval, temp_ptid;
3960 int why, what, flags;
3967 retval = pid_to_ptid (-1);
3969 /* Find procinfo for main process */
3970 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
3973 /* We must assume that the status is stale now... */
3974 pi->status_valid = 0;
3975 pi->gregs_valid = 0;
3976 pi->fpregs_valid = 0;
3978 #if 0 /* just try this out... */
3979 flags = proc_flags (pi);
3980 why = proc_why (pi);
3981 if ((flags & PR_STOPPED) && (why == PR_REQUESTED))
3982 pi->status_valid = 0; /* re-read again, IMMEDIATELY... */
3984 /* If child is not stopped, wait for it to stop. */
3985 if (!(proc_flags (pi) & (PR_STOPPED | PR_ISTOP)) &&
3986 !proc_wait_for_stop (pi))
3988 /* wait_for_stop failed: has the child terminated? */
3989 if (errno == ENOENT)
3993 /* /proc file not found; presumably child has terminated. */
3994 wait_retval = wait (&wstat); /* "wait" for the child's exit */
3996 if (wait_retval != PIDGET (inferior_ptid)) /* wrong child? */
3997 error (_("procfs: couldn't stop process %d: wait returned %d."),
3998 PIDGET (inferior_ptid), wait_retval);
3999 /* FIXME: might I not just use waitpid?
4000 Or try find_procinfo to see if I know about this child? */
4001 retval = pid_to_ptid (wait_retval);
4003 else if (errno == EINTR)
4007 /* Unknown error from wait_for_stop. */
4008 proc_error (pi, "target_wait (wait_for_stop)", __LINE__);
4013 /* This long block is reached if either:
4014 a) the child was already stopped, or
4015 b) we successfully waited for the child with wait_for_stop.
4016 This block will analyze the /proc status, and translate it
4017 into a waitstatus for GDB.
4019 If we actually had to call wait because the /proc file
4020 is gone (child terminated), then we skip this block,
4021 because we already have a waitstatus. */
4023 flags = proc_flags (pi);
4024 why = proc_why (pi);
4025 what = proc_what (pi);
4027 if (flags & (PR_STOPPED | PR_ISTOP))
4030 /* If it's running async (for single_thread control),
4031 set it back to normal again. */
4032 if (flags & PR_ASYNC)
4033 if (!proc_unset_async (pi))
4034 proc_error (pi, "target_wait, unset_async", __LINE__);
4038 proc_prettyprint_why (why, what, 1);
4040 /* The 'pid' we will return to GDB is composed of
4041 the process ID plus the lwp ID. */
4042 retval = MERGEPID (pi->pid, proc_get_current_thread (pi));
4046 wstat = (what << 8) | 0177;
4049 if (syscall_is_lwp_exit (pi, what))
4051 if (print_thread_events)
4052 printf_unfiltered (_("[%s exited]\n"),
4053 target_pid_to_str (retval));
4054 delete_thread (retval);
4055 status->kind = TARGET_WAITKIND_SPURIOUS;
4058 else if (syscall_is_exit (pi, what))
4060 struct inferior *inf;
4062 /* Handle SYS_exit call only */
4063 /* Stopped at entry to SYS_exit.
4064 Make it runnable, resume it, then use
4065 the wait system call to get its exit code.
4066 Proc_run_process always clears the current
4068 Then return its exit status. */
4069 pi->status_valid = 0;
4071 /* FIXME: what we should do is return
4072 TARGET_WAITKIND_SPURIOUS. */
4073 if (!proc_run_process (pi, 0, 0))
4074 proc_error (pi, "target_wait, run_process", __LINE__);
4076 inf = find_inferior_pid (pi->pid);
4077 if (inf->attach_flag)
4079 /* Don't call wait: simulate waiting for exit,
4080 return a "success" exit code. Bogus: what if
4081 it returns something else? */
4083 retval = inferior_ptid; /* ? ? ? */
4087 int temp = wait (&wstat);
4089 /* FIXME: shouldn't I make sure I get the right
4090 event from the right process? If (for
4091 instance) I have killed an earlier inferior
4092 process but failed to clean up after it
4093 somehow, I could get its termination event
4096 /* If wait returns -1, that's what we return to GDB. */
4098 retval = pid_to_ptid (temp);
4103 printf_filtered (_("procfs: trapped on entry to "));
4104 proc_prettyprint_syscall (proc_what (pi), 0);
4105 printf_filtered ("\n");
4108 long i, nsysargs, *sysargs;
4110 if ((nsysargs = proc_nsysarg (pi)) > 0 &&
4111 (sysargs = proc_sysargs (pi)) != NULL)
4113 printf_filtered (_("%ld syscall arguments:\n"), nsysargs);
4114 for (i = 0; i < nsysargs; i++)
4115 printf_filtered ("#%ld: 0x%08lx\n",
4123 /* How to exit gracefully, returning "unknown event" */
4124 status->kind = TARGET_WAITKIND_SPURIOUS;
4125 return inferior_ptid;
4129 /* How to keep going without returning to wfi: */
4130 target_resume (ptid, 0, TARGET_SIGNAL_0);
4136 if (syscall_is_exec (pi, what))
4138 /* Hopefully this is our own "fork-child" execing
4139 the real child. Hoax this event into a trap, and
4140 GDB will see the child about to execute its start
4142 wstat = (SIGTRAP << 8) | 0177;
4145 else if (what == SYS_syssgi)
4147 /* see if we can break on dbx_link(). If yes, then
4148 we no longer need the SYS_syssgi notifications. */
4149 if (insert_dbx_link_breakpoint (pi))
4150 proc_trace_syscalls_1 (pi, SYS_syssgi, PR_SYSEXIT,
4153 /* This is an internal event and should be transparent
4154 to wfi, so resume the execution and wait again. See
4155 comment in procfs_init_inferior() for more details. */
4156 target_resume (ptid, 0, TARGET_SIGNAL_0);
4160 else if (syscall_is_lwp_create (pi, what))
4163 * This syscall is somewhat like fork/exec.
4164 * We will get the event twice: once for the parent LWP,
4165 * and once for the child. We should already know about
4166 * the parent LWP, but the child will be new to us. So,
4167 * whenever we get this event, if it represents a new
4168 * thread, simply add the thread to the list.
4171 /* If not in procinfo list, add it. */
4172 temp_tid = proc_get_current_thread (pi);
4173 if (!find_procinfo (pi->pid, temp_tid))
4174 create_procinfo (pi->pid, temp_tid);
4176 temp_ptid = MERGEPID (pi->pid, temp_tid);
4177 /* If not in GDB's thread list, add it. */
4178 if (!in_thread_list (temp_ptid))
4179 add_thread (temp_ptid);
4181 /* Return to WFI, but tell it to immediately resume. */
4182 status->kind = TARGET_WAITKIND_SPURIOUS;
4183 return inferior_ptid;
4185 else if (syscall_is_lwp_exit (pi, what))
4187 if (print_thread_events)
4188 printf_unfiltered (_("[%s exited]\n"),
4189 target_pid_to_str (retval));
4190 delete_thread (retval);
4191 status->kind = TARGET_WAITKIND_SPURIOUS;
4196 /* FIXME: Do we need to handle SYS_sproc,
4197 SYS_fork, or SYS_vfork here? The old procfs
4198 seemed to use this event to handle threads on
4199 older (non-LWP) systems, where I'm assuming
4200 that threads were actually separate processes.
4201 Irix, maybe? Anyway, low priority for now. */
4205 printf_filtered (_("procfs: trapped on exit from "));
4206 proc_prettyprint_syscall (proc_what (pi), 0);
4207 printf_filtered ("\n");
4210 long i, nsysargs, *sysargs;
4212 if ((nsysargs = proc_nsysarg (pi)) > 0 &&
4213 (sysargs = proc_sysargs (pi)) != NULL)
4215 printf_filtered (_("%ld syscall arguments:\n"), nsysargs);
4216 for (i = 0; i < nsysargs; i++)
4217 printf_filtered ("#%ld: 0x%08lx\n",
4222 status->kind = TARGET_WAITKIND_SPURIOUS;
4223 return inferior_ptid;
4228 wstat = (SIGSTOP << 8) | 0177;
4233 printf_filtered (_("Retry #%d:\n"), retry);
4234 pi->status_valid = 0;
4239 /* If not in procinfo list, add it. */
4240 temp_tid = proc_get_current_thread (pi);
4241 if (!find_procinfo (pi->pid, temp_tid))
4242 create_procinfo (pi->pid, temp_tid);
4244 /* If not in GDB's thread list, add it. */
4245 temp_ptid = MERGEPID (pi->pid, temp_tid);
4246 if (!in_thread_list (temp_ptid))
4247 add_thread (temp_ptid);
4249 status->kind = TARGET_WAITKIND_STOPPED;
4250 status->value.sig = 0;
4255 wstat = (what << 8) | 0177;
4261 wstat = (SIGTRAP << 8) | 0177;
4266 wstat = (SIGTRAP << 8) | 0177;
4269 /* FIXME: use si_signo where possible. */
4271 #if (FLTILL != FLTPRIV) /* avoid "duplicate case" error */
4274 wstat = (SIGILL << 8) | 0177;
4277 #if (FLTTRACE != FLTBPT) /* avoid "duplicate case" error */
4280 /* If we hit our __dbx_link() internal breakpoint,
4281 then remove it. See comments in procfs_init_inferior()
4282 for more details. */
4283 if (dbx_link_bpt_addr != 0
4284 && dbx_link_bpt_addr
4285 == regcache_read_pc (get_current_regcache ()))
4286 remove_dbx_link_breakpoint ();
4288 wstat = (SIGTRAP << 8) | 0177;
4292 #if (FLTBOUNDS != FLTSTACK) /* avoid "duplicate case" error */
4295 wstat = (SIGSEGV << 8) | 0177;
4299 #if (FLTFPE != FLTIOVF) /* avoid "duplicate case" error */
4302 wstat = (SIGFPE << 8) | 0177;
4304 case FLTPAGE: /* Recoverable page fault */
4305 default: /* FIXME: use si_signo if possible for fault */
4306 retval = pid_to_ptid (-1);
4307 printf_filtered ("procfs:%d -- ", __LINE__);
4308 printf_filtered (_("child stopped for unknown reason:\n"));
4309 proc_prettyprint_why (why, what, 1);
4310 error (_("... giving up..."));
4313 break; /* case PR_FAULTED: */
4314 default: /* switch (why) unmatched */
4315 printf_filtered ("procfs:%d -- ", __LINE__);
4316 printf_filtered (_("child stopped for unknown reason:\n"));
4317 proc_prettyprint_why (why, what, 1);
4318 error (_("... giving up..."));
4322 * Got this far without error:
4323 * If retval isn't in the threads database, add it.
4325 if (PIDGET (retval) > 0 &&
4326 !ptid_equal (retval, inferior_ptid) &&
4327 !in_thread_list (retval))
4330 * We have a new thread.
4331 * We need to add it both to GDB's list and to our own.
4332 * If we don't create a procinfo, resume may be unhappy
4335 add_thread (retval);
4336 if (find_procinfo (PIDGET (retval), TIDGET (retval)) == NULL)
4337 create_procinfo (PIDGET (retval), TIDGET (retval));
4340 else /* flags do not indicate STOPPED */
4342 /* surely this can't happen... */
4343 printf_filtered ("procfs:%d -- process not stopped.\n",
4345 proc_prettyprint_flags (flags, 1);
4346 error (_("procfs: ...giving up..."));
4351 store_waitstatus (status, wstat);
4357 /* Perform a partial transfer to/from the specified object. For
4358 memory transfers, fall back to the old memory xfer functions. */
4361 procfs_xfer_partial (struct target_ops *ops, enum target_object object,
4362 const char *annex, gdb_byte *readbuf,
4363 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4367 case TARGET_OBJECT_MEMORY:
4369 return (*ops->deprecated_xfer_memory) (offset, readbuf,
4370 len, 0/*read*/, NULL, ops);
4372 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
4373 len, 1/*write*/, NULL, ops);
4377 case TARGET_OBJECT_AUXV:
4378 return procfs_xfer_auxv (ops, object, annex, readbuf, writebuf,
4383 if (ops->beneath != NULL)
4384 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
4385 readbuf, writebuf, offset, len);
4391 /* Transfer LEN bytes between GDB address MYADDR and target address
4392 MEMADDR. If DOWRITE is non-zero, transfer them to the target,
4393 otherwise transfer them from the target. TARGET is unused.
4395 The return value is 0 if an error occurred or no bytes were
4396 transferred. Otherwise, it will be a positive value which
4397 indicates the number of bytes transferred between gdb and the
4398 target. (Note that the interface also makes provisions for
4399 negative values, but this capability isn't implemented here.) */
4402 procfs_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int dowrite,
4403 struct mem_attrib *attrib, struct target_ops *target)
4408 /* Find procinfo for main process */
4409 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
4410 if (pi->as_fd == 0 &&
4411 open_procinfo_files (pi, FD_AS) == 0)
4413 proc_warn (pi, "xfer_memory, open_proc_files", __LINE__);
4417 if (lseek (pi->as_fd, (off_t) memaddr, SEEK_SET) == (off_t) memaddr)
4422 PROCFS_NOTE ("write memory: ");
4424 PROCFS_NOTE ("write memory: \n");
4426 nbytes = write (pi->as_fd, myaddr, len);
4430 PROCFS_NOTE ("read memory: \n");
4431 nbytes = read (pi->as_fd, myaddr, len);
4442 * Function: invalidate_cache
4444 * Called by target_resume before making child runnable.
4445 * Mark cached registers and status's invalid.
4446 * If there are "dirty" caches that need to be written back
4447 * to the child process, do that.
4449 * File descriptors are also cached.
4450 * As they are a limited resource, we cannot hold onto them indefinitely.
4451 * However, as they are expensive to open, we don't want to throw them
4452 * away indescriminately either. As a compromise, we will keep the
4453 * file descriptors for the parent process, but discard any file
4454 * descriptors we may have accumulated for the threads.
4457 * As this function is called by iterate_over_threads, it always
4458 * returns zero (so that iterate_over_threads will keep iterating).
4463 invalidate_cache (procinfo *parent, procinfo *pi, void *ptr)
4466 * About to run the child; invalidate caches and do any other cleanup.
4470 if (pi->gregs_dirty)
4471 if (parent == NULL ||
4472 proc_get_current_thread (parent) != pi->tid)
4473 if (!proc_set_gregs (pi)) /* flush gregs cache */
4474 proc_warn (pi, "target_resume, set_gregs",
4476 if (gdbarch_fp0_regnum (target_gdbarch) >= 0)
4477 if (pi->fpregs_dirty)
4478 if (parent == NULL ||
4479 proc_get_current_thread (parent) != pi->tid)
4480 if (!proc_set_fpregs (pi)) /* flush fpregs cache */
4481 proc_warn (pi, "target_resume, set_fpregs",
4487 /* The presence of a parent indicates that this is an LWP.
4488 Close any file descriptors that it might have open.
4489 We don't do this to the master (parent) procinfo. */
4491 close_procinfo_files (pi);
4493 pi->gregs_valid = 0;
4494 pi->fpregs_valid = 0;
4496 pi->gregs_dirty = 0;
4497 pi->fpregs_dirty = 0;
4499 pi->status_valid = 0;
4500 pi->threads_valid = 0;
4507 * Function: make_signal_thread_runnable
4509 * A callback function for iterate_over_threads.
4510 * Find the asynchronous signal thread, and make it runnable.
4511 * See if that helps matters any.
4515 make_signal_thread_runnable (procinfo *process, procinfo *pi, void *ptr)
4518 if (proc_flags (pi) & PR_ASLWP)
4520 if (!proc_run_process (pi, 0, -1))
4521 proc_error (pi, "make_signal_thread_runnable", __LINE__);
4530 * Function: target_resume
4532 * Make the child process runnable. Normally we will then call
4533 * procfs_wait and wait for it to stop again (unles gdb is async).
4536 * step: if true, then arrange for the child to stop again
4537 * after executing a single instruction.
4538 * signo: if zero, then cancel any pending signal.
4539 * If non-zero, then arrange for the indicated signal
4540 * to be delivered to the child when it runs.
4541 * pid: if -1, then allow any child thread to run.
4542 * if non-zero, then allow only the indicated thread to run.
4543 ******* (not implemented yet)
4547 procfs_resume (struct target_ops *ops,
4548 ptid_t ptid, int step, enum target_signal signo)
4550 procinfo *pi, *thread;
4554 prrun.prflags |= PRSVADDR;
4555 prrun.pr_vaddr = $PC; set resume address
4556 prrun.prflags |= PRSTRACE; trace signals in pr_trace (all)
4557 prrun.prflags |= PRSFAULT; trace faults in pr_fault (all but PAGE)
4558 prrun.prflags |= PRCFAULT; clear current fault.
4560 PRSTRACE and PRSFAULT can be done by other means
4561 (proc_trace_signals, proc_trace_faults)
4562 PRSVADDR is unnecessary.
4563 PRCFAULT may be replaced by a PIOCCFAULT call (proc_clear_current_fault)
4564 This basically leaves PRSTEP and PRCSIG.
4565 PRCSIG is like PIOCSSIG (proc_clear_current_signal).
4566 So basically PR_STEP is the sole argument that must be passed
4567 to proc_run_process (for use in the prrun struct by ioctl). */
4569 /* Find procinfo for main process */
4570 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
4572 /* First cut: ignore pid argument */
4575 /* Convert signal to host numbering. */
4577 (signo == TARGET_SIGNAL_STOP && pi->ignore_next_sigstop))
4580 native_signo = target_signal_to_host (signo);
4582 pi->ignore_next_sigstop = 0;
4584 /* Running the process voids all cached registers and status. */
4585 /* Void the threads' caches first */
4586 proc_iterate_over_threads (pi, invalidate_cache, NULL);
4587 /* Void the process procinfo's caches. */
4588 invalidate_cache (NULL, pi, NULL);
4590 if (PIDGET (ptid) != -1)
4592 /* Resume a specific thread, presumably suppressing the others. */
4593 thread = find_procinfo (PIDGET (ptid), TIDGET (ptid));
4596 if (thread->tid != 0)
4598 /* We're to resume a specific thread, and not the others.
4599 * Set the child process's PR_ASYNC flag.
4602 if (!proc_set_async (pi))
4603 proc_error (pi, "target_resume, set_async", __LINE__);
4606 proc_iterate_over_threads (pi,
4607 make_signal_thread_runnable,
4610 pi = thread; /* substitute the thread's procinfo for run */
4615 if (!proc_run_process (pi, step, native_signo))
4618 warning (_("resume: target already running. Pretend to resume, and hope for the best!"));
4620 proc_error (pi, "target_resume", __LINE__);
4625 * Function: register_gdb_signals
4627 * Traverse the list of signals that GDB knows about
4628 * (see "handle" command), and arrange for the target
4629 * to be stopped or not, according to these settings.
4631 * Returns non-zero for success, zero for failure.
4635 register_gdb_signals (procinfo *pi, gdb_sigset_t *signals)
4639 for (signo = 0; signo < NSIG; signo ++)
4640 if (signal_stop_state (target_signal_from_host (signo)) == 0 &&
4641 signal_print_state (target_signal_from_host (signo)) == 0 &&
4642 signal_pass_state (target_signal_from_host (signo)) == 1)
4643 prdelset (signals, signo);
4645 praddset (signals, signo);
4647 return proc_set_traced_signals (pi, signals);
4651 * Function: target_notice_signals
4653 * Set up to trace signals in the child process.
4657 procfs_notice_signals (ptid_t ptid)
4659 gdb_sigset_t signals;
4660 procinfo *pi = find_procinfo_or_die (PIDGET (ptid), 0);
4662 if (proc_get_traced_signals (pi, &signals) &&
4663 register_gdb_signals (pi, &signals))
4666 proc_error (pi, "notice_signals", __LINE__);
4670 * Function: target_files_info
4672 * Print status information about the child process.
4676 procfs_files_info (struct target_ops *ignore)
4678 struct inferior *inf = current_inferior ();
4679 printf_filtered (_("\tUsing the running image of %s %s via /proc.\n"),
4680 inf->attach_flag? "attached": "child",
4681 target_pid_to_str (inferior_ptid));
4685 * Function: target_stop
4687 * Stop the child process asynchronously, as when the
4688 * gdb user types control-c or presses a "stop" button.
4690 * Works by sending kill(SIGINT) to the child's process group.
4694 procfs_stop (ptid_t ptid)
4696 kill (-inferior_process_group (), SIGINT);
4700 * Function: unconditionally_kill_inferior
4702 * Make it die. Wait for it to die. Clean up after it.
4703 * Note: this should only be applied to the real process,
4704 * not to an LWP, because of the check for parent-process.
4705 * If we need this to work for an LWP, it needs some more logic.
4709 unconditionally_kill_inferior (procinfo *pi)
4713 parent_pid = proc_parent_pid (pi);
4714 #ifdef PROCFS_NEED_CLEAR_CURSIG_FOR_KILL
4715 /* FIXME: use access functions */
4716 /* Alpha OSF/1-3.x procfs needs a clear of the current signal
4717 before the PIOCKILL, otherwise it might generate a corrupted core
4718 file for the inferior. */
4719 if (ioctl (pi->ctl_fd, PIOCSSIG, NULL) < 0)
4721 printf_filtered ("unconditionally_kill: SSIG failed!\n");
4724 #ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
4725 /* Alpha OSF/1-2.x procfs needs a PIOCSSIG call with a SIGKILL signal
4726 to kill the inferior, otherwise it might remain stopped with a
4728 We do not check the result of the PIOCSSIG, the inferior might have
4731 gdb_siginfo_t newsiginfo;
4733 memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
4734 newsiginfo.si_signo = SIGKILL;
4735 newsiginfo.si_code = 0;
4736 newsiginfo.si_errno = 0;
4737 newsiginfo.si_pid = getpid ();
4738 newsiginfo.si_uid = getuid ();
4739 /* FIXME: use proc_set_current_signal */
4740 ioctl (pi->ctl_fd, PIOCSSIG, &newsiginfo);
4742 #else /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
4743 if (!proc_kill (pi, SIGKILL))
4744 proc_error (pi, "unconditionally_kill, proc_kill", __LINE__);
4745 #endif /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
4746 destroy_procinfo (pi);
4748 /* If pi is GDB's child, wait for it to die. */
4749 if (parent_pid == getpid ())
4750 /* FIXME: should we use waitpid to make sure we get the right event?
4751 Should we check the returned event? */
4756 ret = waitpid (pi->pid, &status, 0);
4764 * Function: target_kill_inferior
4766 * We're done debugging it, and we want it to go away.
4767 * Then we want GDB to forget all about it.
4771 procfs_kill_inferior (struct target_ops *ops)
4773 if (!ptid_equal (inferior_ptid, null_ptid)) /* ? */
4775 /* Find procinfo for main process */
4776 procinfo *pi = find_procinfo (PIDGET (inferior_ptid), 0);
4779 unconditionally_kill_inferior (pi);
4780 target_mourn_inferior ();
4785 * Function: target_mourn_inferior
4787 * Forget we ever debugged this thing!
4791 procfs_mourn_inferior (struct target_ops *ops)
4795 if (!ptid_equal (inferior_ptid, null_ptid))
4797 /* Find procinfo for main process */
4798 pi = find_procinfo (PIDGET (inferior_ptid), 0);
4800 destroy_procinfo (pi);
4802 unpush_target (ops);
4804 if (dbx_link_bpt != NULL)
4806 deprecated_remove_raw_breakpoint (target_gdbarch, dbx_link_bpt);
4807 dbx_link_bpt_addr = 0;
4808 dbx_link_bpt = NULL;
4811 generic_mourn_inferior ();
4815 * Function: init_inferior
4817 * When GDB forks to create a runnable inferior process,
4818 * this function is called on the parent side of the fork.
4819 * It's job is to do whatever is necessary to make the child
4820 * ready to be debugged, and then wait for the child to synchronize.
4824 procfs_init_inferior (struct target_ops *ops, int pid)
4827 gdb_sigset_t signals;
4831 /* This routine called on the parent side (GDB side)
4832 after GDB forks the inferior. */
4835 if ((pi = create_procinfo (pid, 0)) == NULL)
4836 perror ("procfs: out of memory in 'init_inferior'");
4838 if (!open_procinfo_files (pi, FD_CTL))
4839 proc_error (pi, "init_inferior, open_proc_files", __LINE__);
4843 open_procinfo_files // done
4846 procfs_notice_signals
4853 /* If not stopped yet, wait for it to stop. */
4854 if (!(proc_flags (pi) & PR_STOPPED) &&
4855 !(proc_wait_for_stop (pi)))
4856 dead_procinfo (pi, "init_inferior: wait_for_stop failed", KILL);
4858 /* Save some of the /proc state to be restored if we detach. */
4859 /* FIXME: Why? In case another debugger was debugging it?
4860 We're it's parent, for Ghu's sake! */
4861 if (!proc_get_traced_signals (pi, &pi->saved_sigset))
4862 proc_error (pi, "init_inferior, get_traced_signals", __LINE__);
4863 if (!proc_get_held_signals (pi, &pi->saved_sighold))
4864 proc_error (pi, "init_inferior, get_held_signals", __LINE__);
4865 if (!proc_get_traced_faults (pi, &pi->saved_fltset))
4866 proc_error (pi, "init_inferior, get_traced_faults", __LINE__);
4867 if (!proc_get_traced_sysentry (pi, pi->saved_entryset))
4868 proc_error (pi, "init_inferior, get_traced_sysentry", __LINE__);
4869 if (!proc_get_traced_sysexit (pi, pi->saved_exitset))
4870 proc_error (pi, "init_inferior, get_traced_sysexit", __LINE__);
4872 /* Register to trace selected signals in the child. */
4873 prfillset (&signals);
4874 if (!register_gdb_signals (pi, &signals))
4875 proc_error (pi, "init_inferior, register_signals", __LINE__);
4877 if ((fail = procfs_debug_inferior (pi)) != 0)
4878 proc_error (pi, "init_inferior (procfs_debug_inferior)", fail);
4880 /* FIXME: logically, we should really be turning OFF run-on-last-close,
4881 and possibly even turning ON kill-on-last-close at this point. But
4882 I can't make that change without careful testing which I don't have
4883 time to do right now... */
4884 /* Turn on run-on-last-close flag so that the child
4885 will die if GDB goes away for some reason. */
4886 if (!proc_set_run_on_last_close (pi))
4887 proc_error (pi, "init_inferior, set_RLC", __LINE__);
4889 /* We now have have access to the lwpid of the main thread/lwp. */
4890 lwpid = proc_get_current_thread (pi);
4892 /* Create a procinfo for the main lwp. */
4893 create_procinfo (pid, lwpid);
4895 /* We already have a main thread registered in the thread table at
4896 this point, but it didn't have any lwp info yet. Notify the core
4897 about it. This changes inferior_ptid as well. */
4898 thread_change_ptid (pid_to_ptid (pid),
4899 MERGEPID (pid, lwpid));
4901 /* Typically two, one trap to exec the shell, one to exec the
4902 program being debugged. Defined by "inferior.h". */
4903 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
4906 /* On mips-irix, we need to stop the inferior early enough during
4907 the startup phase in order to be able to load the shared library
4908 symbols and insert the breakpoints that are located in these shared
4909 libraries. Stopping at the program entry point is not good enough
4910 because the -init code is executed before the execution reaches
4913 So what we need to do is to insert a breakpoint in the runtime
4914 loader (rld), more precisely in __dbx_link(). This procedure is
4915 called by rld once all shared libraries have been mapped, but before
4916 the -init code is executed. Unfortuantely, this is not straightforward,
4917 as rld is not part of the executable we are running, and thus we need
4918 the inferior to run until rld itself has been mapped in memory.
4920 For this, we trace all syssgi() syscall exit events. Each time
4921 we detect such an event, we iterate over each text memory maps,
4922 get its associated fd, and scan the symbol table for __dbx_link().
4923 When found, we know that rld has been mapped, and that we can insert
4924 the breakpoint at the symbol address. Once the dbx_link() breakpoint
4925 has been inserted, the syssgi() notifications are no longer necessary,
4926 so they should be canceled. */
4927 proc_trace_syscalls_1 (pi, SYS_syssgi, PR_SYSEXIT, FLAG_SET, 0);
4932 * Function: set_exec_trap
4934 * When GDB forks to create a new process, this function is called
4935 * on the child side of the fork before GDB exec's the user program.
4936 * Its job is to make the child minimally debuggable, so that the
4937 * parent GDB process can connect to the child and take over.
4938 * This function should do only the minimum to make that possible,
4939 * and to synchronize with the parent process. The parent process
4940 * should take care of the details.
4944 procfs_set_exec_trap (void)
4946 /* This routine called on the child side (inferior side)
4947 after GDB forks the inferior. It must use only local variables,
4948 because it may be sharing data space with its parent. */
4953 if ((pi = create_procinfo (getpid (), 0)) == NULL)
4954 perror_with_name (_("procfs: create_procinfo failed in child."));
4956 if (open_procinfo_files (pi, FD_CTL) == 0)
4958 proc_warn (pi, "set_exec_trap, open_proc_files", __LINE__);
4959 gdb_flush (gdb_stderr);
4960 /* no need to call "dead_procinfo", because we're going to exit. */
4964 #ifdef PRFS_STOPEXEC /* defined on OSF */
4965 /* OSF method for tracing exec syscalls. Quoting:
4966 Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
4967 exits from exec system calls because of the user level loader. */
4968 /* FIXME: make nice and maybe move into an access function. */
4972 if (ioctl (pi->ctl_fd, PIOCGSPCACT, &prfs_flags) < 0)
4974 proc_warn (pi, "set_exec_trap (PIOCGSPCACT)", __LINE__);
4975 gdb_flush (gdb_stderr);
4978 prfs_flags |= PRFS_STOPEXEC;
4980 if (ioctl (pi->ctl_fd, PIOCSSPCACT, &prfs_flags) < 0)
4982 proc_warn (pi, "set_exec_trap (PIOCSSPCACT)", __LINE__);
4983 gdb_flush (gdb_stderr);
4987 #else /* not PRFS_STOPEXEC */
4988 /* Everyone else's (except OSF) method for tracing exec syscalls */
4990 Not all systems with /proc have all the exec* syscalls with the same
4991 names. On the SGI, for example, there is no SYS_exec, but there
4992 *is* a SYS_execv. So, we try to account for that. */
4994 exitset = sysset_t_alloc (pi);
4995 gdb_premptysysset (exitset);
4997 gdb_praddsysset (exitset, SYS_exec);
5000 gdb_praddsysset (exitset, SYS_execve);
5003 gdb_praddsysset (exitset, SYS_execv);
5005 #ifdef DYNAMIC_SYSCALLS
5007 int callnum = find_syscall (pi, "execve");
5010 gdb_praddsysset (exitset, callnum);
5012 callnum = find_syscall (pi, "ra_execve");
5014 gdb_praddsysset (exitset, callnum);
5016 #endif /* DYNAMIC_SYSCALLS */
5018 if (!proc_set_traced_sysexit (pi, exitset))
5020 proc_warn (pi, "set_exec_trap, set_traced_sysexit", __LINE__);
5021 gdb_flush (gdb_stderr);
5024 #endif /* PRFS_STOPEXEC */
5026 /* FIXME: should this be done in the parent instead? */
5027 /* Turn off inherit on fork flag so that all grand-children
5028 of gdb start with tracing flags cleared. */
5029 if (!proc_unset_inherit_on_fork (pi))
5030 proc_warn (pi, "set_exec_trap, unset_inherit", __LINE__);
5032 /* Turn off run on last close flag, so that the child process
5033 cannot run away just because we close our handle on it.
5034 We want it to wait for the parent to attach. */
5035 if (!proc_unset_run_on_last_close (pi))
5036 proc_warn (pi, "set_exec_trap, unset_RLC", __LINE__);
5038 /* FIXME: No need to destroy the procinfo --
5039 we have our own address space, and we're about to do an exec! */
5040 /*destroy_procinfo (pi);*/
5044 * Function: create_inferior
5046 * This function is called BEFORE gdb forks the inferior process.
5047 * Its only real responsibility is to set things up for the fork,
5048 * and tell GDB which two functions to call after the fork (one
5049 * for the parent, and one for the child).
5051 * This function does a complicated search for a unix shell program,
5052 * which it then uses to parse arguments and environment variables
5053 * to be sent to the child. I wonder whether this code could not
5054 * be abstracted out and shared with other unix targets such as
5059 procfs_create_inferior (struct target_ops *ops, char *exec_file,
5060 char *allargs, char **env, int from_tty)
5062 char *shell_file = getenv ("SHELL");
5066 if (shell_file != NULL && strchr (shell_file, '/') == NULL)
5069 /* We will be looking down the PATH to find shell_file. If we
5070 just do this the normal way (via execlp, which operates by
5071 attempting an exec for each element of the PATH until it
5072 finds one which succeeds), then there will be an exec for
5073 each failed attempt, each of which will cause a PR_SYSEXIT
5074 stop, and we won't know how to distinguish the PR_SYSEXIT's
5075 for these failed execs with the ones for successful execs
5076 (whether the exec has succeeded is stored at that time in the
5077 carry bit or some such architecture-specific and
5078 non-ABI-specified place).
5080 So I can't think of anything better than to search the PATH
5081 now. This has several disadvantages: (1) There is a race
5082 condition; if we find a file now and it is deleted before we
5083 exec it, we lose, even if the deletion leaves a valid file
5084 further down in the PATH, (2) there is no way to know exactly
5085 what an executable (in the sense of "capable of being
5086 exec'd") file is. Using access() loses because it may lose
5087 if the caller is the superuser; failing to use it loses if
5088 there are ACLs or some such. */
5092 /* FIXME-maybe: might want "set path" command so user can change what
5093 path is used from within GDB. */
5094 char *path = getenv ("PATH");
5096 struct stat statbuf;
5099 path = "/bin:/usr/bin";
5101 tryname = alloca (strlen (path) + strlen (shell_file) + 2);
5102 for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
5104 p1 = strchr (p, ':');
5109 strncpy (tryname, p, len);
5110 tryname[len] = '\0';
5111 strcat (tryname, "/");
5112 strcat (tryname, shell_file);
5113 if (access (tryname, X_OK) < 0)
5115 if (stat (tryname, &statbuf) < 0)
5117 if (!S_ISREG (statbuf.st_mode))
5118 /* We certainly need to reject directories. I'm not quite
5119 as sure about FIFOs, sockets, etc., but I kind of doubt
5120 that people want to exec() these things. */
5125 /* Not found. This must be an error rather than merely passing
5126 the file to execlp(), because execlp() would try all the
5127 exec()s, causing GDB to get confused. */
5128 error (_("procfs:%d -- Can't find shell %s in PATH"),
5129 __LINE__, shell_file);
5131 shell_file = tryname;
5134 pid = fork_inferior (exec_file, allargs, env, procfs_set_exec_trap,
5135 NULL, NULL, shell_file);
5137 procfs_init_inferior (ops, pid);
5140 /* Make sure to cancel the syssgi() syscall-exit notifications.
5141 They should normally have been removed by now, but they may still
5142 be activated if the inferior doesn't use shared libraries, or if
5143 we didn't locate __dbx_link, or if we never stopped in __dbx_link.
5144 See procfs_init_inferior() for more details. */
5145 proc_trace_syscalls_1 (find_procinfo_or_die (PIDGET (inferior_ptid), 0),
5146 SYS_syssgi, PR_SYSEXIT, FLAG_RESET, 0);
5151 * Function: notice_thread
5153 * Callback for find_new_threads.
5154 * Calls "add_thread".
5158 procfs_notice_thread (procinfo *pi, procinfo *thread, void *ptr)
5160 ptid_t gdb_threadid = MERGEPID (pi->pid, thread->tid);
5162 if (!in_thread_list (gdb_threadid) || is_exited (gdb_threadid))
5163 add_thread (gdb_threadid);
5169 * Function: target_find_new_threads
5171 * Query all the threads that the target knows about,
5172 * and give them back to GDB to add to its list.
5176 procfs_find_new_threads (struct target_ops *ops)
5180 /* Find procinfo for main process */
5181 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5182 proc_update_threads (pi);
5183 proc_iterate_over_threads (pi, procfs_notice_thread, NULL);
5187 * Function: target_thread_alive
5189 * Return true if the thread is still 'alive'.
5191 * This guy doesn't really seem to be doing his job.
5192 * Got to investigate how to tell when a thread is really gone.
5196 procfs_thread_alive (struct target_ops *ops, ptid_t ptid)
5201 proc = PIDGET (ptid);
5202 thread = TIDGET (ptid);
5203 /* If I don't know it, it ain't alive! */
5204 if ((pi = find_procinfo (proc, thread)) == NULL)
5207 /* If I can't get its status, it ain't alive!
5208 What's more, I need to forget about it! */
5209 if (!proc_get_status (pi))
5211 destroy_procinfo (pi);
5214 /* I couldn't have got its status if it weren't alive, so it's alive. */
5218 /* Convert PTID to a string. Returns the string in a static buffer. */
5221 procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
5223 static char buf[80];
5225 if (TIDGET (ptid) == 0)
5226 sprintf (buf, "process %d", PIDGET (ptid));
5228 sprintf (buf, "LWP %ld", TIDGET (ptid));
5234 * Function: procfs_set_watchpoint
5235 * Insert a watchpoint
5239 procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag,
5247 pi = find_procinfo_or_die (PIDGET (ptid) == -1 ?
5248 PIDGET (inferior_ptid) : PIDGET (ptid), 0);
5250 /* Translate from GDB's flags to /proc's */
5251 if (len > 0) /* len == 0 means delete watchpoint */
5253 switch (rwflag) { /* FIXME: need an enum! */
5254 case hw_write: /* default watchpoint (write) */
5255 pflags = WRITE_WATCHFLAG;
5257 case hw_read: /* read watchpoint */
5258 pflags = READ_WATCHFLAG;
5260 case hw_access: /* access watchpoint */
5261 pflags = READ_WATCHFLAG | WRITE_WATCHFLAG;
5263 case hw_execute: /* execution HW breakpoint */
5264 pflags = EXEC_WATCHFLAG;
5266 default: /* Something weird. Return error. */
5269 if (after) /* Stop after r/w access is completed. */
5270 pflags |= AFTER_WATCHFLAG;
5273 if (!proc_set_watchpoint (pi, addr, len, pflags))
5275 if (errno == E2BIG) /* Typical error for no resources */
5276 return -1; /* fail */
5277 /* GDB may try to remove the same watchpoint twice.
5278 If a remove request returns no match, don't error. */
5279 if (errno == ESRCH && len == 0)
5280 return 0; /* ignore */
5281 proc_error (pi, "set_watchpoint", __LINE__);
5284 #endif /* UNIXWARE */
5288 /* Return non-zero if we can set a hardware watchpoint of type TYPE. TYPE
5289 is one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint,
5290 or bp_hardware_watchpoint. CNT is the number of watchpoints used so
5293 Note: procfs_can_use_hw_breakpoint() is not yet used by all
5294 procfs.c targets due to the fact that some of them still define
5295 target_can_use_hardware_watchpoint. */
5298 procfs_can_use_hw_breakpoint (int type, int cnt, int othertype)
5300 /* Due to the way that proc_set_watchpoint() is implemented, host
5301 and target pointers must be of the same size. If they are not,
5302 we can't use hardware watchpoints. This limitation is due to the
5303 fact that proc_set_watchpoint() calls
5304 procfs_address_to_host_pointer(); a close inspection of
5305 procfs_address_to_host_pointer will reveal that an internal error
5306 will be generated when the host and target pointer sizes are
5308 struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
5309 if (sizeof (void *) != TYPE_LENGTH (ptr_type))
5312 /* Other tests here??? */
5318 * Function: stopped_by_watchpoint
5320 * Returns non-zero if process is stopped on a hardware watchpoint fault,
5321 * else returns zero.
5325 procfs_stopped_by_watchpoint (void)
5329 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5331 if (!pi) /* If no process, then not stopped by watchpoint! */
5334 if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
5336 if (proc_why (pi) == PR_FAULTED)
5339 if (proc_what (pi) == FLTWATCH)
5343 if (proc_what (pi) == FLTKWATCH)
5352 procfs_insert_watchpoint (CORE_ADDR addr, int len, int type)
5354 if (!target_have_steppable_watchpoint
5355 && !gdbarch_have_nonsteppable_watchpoint (target_gdbarch))
5357 /* When a hardware watchpoint fires off the PC will be left at
5358 the instruction following the one which caused the
5359 watchpoint. It will *NOT* be necessary for GDB to step over
5361 return procfs_set_watchpoint (inferior_ptid, addr, len, type, 1);
5365 /* When a hardware watchpoint fires off the PC will be left at
5366 the instruction which caused the watchpoint. It will be
5367 necessary for GDB to step over the watchpoint. */
5368 return procfs_set_watchpoint (inferior_ptid, addr, len, type, 0);
5373 procfs_remove_watchpoint (CORE_ADDR addr, int len, int type)
5375 return procfs_set_watchpoint (inferior_ptid, addr, 0, 0, 0);
5379 procfs_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
5381 /* The man page for proc(4) on Solaris 2.6 and up says that the
5382 system can support "thousands" of hardware watchpoints, but gives
5383 no method for finding out how many; It doesn't say anything about
5384 the allowed size for the watched area either. So we just tell
5390 procfs_use_watchpoints (struct target_ops *t)
5392 t->to_stopped_by_watchpoint = procfs_stopped_by_watchpoint;
5393 t->to_insert_watchpoint = procfs_insert_watchpoint;
5394 t->to_remove_watchpoint = procfs_remove_watchpoint;
5395 t->to_region_ok_for_hw_watchpoint = procfs_region_ok_for_hw_watchpoint;
5396 t->to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint;
5400 * Memory Mappings Functions:
5404 * Function: iterate_over_mappings
5406 * Call a callback function once for each mapping, passing it the mapping,
5407 * an optional secondary callback function, and some optional opaque data.
5408 * Quit and return the first non-zero value returned from the callback.
5411 * pi -- procinfo struct for the process to be mapped.
5412 * func -- callback function to be called by this iterator.
5413 * data -- optional opaque data to be passed to the callback function.
5414 * child_func -- optional secondary function pointer to be passed
5415 * to the child function.
5417 * Return: First non-zero return value from the callback function,
5422 iterate_over_mappings (procinfo *pi, int (*child_func) (), void *data,
5423 int (*func) (struct prmap *map,
5424 int (*child_func) (),
5427 char pathname[MAX_PROC_NAME_SIZE];
5428 struct prmap *prmaps;
5429 struct prmap *prmap;
5437 /* Get the number of mappings, allocate space,
5438 and read the mappings into prmaps. */
5441 sprintf (pathname, "/proc/%d/map", pi->pid);
5442 if ((map_fd = open (pathname, O_RDONLY)) < 0)
5443 proc_error (pi, "iterate_over_mappings (open)", __LINE__);
5445 /* Make sure it gets closed again. */
5446 make_cleanup_close (map_fd);
5448 /* Use stat to determine the file size, and compute
5449 the number of prmap_t objects it contains. */
5450 if (fstat (map_fd, &sbuf) != 0)
5451 proc_error (pi, "iterate_over_mappings (fstat)", __LINE__);
5453 nmap = sbuf.st_size / sizeof (prmap_t);
5454 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
5455 if (read (map_fd, (char *) prmaps, nmap * sizeof (*prmaps))
5456 != (nmap * sizeof (*prmaps)))
5457 proc_error (pi, "iterate_over_mappings (read)", __LINE__);
5459 /* Use ioctl command PIOCNMAP to get number of mappings. */
5460 if (ioctl (pi->ctl_fd, PIOCNMAP, &nmap) != 0)
5461 proc_error (pi, "iterate_over_mappings (PIOCNMAP)", __LINE__);
5463 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
5464 if (ioctl (pi->ctl_fd, PIOCMAP, prmaps) != 0)
5465 proc_error (pi, "iterate_over_mappings (PIOCMAP)", __LINE__);
5468 for (prmap = prmaps; nmap > 0; prmap++, nmap--)
5469 if ((funcstat = (*func) (prmap, child_func, data)) != 0)
5476 * Function: solib_mappings_callback
5478 * Calls the supplied callback function once for each mapped address
5479 * space in the process. The callback function receives an open
5480 * file descriptor for the file corresponding to that mapped
5481 * address space (if there is one), and the base address of the
5482 * mapped space. Quit when the callback function returns a
5483 * nonzero value, or at teh end of the mappings.
5485 * Returns: the first non-zero return value of the callback function,
5489 int solib_mappings_callback (struct prmap *map,
5490 int (*func) (int, CORE_ADDR),
5493 procinfo *pi = data;
5497 char name[MAX_PROC_NAME_SIZE + sizeof (map->pr_mapname)];
5499 if (map->pr_vaddr == 0 && map->pr_size == 0)
5500 return -1; /* sanity */
5502 if (map->pr_mapname[0] == 0)
5504 fd = -1; /* no map file */
5508 sprintf (name, "/proc/%d/object/%s", pi->pid, map->pr_mapname);
5509 /* Note: caller's responsibility to close this fd! */
5510 fd = open_with_retry (name, O_RDONLY);
5511 /* Note: we don't test the above call for failure;
5512 we just pass the FD on as given. Sometimes there is
5513 no file, so the open may return failure, but that's
5517 fd = ioctl (pi->ctl_fd, PIOCOPENM, &map->pr_vaddr);
5518 /* Note: we don't test the above call for failure;
5519 we just pass the FD on as given. Sometimes there is
5520 no file, so the ioctl may return failure, but that's
5523 return (*func) (fd, (CORE_ADDR) map->pr_vaddr);
5527 * Function: find_memory_regions_callback
5529 * Implements the to_find_memory_regions method.
5530 * Calls an external function for each memory region.
5531 * External function will have the signiture:
5533 * int callback (CORE_ADDR vaddr,
5534 * unsigned long size,
5535 * int read, int write, int execute,
5538 * Returns the integer value returned by the callback.
5542 find_memory_regions_callback (struct prmap *map,
5543 int (*func) (CORE_ADDR,
5549 return (*func) ((CORE_ADDR) map->pr_vaddr,
5551 (map->pr_mflags & MA_READ) != 0,
5552 (map->pr_mflags & MA_WRITE) != 0,
5553 (map->pr_mflags & MA_EXEC) != 0,
5558 * Function: proc_find_memory_regions
5560 * External interface. Calls a callback function once for each
5561 * mapped memory region in the child process, passing as arguments
5562 * CORE_ADDR virtual_address,
5563 * unsigned long size,
5564 * int read, TRUE if region is readable by the child
5565 * int write, TRUE if region is writable by the child
5566 * int execute TRUE if region is executable by the child.
5568 * Stops iterating and returns the first non-zero value
5569 * returned by the callback.
5573 proc_find_memory_regions (int (*func) (CORE_ADDR,
5579 procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5581 return iterate_over_mappings (pi, func, data,
5582 find_memory_regions_callback);
5585 /* Remove the breakpoint that we inserted in __dbx_link().
5586 Does nothing if the breakpoint hasn't been inserted or has already
5590 remove_dbx_link_breakpoint (void)
5592 if (dbx_link_bpt_addr == 0)
5595 if (deprecated_remove_raw_breakpoint (target_gdbarch, dbx_link_bpt) != 0)
5596 warning (_("Unable to remove __dbx_link breakpoint."));
5598 dbx_link_bpt_addr = 0;
5599 dbx_link_bpt = NULL;
5602 /* Return the address of the __dbx_link() function in the file
5603 refernced by ABFD by scanning its symbol table. Return 0 if
5604 the symbol was not found. */
5607 dbx_link_addr (bfd *abfd)
5609 long storage_needed;
5610 asymbol **symbol_table;
5611 long number_of_symbols;
5614 storage_needed = bfd_get_symtab_upper_bound (abfd);
5615 if (storage_needed <= 0)
5618 symbol_table = (asymbol **) xmalloc (storage_needed);
5619 make_cleanup (xfree, symbol_table);
5621 number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
5623 for (i = 0; i < number_of_symbols; i++)
5625 asymbol *sym = symbol_table[i];
5627 if ((sym->flags & BSF_GLOBAL)
5628 && sym->name != NULL && strcmp (sym->name, "__dbx_link") == 0)
5629 return (sym->value + sym->section->vma);
5632 /* Symbol not found, return NULL. */
5636 /* Search the symbol table of the file referenced by FD for a symbol
5637 named __dbx_link(). If found, then insert a breakpoint at this location,
5638 and return nonzero. Return zero otherwise. */
5641 insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored)
5644 long storage_needed;
5647 abfd = bfd_fdopenr ("unamed", 0, fd);
5650 warning (_("Failed to create a bfd: %s."), bfd_errmsg (bfd_get_error ()));
5654 if (!bfd_check_format (abfd, bfd_object))
5656 /* Not the correct format, so we can not possibly find the dbx_link
5662 sym_addr = dbx_link_addr (abfd);
5665 /* Insert the breakpoint. */
5666 dbx_link_bpt_addr = sym_addr;
5667 dbx_link_bpt = deprecated_insert_raw_breakpoint (target_gdbarch,
5669 if (dbx_link_bpt == NULL)
5671 warning (_("Failed to insert dbx_link breakpoint."));
5683 /* If the given memory region MAP contains a symbol named __dbx_link,
5684 insert a breakpoint at this location and return nonzero. Return
5688 insert_dbx_link_bpt_in_region (struct prmap *map,
5689 int (*child_func) (),
5692 procinfo *pi = (procinfo *) data;
5694 /* We know the symbol we're looking for is in a text region, so
5695 only look for it if the region is a text one. */
5696 if (map->pr_mflags & MA_EXEC)
5697 return solib_mappings_callback (map, insert_dbx_link_bpt_in_file, pi);
5702 /* Search all memory regions for a symbol named __dbx_link. If found,
5703 insert a breakpoint at its location, and return nonzero. Return zero
5707 insert_dbx_link_breakpoint (procinfo *pi)
5709 return iterate_over_mappings (pi, NULL, pi, insert_dbx_link_bpt_in_region);
5713 * Function: mappingflags
5715 * Returns an ascii representation of a memory mapping's flags.
5719 mappingflags (long flags)
5721 static char asciiflags[8];
5723 strcpy (asciiflags, "-------");
5724 #if defined (MA_PHYS)
5725 if (flags & MA_PHYS)
5726 asciiflags[0] = 'd';
5728 if (flags & MA_STACK)
5729 asciiflags[1] = 's';
5730 if (flags & MA_BREAK)
5731 asciiflags[2] = 'b';
5732 if (flags & MA_SHARED)
5733 asciiflags[3] = 's';
5734 if (flags & MA_READ)
5735 asciiflags[4] = 'r';
5736 if (flags & MA_WRITE)
5737 asciiflags[5] = 'w';
5738 if (flags & MA_EXEC)
5739 asciiflags[6] = 'x';
5740 return (asciiflags);
5744 * Function: info_mappings_callback
5746 * Callback function, does the actual work for 'info proc mappings'.
5750 info_mappings_callback (struct prmap *map, int (*ignore) (), void *unused)
5752 unsigned int pr_off;
5754 #ifdef PCAGENT /* Horrible hack: only defined on Solaris 2.6+ */
5755 pr_off = (unsigned int) map->pr_offset;
5757 pr_off = map->pr_off;
5760 if (gdbarch_addr_bit (target_gdbarch) == 32)
5761 printf_filtered ("\t%#10lx %#10lx %#10lx %#10x %7s\n",
5762 (unsigned long) map->pr_vaddr,
5763 (unsigned long) map->pr_vaddr + map->pr_size - 1,
5764 (unsigned long) map->pr_size,
5766 mappingflags (map->pr_mflags));
5768 printf_filtered (" %#18lx %#18lx %#10lx %#10x %7s\n",
5769 (unsigned long) map->pr_vaddr,
5770 (unsigned long) map->pr_vaddr + map->pr_size - 1,
5771 (unsigned long) map->pr_size,
5773 mappingflags (map->pr_mflags));
5779 * Function: info_proc_mappings
5781 * Implement the "info proc mappings" subcommand.
5785 info_proc_mappings (procinfo *pi, int summary)
5788 return; /* No output for summary mode. */
5790 printf_filtered (_("Mapped address spaces:\n\n"));
5791 if (gdbarch_ptr_bit (target_gdbarch) == 32)
5792 printf_filtered ("\t%10s %10s %10s %10s %7s\n",
5799 printf_filtered (" %18s %18s %10s %10s %7s\n",
5806 iterate_over_mappings (pi, NULL, NULL, info_mappings_callback);
5807 printf_filtered ("\n");
5811 * Function: info_proc_cmd
5813 * Implement the "info proc" command.
5817 info_proc_cmd (char *args, int from_tty)
5819 struct cleanup *old_chain;
5820 procinfo *process = NULL;
5821 procinfo *thread = NULL;
5828 old_chain = make_cleanup (null_cleanup, 0);
5831 argv = gdb_buildargv (args);
5832 make_cleanup_freeargv (argv);
5834 while (argv != NULL && *argv != NULL)
5836 if (isdigit (argv[0][0]))
5838 pid = strtoul (argv[0], &tmp, 10);
5840 tid = strtoul (++tmp, NULL, 10);
5842 else if (argv[0][0] == '/')
5844 tid = strtoul (argv[0] + 1, NULL, 10);
5846 else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0)
5857 pid = PIDGET (inferior_ptid);
5859 error (_("No current process: you must name one."));
5862 /* Have pid, will travel.
5863 First see if it's a process we're already debugging. */
5864 process = find_procinfo (pid, 0);
5865 if (process == NULL)
5867 /* No. So open a procinfo for it, but
5868 remember to close it again when finished. */
5869 process = create_procinfo (pid, 0);
5870 make_cleanup (do_destroy_procinfo_cleanup, process);
5871 if (!open_procinfo_files (process, FD_CTL))
5872 proc_error (process, "info proc, open_procinfo_files", __LINE__);
5876 thread = create_procinfo (pid, tid);
5880 printf_filtered (_("process %d flags:\n"), process->pid);
5881 proc_prettyprint_flags (proc_flags (process), 1);
5882 if (proc_flags (process) & (PR_STOPPED | PR_ISTOP))
5883 proc_prettyprint_why (proc_why (process), proc_what (process), 1);
5884 if (proc_get_nthreads (process) > 1)
5885 printf_filtered ("Process has %d threads.\n",
5886 proc_get_nthreads (process));
5890 printf_filtered (_("thread %d flags:\n"), thread->tid);
5891 proc_prettyprint_flags (proc_flags (thread), 1);
5892 if (proc_flags (thread) & (PR_STOPPED | PR_ISTOP))
5893 proc_prettyprint_why (proc_why (thread), proc_what (thread), 1);
5898 info_proc_mappings (process, 0);
5901 do_cleanups (old_chain);
5904 /* Modify the status of the system call identified by SYSCALLNUM in
5905 the set of syscalls that are currently traced/debugged.
5907 If ENTRY_OR_EXIT is set to PR_SYSENTRY, then the entry syscalls set
5908 will be updated. Otherwise, the exit syscalls set will be updated.
5910 If MODE is FLAG_SET, then traces will be enabled. Otherwise, they
5911 will be disabled. */
5914 proc_trace_syscalls_1 (procinfo *pi, int syscallnum, int entry_or_exit,
5915 int mode, int from_tty)
5919 if (entry_or_exit == PR_SYSENTRY)
5920 sysset = proc_get_traced_sysentry (pi, NULL);
5922 sysset = proc_get_traced_sysexit (pi, NULL);
5925 proc_error (pi, "proc-trace, get_traced_sysset", __LINE__);
5927 if (mode == FLAG_SET)
5928 gdb_praddsysset (sysset, syscallnum);
5930 gdb_prdelsysset (sysset, syscallnum);
5932 if (entry_or_exit == PR_SYSENTRY)
5934 if (!proc_set_traced_sysentry (pi, sysset))
5935 proc_error (pi, "proc-trace, set_traced_sysentry", __LINE__);
5939 if (!proc_set_traced_sysexit (pi, sysset))
5940 proc_error (pi, "proc-trace, set_traced_sysexit", __LINE__);
5945 proc_trace_syscalls (char *args, int from_tty, int entry_or_exit, int mode)
5949 if (PIDGET (inferior_ptid) <= 0)
5950 error (_("you must be debugging a process to use this command."));
5952 if (args == NULL || args[0] == 0)
5953 error_no_arg (_("system call to trace"));
5955 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5956 if (isdigit (args[0]))
5958 const int syscallnum = atoi (args);
5960 proc_trace_syscalls_1 (pi, syscallnum, entry_or_exit, mode, from_tty);
5965 proc_trace_sysentry_cmd (char *args, int from_tty)
5967 proc_trace_syscalls (args, from_tty, PR_SYSENTRY, FLAG_SET);
5971 proc_trace_sysexit_cmd (char *args, int from_tty)
5973 proc_trace_syscalls (args, from_tty, PR_SYSEXIT, FLAG_SET);
5977 proc_untrace_sysentry_cmd (char *args, int from_tty)
5979 proc_trace_syscalls (args, from_tty, PR_SYSENTRY, FLAG_RESET);
5983 proc_untrace_sysexit_cmd (char *args, int from_tty)
5985 proc_trace_syscalls (args, from_tty, PR_SYSEXIT, FLAG_RESET);
5990 _initialize_procfs (void)
5992 add_info ("proc", info_proc_cmd, _("\
5993 Show /proc process information about any running process.\n\
5994 Specify process id, or use the program being debugged by default.\n\
5995 Specify keyword 'mappings' for detailed info on memory mappings."));
5996 add_com ("proc-trace-entry", no_class, proc_trace_sysentry_cmd,
5997 _("Give a trace of entries into the syscall."));
5998 add_com ("proc-trace-exit", no_class, proc_trace_sysexit_cmd,
5999 _("Give a trace of exits from the syscall."));
6000 add_com ("proc-untrace-entry", no_class, proc_untrace_sysentry_cmd,
6001 _("Cancel a trace of entries into the syscall."));
6002 add_com ("proc-untrace-exit", no_class, proc_untrace_sysexit_cmd,
6003 _("Cancel a trace of exits from the syscall."));
6006 /* =================== END, GDB "MODULE" =================== */
6010 /* miscellaneous stubs: */
6011 /* The following satisfy a few random symbols mostly created by */
6012 /* the solaris threads implementation, which I will chase down */
6016 * Return a pid for which we guarantee
6017 * we will be able to find a 'live' procinfo.
6021 procfs_first_available (void)
6023 return pid_to_ptid (procinfo_list ? procinfo_list->pid : -1);
6027 find_signalled_thread (struct thread_info *info, void *data)
6029 if (info->stop_signal != TARGET_SIGNAL_0
6030 && ptid_get_pid (info->ptid) == ptid_get_pid (inferior_ptid))
6036 static enum target_signal
6037 find_stop_signal (void)
6039 struct thread_info *info =
6040 iterate_over_threads (find_signalled_thread, NULL);
6043 return info->stop_signal;
6045 return TARGET_SIGNAL_0;
6048 /* =================== GCORE .NOTE "MODULE" =================== */
6049 #if defined (UNIXWARE) || defined (PIOCOPENLWP) || defined (PCAGENT)
6050 /* gcore only implemented on solaris and unixware (so far) */
6053 procfs_do_thread_registers (bfd *obfd, ptid_t ptid,
6054 char *note_data, int *note_size,
6055 enum target_signal stop_signal)
6057 struct regcache *regcache = get_thread_regcache (ptid);
6058 gdb_gregset_t gregs;
6059 gdb_fpregset_t fpregs;
6060 unsigned long merged_pid;
6062 merged_pid = TIDGET (ptid) << 16 | PIDGET (ptid);
6064 fill_gregset (regcache, &gregs, -1);
6065 #if defined (UNIXWARE)
6066 note_data = (char *) elfcore_write_lwpstatus (obfd,
6073 note_data = (char *) elfcore_write_prstatus (obfd,
6080 fill_fpregset (regcache, &fpregs, -1);
6081 note_data = (char *) elfcore_write_prfpreg (obfd,
6089 struct procfs_corefile_thread_data {
6093 enum target_signal stop_signal;
6097 procfs_corefile_thread_callback (procinfo *pi, procinfo *thread, void *data)
6099 struct procfs_corefile_thread_data *args = data;
6103 ptid_t saved_ptid = inferior_ptid;
6104 inferior_ptid = MERGEPID (pi->pid, thread->tid);
6105 args->note_data = procfs_do_thread_registers (args->obfd, inferior_ptid,
6109 inferior_ptid = saved_ptid;
6115 procfs_make_note_section (bfd *obfd, int *note_size)
6117 struct cleanup *old_chain;
6118 gdb_gregset_t gregs;
6119 gdb_fpregset_t fpregs;
6120 char fname[16] = {'\0'};
6121 char psargs[80] = {'\0'};
6122 procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
6123 char *note_data = NULL;
6125 struct procfs_corefile_thread_data thread_args;
6129 if (get_exec_file (0))
6131 strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
6132 strncpy (psargs, get_exec_file (0),
6135 inf_args = get_inferior_args ();
6136 if (inf_args && *inf_args &&
6137 strlen (inf_args) < ((int) sizeof (psargs) - (int) strlen (psargs)))
6139 strncat (psargs, " ",
6140 sizeof (psargs) - strlen (psargs));
6141 strncat (psargs, inf_args,
6142 sizeof (psargs) - strlen (psargs));
6146 note_data = (char *) elfcore_write_prpsinfo (obfd,
6153 fill_gregset (get_current_regcache (), &gregs, -1);
6154 note_data = elfcore_write_pstatus (obfd, note_data, note_size,
6155 PIDGET (inferior_ptid),
6156 stop_signal, &gregs);
6159 thread_args.obfd = obfd;
6160 thread_args.note_data = note_data;
6161 thread_args.note_size = note_size;
6162 thread_args.stop_signal = find_stop_signal ();
6163 proc_iterate_over_threads (pi, procfs_corefile_thread_callback, &thread_args);
6165 /* There should be always at least one thread. */
6166 gdb_assert (thread_args.note_data != note_data);
6167 note_data = thread_args.note_data;
6169 auxv_len = target_read_alloc (¤t_target, TARGET_OBJECT_AUXV,
6173 note_data = elfcore_write_note (obfd, note_data, note_size,
6174 "CORE", NT_AUXV, auxv, auxv_len);
6178 make_cleanup (xfree, note_data);
6181 #else /* !(Solaris or Unixware) */
6183 procfs_make_note_section (bfd *obfd, int *note_size)
6185 error (_("gcore not implemented for this host."));
6186 return NULL; /* lint */
6188 #endif /* Solaris or Unixware */
6189 /* =================== END GCORE .NOTE "MODULE" =================== */