* breakpoint.c (update_watchpoint, _initialize_breakpoint): Remove
[external/binutils.git] / gdb / procfs.c
1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
2
3    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5
6    Written by Michael Snyder at Cygnus Solutions.
7    Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
8
9    This file is part of GDB.
10
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.
15
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.
20
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/>.  */
23
24 #include "defs.h"
25 #include "inferior.h"
26 #include "target.h"
27 #include "gdbcore.h"
28 #include "elf-bfd.h"            /* for elfcore_write_* */
29 #include "gdbcmd.h"
30 #include "gdbthread.h"
31 #include "regcache.h"
32 #include "inf-child.h"
33
34 #if defined (NEW_PROC_API)
35 #define _STRUCTURED_PROC 1      /* Should be done by configure script. */
36 #endif
37
38 #include <sys/procfs.h>
39 #ifdef HAVE_SYS_FAULT_H
40 #include <sys/fault.h>
41 #endif
42 #ifdef HAVE_SYS_SYSCALL_H
43 #include <sys/syscall.h>
44 #endif
45 #include <sys/errno.h>
46 #include "gdb_wait.h"
47 #include <signal.h>
48 #include <ctype.h>
49 #include "gdb_string.h"
50 #include "gdb_assert.h"
51 #include "inflow.h"
52 #include "auxv.h"
53 #include "procfs.h"
54 #include "observer.h"
55
56 /* This module provides the interface between GDB and the
57    /proc file system, which is used on many versions of Unix
58    as a means for debuggers to control other processes.
59
60    Examples of the systems that use this interface are:
61
62      Irix
63      Solaris
64      OSF
65      Unixware
66      AIX5
67
68    /proc works by imitating a file system: you open a simulated file
69    that represents the process you wish to interact with, and perform
70    operations on that "file" in order to examine or change the state
71    of the other process.
72
73    The most important thing to know about /proc and this module is
74    that there are two very different interfaces to /proc:
75
76      One that uses the ioctl system call, and another that uses read
77      and write system calls.
78
79    This module has to support both /proc interfaces.  This means that
80    there are two different ways of doing every basic operation.
81
82    In order to keep most of the code simple and clean, I have defined
83    an interface "layer" which hides all these system calls.  An ifdef
84    (NEW_PROC_API) determines which interface we are using, and most or
85    all occurrances of this ifdef should be confined to this interface
86    layer.  */
87
88 /* Determine which /proc API we are using: The ioctl API defines
89    PIOCSTATUS, while the read/write (multiple fd) API never does.  */
90
91 #ifdef NEW_PROC_API
92 #include <sys/types.h>
93 #include "gdb_dirent.h" /* opendir/readdir, for listing the LWP's */
94 #endif
95
96 #include <fcntl.h>      /* for O_RDONLY */
97 #include <unistd.h>     /* for "X_OK" */
98 #include "gdb_stat.h"   /* for struct stat */
99
100 /* Note: procfs-utils.h must be included after the above system header
101    files, because it redefines various system calls using macros.
102    This may be incompatible with the prototype declarations.  */
103
104 #include "proc-utils.h"
105
106 /* Prototypes for supply_gregset etc.  */
107 #include "gregset.h"
108
109 /* =================== TARGET_OPS "MODULE" =================== */
110
111 /* This module defines the GDB target vector and its methods.  */
112
113 static void procfs_attach (struct target_ops *, char *, int);
114 static void procfs_detach (struct target_ops *, char *, int);
115 static void procfs_resume (struct target_ops *,
116                            ptid_t, int, enum target_signal);
117 static void procfs_stop (ptid_t);
118 static void procfs_files_info (struct target_ops *);
119 static void procfs_fetch_registers (struct target_ops *,
120                                     struct regcache *, int);
121 static void procfs_store_registers (struct target_ops *,
122                                     struct regcache *, int);
123 static void procfs_notice_signals (ptid_t);
124 static void procfs_kill_inferior (struct target_ops *ops);
125 static void procfs_mourn_inferior (struct target_ops *ops);
126 static void procfs_create_inferior (struct target_ops *, char *,
127                                     char *, char **, int);
128 static ptid_t procfs_wait (struct target_ops *,
129                            ptid_t, struct target_waitstatus *, int);
130 static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
131                                struct mem_attrib *attrib,
132                                struct target_ops *);
133 static LONGEST procfs_xfer_partial (struct target_ops *ops,
134                                     enum target_object object,
135                                     const char *annex,
136                                     gdb_byte *readbuf, const gdb_byte *writebuf,
137                                     ULONGEST offset, LONGEST len);
138
139 static int procfs_thread_alive (struct target_ops *ops, ptid_t);
140
141 void procfs_find_new_threads (struct target_ops *ops);
142 char *procfs_pid_to_str (struct target_ops *, ptid_t);
143
144 static int proc_find_memory_regions (int (*) (CORE_ADDR,
145                                               unsigned long,
146                                               int, int, int,
147                                               void *),
148                                      void *);
149
150 static char * procfs_make_note_section (bfd *, int *);
151
152 static int procfs_can_use_hw_breakpoint (int, int, int);
153
154 #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
155 /* When GDB is built as 64-bit application on Solaris, the auxv data
156    is presented in 64-bit format.  We need to provide a custom parser
157    to handle that.  */
158 static int
159 procfs_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
160                    gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
161 {
162   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
163   gdb_byte *ptr = *readptr;
164
165   if (endptr == ptr)
166     return 0;
167
168   if (endptr - ptr < 8 * 2)
169     return -1;
170
171   *typep = extract_unsigned_integer (ptr, 4, byte_order);
172   ptr += 8;
173   /* The size of data is always 64-bit.  If the application is 32-bit,
174      it will be zero extended, as expected.  */
175   *valp = extract_unsigned_integer (ptr, 8, byte_order);
176   ptr += 8;
177
178   *readptr = ptr;
179   return 1;
180 }
181 #endif
182
183 struct target_ops *
184 procfs_target (void)
185 {
186   struct target_ops *t = inf_child_target ();
187
188   t->to_shortname = "procfs";
189   t->to_longname = "Unix /proc child process";
190   t->to_doc =
191     "Unix /proc child process (started by the \"run\" command).";
192   t->to_create_inferior = procfs_create_inferior;
193   t->to_kill = procfs_kill_inferior;
194   t->to_mourn_inferior = procfs_mourn_inferior;
195   t->to_attach = procfs_attach;
196   t->to_detach = procfs_detach;
197   t->to_wait = procfs_wait;
198   t->to_resume = procfs_resume;
199   t->to_fetch_registers = procfs_fetch_registers;
200   t->to_store_registers = procfs_store_registers;
201   t->to_xfer_partial = procfs_xfer_partial;
202   t->deprecated_xfer_memory = procfs_xfer_memory;
203   t->to_notice_signals = procfs_notice_signals;
204   t->to_files_info = procfs_files_info;
205   t->to_stop = procfs_stop;
206
207   t->to_find_new_threads = procfs_find_new_threads;
208   t->to_thread_alive = procfs_thread_alive;
209   t->to_pid_to_str = procfs_pid_to_str;
210
211   t->to_has_thread_control = tc_schedlock;
212   t->to_find_memory_regions = proc_find_memory_regions;
213   t->to_make_corefile_notes = procfs_make_note_section;
214
215 #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
216   t->to_auxv_parse = procfs_auxv_parse;
217 #endif
218
219   t->to_magic = OPS_MAGIC;
220
221   return t;
222 }
223
224 /* =================== END, TARGET_OPS "MODULE" =================== */
225
226 /* World Unification:
227
228    Put any typedefs, defines etc. here that are required for the
229    unification of code that handles different versions of /proc.  */
230
231 #ifdef NEW_PROC_API             /* Solaris 7 && 8 method for watchpoints */
232 #ifdef WA_READ
233      enum { READ_WATCHFLAG  = WA_READ,
234             WRITE_WATCHFLAG = WA_WRITE,
235             EXEC_WATCHFLAG  = WA_EXEC,
236             AFTER_WATCHFLAG = WA_TRAPAFTER
237      };
238 #endif
239 #else                           /* Irix method for watchpoints */
240      enum { READ_WATCHFLAG  = MA_READ,
241             WRITE_WATCHFLAG = MA_WRITE,
242             EXEC_WATCHFLAG  = MA_EXEC,
243             AFTER_WATCHFLAG = 0         /* trapafter not implemented */
244      };
245 #endif
246
247 /* gdb_sigset_t */
248 #ifdef HAVE_PR_SIGSET_T
249 typedef pr_sigset_t gdb_sigset_t;
250 #else
251 typedef sigset_t gdb_sigset_t;
252 #endif
253
254 /* sigaction */
255 #ifdef HAVE_PR_SIGACTION64_T
256 typedef pr_sigaction64_t gdb_sigaction_t;
257 #else
258 typedef struct sigaction gdb_sigaction_t;
259 #endif
260
261 /* siginfo */
262 #ifdef HAVE_PR_SIGINFO64_T
263 typedef pr_siginfo64_t gdb_siginfo_t;
264 #else
265 typedef struct siginfo gdb_siginfo_t;
266 #endif
267
268 /* On mips-irix, praddset and prdelset are defined in such a way that
269    they return a value, which causes GCC to emit a -Wunused error
270    because the returned value is not used.  Prevent this warning
271    by casting the return value to void.  On sparc-solaris, this issue
272    does not exist because the definition of these macros already include
273    that cast to void.  */
274 #define gdb_praddset(sp, flag) ((void) praddset (sp, flag))
275 #define gdb_prdelset(sp, flag) ((void) prdelset (sp, flag))
276
277 /* gdb_premptysysset */
278 #ifdef premptysysset
279 #define gdb_premptysysset premptysysset
280 #else
281 #define gdb_premptysysset premptyset
282 #endif
283
284 /* praddsysset */
285 #ifdef praddsysset
286 #define gdb_praddsysset praddsysset
287 #else
288 #define gdb_praddsysset gdb_praddset
289 #endif
290
291 /* prdelsysset */
292 #ifdef prdelsysset
293 #define gdb_prdelsysset prdelsysset
294 #else
295 #define gdb_prdelsysset gdb_prdelset
296 #endif
297
298 /* prissyssetmember */
299 #ifdef prissyssetmember
300 #define gdb_pr_issyssetmember prissyssetmember
301 #else
302 #define gdb_pr_issyssetmember prismember
303 #endif
304
305 /* As a feature test, saying ``#if HAVE_PRSYSENT_T'' everywhere isn't
306    as intuitively descriptive as it could be, so we'll define
307    DYNAMIC_SYSCALLS to mean the same thing.  Anyway, at the time of
308    this writing, this feature is only found on AIX5 systems and
309    basically means that the set of syscalls is not fixed.  I.e,
310    there's no nice table that one can #include to get all of the
311    syscall numbers.  Instead, they're stored in /proc/PID/sysent
312    for each process.  We are at least guaranteed that they won't
313    change over the lifetime of the process.  But each process could
314    (in theory) have different syscall numbers.  */
315 #ifdef HAVE_PRSYSENT_T
316 #define DYNAMIC_SYSCALLS
317 #endif
318
319
320
321 /* =================== STRUCT PROCINFO "MODULE" =================== */
322
323      /* FIXME: this comment will soon be out of date W.R.T. threads.  */
324
325 /* The procinfo struct is a wrapper to hold all the state information
326    concerning a /proc process.  There should be exactly one procinfo
327    for each process, and since GDB currently can debug only one
328    process at a time, that means there should be only one procinfo.
329    All of the LWP's of a process can be accessed indirectly thru the
330    single process procinfo.
331
332    However, against the day when GDB may debug more than one process,
333    this data structure is kept in a list (which for now will hold no
334    more than one member), and many functions will have a pointer to a
335    procinfo as an argument.
336
337    There will be a separate procinfo structure for use by the (not yet
338    implemented) "info proc" command, so that we can print useful
339    information about any random process without interfering with the
340    inferior's procinfo information. */
341
342 #ifdef NEW_PROC_API
343 /* format strings for /proc paths */
344 # ifndef CTL_PROC_NAME_FMT
345 #  define MAIN_PROC_NAME_FMT   "/proc/%d"
346 #  define CTL_PROC_NAME_FMT    "/proc/%d/ctl"
347 #  define AS_PROC_NAME_FMT     "/proc/%d/as"
348 #  define MAP_PROC_NAME_FMT    "/proc/%d/map"
349 #  define STATUS_PROC_NAME_FMT "/proc/%d/status"
350 #  define MAX_PROC_NAME_SIZE sizeof("/proc/99999/lwp/8096/lstatus")
351 # endif
352 /* the name of the proc status struct depends on the implementation */
353 typedef pstatus_t   gdb_prstatus_t;
354 typedef lwpstatus_t gdb_lwpstatus_t;
355 #else /* ! NEW_PROC_API */
356 /* format strings for /proc paths */
357 # ifndef CTL_PROC_NAME_FMT
358 #  define MAIN_PROC_NAME_FMT   "/proc/%05d"
359 #  define CTL_PROC_NAME_FMT    "/proc/%05d"
360 #  define AS_PROC_NAME_FMT     "/proc/%05d"
361 #  define MAP_PROC_NAME_FMT    "/proc/%05d"
362 #  define STATUS_PROC_NAME_FMT "/proc/%05d"
363 #  define MAX_PROC_NAME_SIZE sizeof("/proc/ttttppppp")
364 # endif
365 /* the name of the proc status struct depends on the implementation */
366 typedef prstatus_t gdb_prstatus_t;
367 typedef prstatus_t gdb_lwpstatus_t;
368 #endif /* NEW_PROC_API */
369
370 typedef struct procinfo {
371   struct procinfo *next;
372   int pid;                      /* Process ID    */
373   int tid;                      /* Thread/LWP id */
374
375   /* process state */
376   int was_stopped;
377   int ignore_next_sigstop;
378
379   /* The following four fd fields may be identical, or may contain
380      several different fd's, depending on the version of /proc
381      (old ioctl or new read/write).  */
382
383   int ctl_fd;                   /* File descriptor for /proc control file */
384
385   /* The next three file descriptors are actually only needed in the
386      read/write, multiple-file-descriptor implemenation
387      (NEW_PROC_API).  However, to avoid a bunch of #ifdefs in the
388      code, we will use them uniformly by (in the case of the ioctl
389      single-file-descriptor implementation) filling them with copies
390      of the control fd.  */
391   int status_fd;                /* File descriptor for /proc status file */
392   int as_fd;                    /* File descriptor for /proc as file */
393
394   char pathname[MAX_PROC_NAME_SIZE];    /* Pathname to /proc entry */
395
396   fltset_t saved_fltset;        /* Saved traced hardware fault set */
397   gdb_sigset_t saved_sigset;    /* Saved traced signal set */
398   gdb_sigset_t saved_sighold;   /* Saved held signal set */
399   sysset_t *saved_exitset;      /* Saved traced system call exit set */
400   sysset_t *saved_entryset;     /* Saved traced system call entry set */
401
402   gdb_prstatus_t prstatus;      /* Current process status info */
403
404 #ifndef NEW_PROC_API
405   gdb_fpregset_t fpregset;      /* Current floating point registers */
406 #endif
407
408 #ifdef DYNAMIC_SYSCALLS
409   int num_syscalls;             /* Total number of syscalls */
410   char **syscall_names;         /* Syscall number to name map */
411 #endif
412
413   struct procinfo *thread_list;
414
415   int status_valid : 1;
416   int gregs_valid  : 1;
417   int fpregs_valid : 1;
418   int threads_valid: 1;
419 } procinfo;
420
421 static char errmsg[128];        /* shared error msg buffer */
422
423 /* Function prototypes for procinfo module: */
424
425 static procinfo *find_procinfo_or_die (int pid, int tid);
426 static procinfo *find_procinfo (int pid, int tid);
427 static procinfo *create_procinfo (int pid, int tid);
428 static void destroy_procinfo (procinfo * p);
429 static void do_destroy_procinfo_cleanup (void *);
430 static void dead_procinfo (procinfo * p, char *msg, int killp);
431 static int open_procinfo_files (procinfo * p, int which);
432 static void close_procinfo_files (procinfo * p);
433 static int sysset_t_size (procinfo *p);
434 static sysset_t *sysset_t_alloc (procinfo * pi);
435 #ifdef DYNAMIC_SYSCALLS
436 static void load_syscalls (procinfo *pi);
437 static void free_syscalls (procinfo *pi);
438 static int find_syscall (procinfo *pi, char *name);
439 #endif /* DYNAMIC_SYSCALLS */
440
441 /* A function type used as a callback back iterate_over_mappings.  */
442 typedef int (iterate_over_mappings_cb_ftype)
443   (CORE_ADDR vaddr, unsigned long size, int read, int write, int execute,
444    void *data);
445
446 static int iterate_over_mappings
447   (procinfo *pi,
448    iterate_over_mappings_cb_ftype *child_func,
449    void *data,
450    int (*func) (struct prmap *map,
451                 iterate_over_mappings_cb_ftype *child_func,
452                 void *data));
453
454 /* The head of the procinfo list: */
455 static procinfo * procinfo_list;
456
457 /* Search the procinfo list.  Return a pointer to procinfo, or NULL if
458    not found.  */
459
460 static procinfo *
461 find_procinfo (int pid, int tid)
462 {
463   procinfo *pi;
464
465   for (pi = procinfo_list; pi; pi = pi->next)
466     if (pi->pid == pid)
467       break;
468
469   if (pi)
470     if (tid)
471       {
472         /* Don't check threads_valid.  If we're updating the
473            thread_list, we want to find whatever threads are already
474            here.  This means that in general it is the caller's
475            responsibility to check threads_valid and update before
476            calling find_procinfo, if the caller wants to find a new
477            thread.  */
478
479         for (pi = pi->thread_list; pi; pi = pi->next)
480           if (pi->tid == tid)
481             break;
482       }
483
484   return pi;
485 }
486
487 /* Calls find_procinfo, but errors on failure.  */
488
489 static procinfo *
490 find_procinfo_or_die (int pid, int tid)
491 {
492   procinfo *pi = find_procinfo (pid, tid);
493
494   if (pi == NULL)
495     {
496       if (tid)
497         error (_("\
498 procfs: couldn't find pid %d (kernel thread %d) in procinfo list."),
499                pid, tid);
500       else
501         error (_("procfs: couldn't find pid %d in procinfo list."), pid);
502     }
503   return pi;
504 }
505
506 /* Wrapper for `open'.  The appropriate open call is attempted; if
507    unsuccessful, it will be retried as many times as needed for the
508    EAGAIN and EINTR conditions.
509
510    For other conditions, retry the open a limited number of times.  In
511    addition, a short sleep is imposed prior to retrying the open.  The
512    reason for this sleep is to give the kernel a chance to catch up
513    and create the file in question in the event that GDB "wins" the
514    race to open a file before the kernel has created it.  */
515
516 static int
517 open_with_retry (const char *pathname, int flags)
518 {
519   int retries_remaining, status;
520
521   retries_remaining = 2;
522
523   while (1)
524     {
525       status = open (pathname, flags);
526
527       if (status >= 0 || retries_remaining == 0)
528         break;
529       else if (errno != EINTR && errno != EAGAIN)
530         {
531           retries_remaining--;
532           sleep (1);
533         }
534     }
535
536   return status;
537 }
538
539 /* Open the file descriptor for the process or LWP.  If NEW_PROC_API
540    is defined, we only open the control file descriptor; the others
541    are opened lazily as needed.  Otherwise (if not NEW_PROC_API),
542    there is only one real file descriptor, but we keep multiple copies
543    of it so that the code that uses them does not have to be #ifdef'd.
544    Returns the file descriptor, or zero for failure.  */
545
546 enum { FD_CTL, FD_STATUS, FD_AS };
547
548 static int
549 open_procinfo_files (procinfo *pi, int which)
550 {
551 #ifdef NEW_PROC_API
552   char tmp[MAX_PROC_NAME_SIZE];
553 #endif
554   int  fd;
555
556   /* This function is getting ALMOST long enough to break up into
557      several.  Here is some rationale:
558
559      NEW_PROC_API (Solaris 2.6, Solaris 2.7, Unixware):
560      There are several file descriptors that may need to be open
561        for any given process or LWP.  The ones we're intereted in are:
562          - control       (ctl)    write-only    change the state
563          - status        (status) read-only     query the state
564          - address space (as)     read/write    access memory
565          - map           (map)    read-only     virtual addr map
566        Most of these are opened lazily as they are needed.
567        The pathnames for the 'files' for an LWP look slightly
568        different from those of a first-class process:
569          Pathnames for a process (<proc-id>):
570            /proc/<proc-id>/ctl
571            /proc/<proc-id>/status
572            /proc/<proc-id>/as
573            /proc/<proc-id>/map
574          Pathnames for an LWP (lwp-id):
575            /proc/<proc-id>/lwp/<lwp-id>/lwpctl
576            /proc/<proc-id>/lwp/<lwp-id>/lwpstatus
577        An LWP has no map or address space file descriptor, since
578        the memory map and address space are shared by all LWPs.
579
580      Everyone else (Solaris 2.5, Irix, OSF)
581        There is only one file descriptor for each process or LWP.
582        For convenience, we copy the same file descriptor into all
583        three fields of the procinfo struct (ctl_fd, status_fd, and
584        as_fd, see NEW_PROC_API above) so that code that uses them
585        doesn't need any #ifdef's.
586          Pathname for all:
587            /proc/<proc-id>
588
589        Solaris 2.5 LWP's:
590          Each LWP has an independent file descriptor, but these
591          are not obtained via the 'open' system call like the rest:
592          instead, they're obtained thru an ioctl call (PIOCOPENLWP)
593          to the file descriptor of the parent process.
594
595        OSF threads:
596          These do not even have their own independent file descriptor.
597          All operations are carried out on the file descriptor of the
598          parent process.  Therefore we just call open again for each
599          thread, getting a new handle for the same 'file'.
600    */
601
602 #ifdef NEW_PROC_API
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
606      needed.  */
607
608   strcpy (tmp, pi->pathname);
609   switch (which) {      /* which file descriptor to open? */
610   case FD_CTL:
611     if (pi->tid)
612       strcat (tmp, "/lwpctl");
613     else
614       strcat (tmp, "/ctl");
615     fd = open_with_retry (tmp, O_WRONLY);
616     if (fd <= 0)
617       return 0;         /* fail */
618     pi->ctl_fd = fd;
619     break;
620   case FD_AS:
621     if (pi->tid)
622       return 0;         /* there is no 'as' file descriptor for an lwp */
623     strcat (tmp, "/as");
624     fd = open_with_retry (tmp, O_RDWR);
625     if (fd <= 0)
626       return 0;         /* fail */
627     pi->as_fd = fd;
628     break;
629   case FD_STATUS:
630     if (pi->tid)
631       strcat (tmp, "/lwpstatus");
632     else
633       strcat (tmp, "/status");
634     fd = open_with_retry (tmp, O_RDONLY);
635     if (fd <= 0)
636       return 0;         /* fail */
637     pi->status_fd = fd;
638     break;
639   default:
640     return 0;           /* unknown file descriptor */
641   }
642 #else  /* not NEW_PROC_API */
643   /* In this case, there is only one file descriptor for each procinfo
644      (ie. each process or LWP).  In fact, only the file descriptor for
645      the process can actually be opened by an 'open' system call.  The
646      ones for the LWPs have to be obtained thru an IOCTL call on the
647      process's file descriptor.
648
649      For convenience, we copy each procinfo's single file descriptor
650      into all of the fields occupied by the several file descriptors
651      of the NEW_PROC_API implementation.  That way, the code that uses
652      them can be written without ifdefs.  */
653
654
655 #ifdef PIOCTSTATUS      /* OSF */
656   /* Only one FD; just open it. */
657   if ((fd = open_with_retry (pi->pathname, O_RDWR)) == 0)
658     return 0;
659 #else                   /* Sol 2.5, Irix, other? */
660   if (pi->tid == 0)     /* Master procinfo for the process */
661     {
662       fd = open_with_retry (pi->pathname, O_RDWR);
663       if (fd <= 0)
664         return 0;       /* fail */
665     }
666   else                  /* LWP thread procinfo */
667     {
668 #ifdef PIOCOPENLWP      /* Sol 2.5, thread/LWP */
669       procinfo *process;
670       int lwpid = pi->tid;
671
672       /* Find the procinfo for the entire process. */
673       if ((process = find_procinfo (pi->pid, 0)) == NULL)
674         return 0;       /* fail */
675
676       /* Now obtain the file descriptor for the LWP. */
677       if ((fd = ioctl (process->ctl_fd, PIOCOPENLWP, &lwpid)) <= 0)
678         return 0;       /* fail */
679 #else                   /* Irix, other? */
680       return 0;         /* Don't know how to open threads */
681 #endif  /* Sol 2.5 PIOCOPENLWP */
682     }
683 #endif  /* OSF     PIOCTSTATUS */
684   pi->ctl_fd = pi->as_fd = pi->status_fd = fd;
685 #endif  /* NEW_PROC_API */
686
687   return 1;             /* success */
688 }
689
690 /* Allocate a data structure and link it into the procinfo list.
691    First tries to find a pre-existing one (FIXME: why?).  Returns the
692    pointer to new procinfo struct.  */
693
694 static procinfo *
695 create_procinfo (int pid, int tid)
696 {
697   procinfo *pi, *parent = NULL;
698
699   if ((pi = find_procinfo (pid, tid)))
700     return pi;                  /* Already exists, nothing to do. */
701
702   /* find parent before doing malloc, to save having to cleanup */
703   if (tid != 0)
704     parent = find_procinfo_or_die (pid, 0);     /* FIXME: should I
705                                                    create it if it
706                                                    doesn't exist yet? */
707
708   pi = (procinfo *) xmalloc (sizeof (procinfo));
709   memset (pi, 0, sizeof (procinfo));
710   pi->pid = pid;
711   pi->tid = tid;
712
713 #ifdef DYNAMIC_SYSCALLS
714   load_syscalls (pi);
715 #endif
716
717   pi->saved_entryset = sysset_t_alloc (pi);
718   pi->saved_exitset = sysset_t_alloc (pi);
719
720   /* Chain into list.  */
721   if (tid == 0)
722     {
723       sprintf (pi->pathname, MAIN_PROC_NAME_FMT, pid);
724       pi->next = procinfo_list;
725       procinfo_list = pi;
726     }
727   else
728     {
729 #ifdef NEW_PROC_API
730       sprintf (pi->pathname, "/proc/%05d/lwp/%d", pid, tid);
731 #else
732       sprintf (pi->pathname, MAIN_PROC_NAME_FMT, pid);
733 #endif
734       pi->next = parent->thread_list;
735       parent->thread_list = pi;
736     }
737   return pi;
738 }
739
740 /* Close all file descriptors associated with the procinfo.  */
741
742 static void
743 close_procinfo_files (procinfo *pi)
744 {
745   if (pi->ctl_fd > 0)
746     close (pi->ctl_fd);
747 #ifdef NEW_PROC_API
748   if (pi->as_fd > 0)
749     close (pi->as_fd);
750   if (pi->status_fd > 0)
751     close (pi->status_fd);
752 #endif
753   pi->ctl_fd = pi->as_fd = pi->status_fd = 0;
754 }
755
756 /* Destructor function.  Close, unlink and deallocate the object.  */
757
758 static void
759 destroy_one_procinfo (procinfo **list, procinfo *pi)
760 {
761   procinfo *ptr;
762
763   /* Step one: unlink the procinfo from its list.  */
764   if (pi == *list)
765     *list = pi->next;
766   else
767     for (ptr = *list; ptr; ptr = ptr->next)
768       if (ptr->next == pi)
769         {
770           ptr->next =  pi->next;
771           break;
772         }
773
774   /* Step two: close any open file descriptors.  */
775   close_procinfo_files (pi);
776
777   /* Step three: free the memory.  */
778 #ifdef DYNAMIC_SYSCALLS
779   free_syscalls (pi);
780 #endif
781   xfree (pi->saved_entryset);
782   xfree (pi->saved_exitset);
783   xfree (pi);
784 }
785
786 static void
787 destroy_procinfo (procinfo *pi)
788 {
789   procinfo *tmp;
790
791   if (pi->tid != 0)     /* destroy a thread procinfo */
792     {
793       tmp = find_procinfo (pi->pid, 0); /* find the parent process */
794       destroy_one_procinfo (&tmp->thread_list, pi);
795     }
796   else                  /* destroy a process procinfo and all its threads */
797     {
798       /* First destroy the children, if any; */
799       while (pi->thread_list != NULL)
800         destroy_one_procinfo (&pi->thread_list, pi->thread_list);
801       /* Then destroy the parent.  Genocide!!!  */
802       destroy_one_procinfo (&procinfo_list, pi);
803     }
804 }
805
806 static void
807 do_destroy_procinfo_cleanup (void *pi)
808 {
809   destroy_procinfo (pi);
810 }
811
812 enum { NOKILL, KILL };
813
814 /* To be called on a non_recoverable error for a procinfo.  Prints
815    error messages, optionally sends a SIGKILL to the process, then
816    destroys the data structure.  */
817
818 static void
819 dead_procinfo (procinfo *pi, char *msg, int kill_p)
820 {
821   char procfile[80];
822
823   if (pi->pathname)
824     {
825       print_sys_errmsg (pi->pathname, errno);
826     }
827   else
828     {
829       sprintf (procfile, "process %d", pi->pid);
830       print_sys_errmsg (procfile, errno);
831     }
832   if (kill_p == KILL)
833     kill (pi->pid, SIGKILL);
834
835   destroy_procinfo (pi);
836   error ("%s", msg);
837 }
838
839 /* Returns the (complete) size of a sysset_t struct.  Normally, this
840    is just sizeof (sysset_t), but in the case of Monterey/64, the
841    actual size of sysset_t isn't known until runtime.  */
842
843 static int
844 sysset_t_size (procinfo * pi)
845 {
846 #ifndef DYNAMIC_SYSCALLS
847   return sizeof (sysset_t);
848 #else
849   return sizeof (sysset_t) - sizeof (uint64_t)
850     + sizeof (uint64_t) * ((pi->num_syscalls + (8 * sizeof (uint64_t) - 1))
851                            / (8 * sizeof (uint64_t)));
852 #endif
853 }
854
855 /* Allocate and (partially) initialize a sysset_t struct.  */
856
857 static sysset_t *
858 sysset_t_alloc (procinfo * pi)
859 {
860   sysset_t *ret;
861   int size = sysset_t_size (pi);
862
863   ret = xmalloc (size);
864 #ifdef DYNAMIC_SYSCALLS
865   ret->pr_size = ((pi->num_syscalls + (8 * sizeof (uint64_t) - 1))
866                   / (8 * sizeof (uint64_t)));
867 #endif
868   return ret;
869 }
870
871 #ifdef DYNAMIC_SYSCALLS
872
873 /* Extract syscall numbers and names from /proc/<pid>/sysent.  Initialize
874    pi->num_syscalls with the number of syscalls and pi->syscall_names
875    with the names.  (Certain numbers may be skipped in which case the
876    names for these numbers will be left as NULL.) */
877
878 #define MAX_SYSCALL_NAME_LENGTH 256
879 #define MAX_SYSCALLS 65536
880
881 static void
882 load_syscalls (procinfo *pi)
883 {
884   char pathname[MAX_PROC_NAME_SIZE];
885   int sysent_fd;
886   prsysent_t header;
887   prsyscall_t *syscalls;
888   int i, size, maxcall;
889
890   pi->num_syscalls = 0;
891   pi->syscall_names = 0;
892
893   /* Open the file descriptor for the sysent file.  */
894   sprintf (pathname, "/proc/%d/sysent", pi->pid);
895   sysent_fd = open_with_retry (pathname, O_RDONLY);
896   if (sysent_fd < 0)
897     {
898       error (_("load_syscalls: Can't open /proc/%d/sysent"), pi->pid);
899     }
900
901   size = sizeof header - sizeof (prsyscall_t);
902   if (read (sysent_fd, &header, size) != size)
903     {
904       error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid);
905     }
906
907   if (header.pr_nsyscalls == 0)
908     {
909       error (_("\
910 load_syscalls: /proc/%d/sysent contains no syscalls!"), pi->pid);
911     }
912
913   size = header.pr_nsyscalls * sizeof (prsyscall_t);
914   syscalls = xmalloc (size);
915
916   if (read (sysent_fd, syscalls, size) != size)
917     {
918       xfree (syscalls);
919       error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid);
920     }
921
922   /* Find maximum syscall number.  This may not be the same as
923      pr_nsyscalls since that value refers to the number of entries
924      in the table.  (Also, the docs indicate that some system
925      call numbers may be skipped.) */
926
927   maxcall = syscalls[0].pr_number;
928
929   for (i = 1; i <  header.pr_nsyscalls; i++)
930     if (syscalls[i].pr_number > maxcall
931         && syscalls[i].pr_nameoff > 0
932         && syscalls[i].pr_number < MAX_SYSCALLS)
933       maxcall = syscalls[i].pr_number;
934
935   pi->num_syscalls = maxcall+1;
936   pi->syscall_names = xmalloc (pi->num_syscalls * sizeof (char *));
937
938   for (i = 0; i < pi->num_syscalls; i++)
939     pi->syscall_names[i] = NULL;
940
941   /* Read the syscall names in.  */
942   for (i = 0; i < header.pr_nsyscalls; i++)
943     {
944       char namebuf[MAX_SYSCALL_NAME_LENGTH];
945       int nread;
946       int callnum;
947
948       if (syscalls[i].pr_number >= MAX_SYSCALLS
949           || syscalls[i].pr_number < 0
950           || syscalls[i].pr_nameoff <= 0
951           || (lseek (sysent_fd, (off_t) syscalls[i].pr_nameoff, SEEK_SET)
952                                        != (off_t) syscalls[i].pr_nameoff))
953         continue;
954
955       nread = read (sysent_fd, namebuf, sizeof namebuf);
956       if (nread <= 0)
957         continue;
958
959       callnum = syscalls[i].pr_number;
960
961       if (pi->syscall_names[callnum] != NULL)
962         {
963           /* FIXME: Generate warning */
964           continue;
965         }
966
967       namebuf[nread-1] = '\0';
968       size = strlen (namebuf) + 1;
969       pi->syscall_names[callnum] = xmalloc (size);
970       strncpy (pi->syscall_names[callnum], namebuf, size-1);
971       pi->syscall_names[callnum][size-1] = '\0';
972     }
973
974   close (sysent_fd);
975   xfree (syscalls);
976 }
977
978 /* Free the space allocated for the syscall names from the procinfo
979    structure.  */
980
981 static void
982 free_syscalls (procinfo *pi)
983 {
984   if (pi->syscall_names)
985     {
986       int i;
987
988       for (i = 0; i < pi->num_syscalls; i++)
989         if (pi->syscall_names[i] != NULL)
990           xfree (pi->syscall_names[i]);
991
992       xfree (pi->syscall_names);
993       pi->syscall_names = 0;
994     }
995 }
996
997 /* Given a name, look up (and return) the corresponding syscall number.
998    If no match is found, return -1.  */
999
1000 static int
1001 find_syscall (procinfo *pi, char *name)
1002 {
1003   int i;
1004
1005   for (i = 0; i < pi->num_syscalls; i++)
1006     {
1007       if (pi->syscall_names[i] && strcmp (name, pi->syscall_names[i]) == 0)
1008         return i;
1009     }
1010   return -1;
1011 }
1012 #endif
1013
1014 /* =================== END, STRUCT PROCINFO "MODULE" =================== */
1015
1016 /* ===================  /proc  "MODULE" =================== */
1017
1018 /* This "module" is the interface layer between the /proc system API
1019    and the gdb target vector functions.  This layer consists of access
1020    functions that encapsulate each of the basic operations that we
1021    need to use from the /proc API.
1022
1023    The main motivation for this layer is to hide the fact that there
1024    are two very different implementations of the /proc API.  Rather
1025    than have a bunch of #ifdefs all thru the gdb target vector
1026    functions, we do our best to hide them all in here.  */
1027
1028 int proc_get_status (procinfo * pi);
1029 long proc_flags (procinfo * pi);
1030 int proc_why (procinfo * pi);
1031 int proc_what (procinfo * pi);
1032 int proc_set_run_on_last_close (procinfo * pi);
1033 int proc_unset_run_on_last_close (procinfo * pi);
1034 int proc_set_inherit_on_fork (procinfo * pi);
1035 int proc_unset_inherit_on_fork (procinfo * pi);
1036 int proc_set_async (procinfo * pi);
1037 int proc_unset_async (procinfo * pi);
1038 int proc_stop_process (procinfo * pi);
1039 int proc_trace_signal (procinfo * pi, int signo);
1040 int proc_ignore_signal (procinfo * pi, int signo);
1041 int proc_clear_current_fault (procinfo * pi);
1042 int proc_set_current_signal (procinfo * pi, int signo);
1043 int proc_clear_current_signal (procinfo * pi);
1044 int proc_set_gregs (procinfo * pi);
1045 int proc_set_fpregs (procinfo * pi);
1046 int proc_wait_for_stop (procinfo * pi);
1047 int proc_run_process (procinfo * pi, int step, int signo);
1048 int proc_kill (procinfo * pi, int signo);
1049 int proc_parent_pid (procinfo * pi);
1050 int proc_get_nthreads (procinfo * pi);
1051 int proc_get_current_thread (procinfo * pi);
1052 int proc_set_held_signals (procinfo * pi, gdb_sigset_t * sighold);
1053 int proc_set_traced_sysexit (procinfo * pi, sysset_t * sysset);
1054 int proc_set_traced_sysentry (procinfo * pi, sysset_t * sysset);
1055 int proc_set_traced_faults (procinfo * pi, fltset_t * fltset);
1056 int proc_set_traced_signals (procinfo * pi, gdb_sigset_t * sigset);
1057
1058 int proc_update_threads (procinfo * pi);
1059 int proc_iterate_over_threads (procinfo * pi,
1060                                int (*func) (procinfo *, procinfo *, void *),
1061                                void *ptr);
1062
1063 gdb_gregset_t *proc_get_gregs (procinfo * pi);
1064 gdb_fpregset_t *proc_get_fpregs (procinfo * pi);
1065 sysset_t *proc_get_traced_sysexit (procinfo * pi, sysset_t * save);
1066 sysset_t *proc_get_traced_sysentry (procinfo * pi, sysset_t * save);
1067 fltset_t *proc_get_traced_faults (procinfo * pi, fltset_t * save);
1068 gdb_sigset_t *proc_get_traced_signals (procinfo * pi, gdb_sigset_t * save);
1069 gdb_sigset_t *proc_get_held_signals (procinfo * pi, gdb_sigset_t * save);
1070 gdb_sigset_t *proc_get_pending_signals (procinfo * pi, gdb_sigset_t * save);
1071 gdb_sigaction_t *proc_get_signal_actions (procinfo * pi, gdb_sigaction_t *save);
1072
1073 void proc_warn (procinfo * pi, char *func, int line);
1074 void proc_error (procinfo * pi, char *func, int line);
1075
1076 void
1077 proc_warn (procinfo *pi, char *func, int line)
1078 {
1079   sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
1080   print_sys_errmsg (errmsg, errno);
1081 }
1082
1083 void
1084 proc_error (procinfo *pi, char *func, int line)
1085 {
1086   sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
1087   perror_with_name (errmsg);
1088 }
1089
1090 /* Updates the status struct in the procinfo.  There is a 'valid'
1091    flag, to let other functions know when this function needs to be
1092    called (so the status is only read when it is needed).  The status
1093    file descriptor is also only opened when it is needed.  Returns
1094    non-zero for success, zero for failure.  */
1095
1096 int
1097 proc_get_status (procinfo *pi)
1098 {
1099   /* Status file descriptor is opened "lazily" */
1100   if (pi->status_fd == 0 &&
1101       open_procinfo_files (pi, FD_STATUS) == 0)
1102     {
1103       pi->status_valid = 0;
1104       return 0;
1105     }
1106
1107 #ifdef NEW_PROC_API
1108   if (lseek (pi->status_fd, 0, SEEK_SET) < 0)
1109     pi->status_valid = 0;                       /* fail */
1110   else
1111     {
1112       /* Sigh... I have to read a different data structure,
1113          depending on whether this is a main process or an LWP. */
1114       if (pi->tid)
1115         pi->status_valid = (read (pi->status_fd,
1116                                   (char *) &pi->prstatus.pr_lwp,
1117                                   sizeof (lwpstatus_t))
1118                             == sizeof (lwpstatus_t));
1119       else
1120         {
1121           pi->status_valid = (read (pi->status_fd,
1122                                     (char *) &pi->prstatus,
1123                                     sizeof (gdb_prstatus_t))
1124                               == sizeof (gdb_prstatus_t));
1125 #if 0 /*def UNIXWARE*/
1126           if (pi->status_valid &&
1127               (pi->prstatus.pr_lwp.pr_flags & PR_ISTOP) &&
1128               pi->prstatus.pr_lwp.pr_why == PR_REQUESTED)
1129             /* Unixware peculiarity -- read the damn thing again! */
1130             pi->status_valid = (read (pi->status_fd,
1131                                       (char *) &pi->prstatus,
1132                                       sizeof (gdb_prstatus_t))
1133                                 == sizeof (gdb_prstatus_t));
1134 #endif /* UNIXWARE */
1135         }
1136     }
1137 #else   /* ioctl method */
1138 #ifdef PIOCTSTATUS      /* osf */
1139   if (pi->tid == 0)     /* main process */
1140     {
1141       /* Just read the danged status.  Now isn't that simple? */
1142       pi->status_valid =
1143         (ioctl (pi->status_fd, PIOCSTATUS, &pi->prstatus) >= 0);
1144     }
1145   else
1146     {
1147       int win;
1148       struct {
1149         long pr_count;
1150         tid_t pr_error_thread;
1151         struct prstatus status;
1152       } thread_status;
1153
1154       thread_status.pr_count = 1;
1155       thread_status.status.pr_tid = pi->tid;
1156       win = (ioctl (pi->status_fd, PIOCTSTATUS, &thread_status) >= 0);
1157       if (win)
1158         {
1159           memcpy (&pi->prstatus, &thread_status.status,
1160                   sizeof (pi->prstatus));
1161           pi->status_valid = 1;
1162         }
1163     }
1164 #else
1165   /* Just read the danged status.  Now isn't that simple?  */
1166   pi->status_valid = (ioctl (pi->status_fd, PIOCSTATUS, &pi->prstatus) >= 0);
1167 #endif
1168 #endif
1169
1170   if (pi->status_valid)
1171     {
1172       PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1173                                 proc_why (pi),
1174                                 proc_what (pi),
1175                                 proc_get_current_thread (pi));
1176     }
1177
1178   /* The status struct includes general regs, so mark them valid too.  */
1179   pi->gregs_valid  = pi->status_valid;
1180 #ifdef NEW_PROC_API
1181   /* In the read/write multiple-fd model, the status struct includes
1182      the fp regs too, so mark them valid too.  */
1183   pi->fpregs_valid = pi->status_valid;
1184 #endif
1185   return pi->status_valid;      /* True if success, false if failure.  */
1186 }
1187
1188 /* Returns the process flags (pr_flags field).  */
1189
1190 long
1191 proc_flags (procinfo *pi)
1192 {
1193   if (!pi->status_valid)
1194     if (!proc_get_status (pi))
1195       return 0; /* FIXME: not a good failure value (but what is?) */
1196
1197 #ifdef NEW_PROC_API
1198 # ifdef UNIXWARE
1199   /* UnixWare 7.1 puts process status flags, e.g. PR_ASYNC, in
1200      pstatus_t and LWP status flags, e.g. PR_STOPPED, in lwpstatus_t.
1201      The two sets of flags don't overlap.  */
1202   return pi->prstatus.pr_flags | pi->prstatus.pr_lwp.pr_flags;
1203 # else
1204   return pi->prstatus.pr_lwp.pr_flags;
1205 # endif
1206 #else
1207   return pi->prstatus.pr_flags;
1208 #endif
1209 }
1210
1211 /* Returns the pr_why field (why the process stopped).  */
1212
1213 int
1214 proc_why (procinfo *pi)
1215 {
1216   if (!pi->status_valid)
1217     if (!proc_get_status (pi))
1218       return 0; /* FIXME: not a good failure value (but what is?) */
1219
1220 #ifdef NEW_PROC_API
1221   return pi->prstatus.pr_lwp.pr_why;
1222 #else
1223   return pi->prstatus.pr_why;
1224 #endif
1225 }
1226
1227 /* Returns the pr_what field (details of why the process stopped).  */
1228
1229 int
1230 proc_what (procinfo *pi)
1231 {
1232   if (!pi->status_valid)
1233     if (!proc_get_status (pi))
1234       return 0; /* FIXME: not a good failure value (but what is?) */
1235
1236 #ifdef NEW_PROC_API
1237   return pi->prstatus.pr_lwp.pr_what;
1238 #else
1239   return pi->prstatus.pr_what;
1240 #endif
1241 }
1242
1243 /* This function is only called when PI is stopped by a watchpoint.
1244    Assuming the OS supports it, write to *ADDR the data address which
1245    triggered it and return 1.  Return 0 if it is not possible to know
1246    the address.  */
1247
1248 static int
1249 proc_watchpoint_address (procinfo *pi, CORE_ADDR *addr)
1250 {
1251   if (!pi->status_valid)
1252     if (!proc_get_status (pi))
1253       return 0;
1254
1255 #ifdef NEW_PROC_API
1256   *addr = (CORE_ADDR) gdbarch_pointer_to_address (target_gdbarch,
1257             builtin_type (target_gdbarch)->builtin_data_ptr,
1258             (gdb_byte *) &pi->prstatus.pr_lwp.pr_info.si_addr);
1259 #else
1260   *addr = (CORE_ADDR) gdbarch_pointer_to_address (target_gdbarch,
1261             builtin_type (target_gdbarch)->builtin_data_ptr,
1262             (gdb_byte *) &pi->prstatus.pr_info.si_addr);
1263 #endif
1264   return 1;
1265 }
1266
1267 #ifndef PIOCSSPCACT     /* The following is not supported on OSF.  */
1268
1269 /* Returns the pr_nsysarg field (number of args to the current
1270    syscall).  */
1271
1272 int
1273 proc_nsysarg (procinfo *pi)
1274 {
1275   if (!pi->status_valid)
1276     if (!proc_get_status (pi))
1277       return 0;
1278
1279 #ifdef NEW_PROC_API
1280   return pi->prstatus.pr_lwp.pr_nsysarg;
1281 #else
1282   return pi->prstatus.pr_nsysarg;
1283 #endif
1284 }
1285
1286 /* Returns the pr_sysarg field (pointer to the arguments of current
1287    syscall).  */
1288
1289 long *
1290 proc_sysargs (procinfo *pi)
1291 {
1292   if (!pi->status_valid)
1293     if (!proc_get_status (pi))
1294       return NULL;
1295
1296 #ifdef NEW_PROC_API
1297   return (long *) &pi->prstatus.pr_lwp.pr_sysarg;
1298 #else
1299   return (long *) &pi->prstatus.pr_sysarg;
1300 #endif
1301 }
1302
1303 /* Returns the pr_syscall field (id of current syscall if we are in
1304    one).  */
1305
1306 int
1307 proc_syscall (procinfo *pi)
1308 {
1309   if (!pi->status_valid)
1310     if (!proc_get_status (pi))
1311       return 0;
1312
1313 #ifdef NEW_PROC_API
1314   return pi->prstatus.pr_lwp.pr_syscall;
1315 #else
1316   return pi->prstatus.pr_syscall;
1317 #endif
1318 }
1319 #endif /* PIOCSSPCACT */
1320
1321 /* Returns the pr_cursig field (current signal).  */
1322
1323 long
1324 proc_cursig (struct procinfo *pi)
1325 {
1326   if (!pi->status_valid)
1327     if (!proc_get_status (pi))
1328       return 0; /* FIXME: not a good failure value (but what is?) */
1329
1330 #ifdef NEW_PROC_API
1331   return pi->prstatus.pr_lwp.pr_cursig;
1332 #else
1333   return pi->prstatus.pr_cursig;
1334 #endif
1335 }
1336
1337 /* === I appologize for the messiness of this function.
1338    === This is an area where the different versions of
1339    === /proc are more inconsistent than usual.
1340
1341    Set or reset any of the following process flags:
1342       PR_FORK   -- forked child will inherit trace flags
1343       PR_RLC    -- traced process runs when last /proc file closed.
1344       PR_KLC    -- traced process is killed when last /proc file closed.
1345       PR_ASYNC  -- LWP's get to run/stop independently.
1346
1347    There are three methods for doing this function:
1348    1) Newest: read/write [PCSET/PCRESET/PCUNSET]
1349       [Sol6, Sol7, UW]
1350    2) Middle: PIOCSET/PIOCRESET
1351       [Irix, Sol5]
1352    3) Oldest: PIOCSFORK/PIOCRFORK/PIOCSRLC/PIOCRRLC
1353       [OSF, Sol5]
1354
1355    Note: Irix does not define PR_ASYNC.
1356    Note: OSF  does not define PR_KLC.
1357    Note: OSF  is the only one that can ONLY use the oldest method.
1358
1359    Arguments:
1360       pi   -- the procinfo
1361       flag -- one of PR_FORK, PR_RLC, or PR_ASYNC
1362       mode -- 1 for set, 0 for reset.
1363
1364    Returns non-zero for success, zero for failure.  */
1365
1366 enum { FLAG_RESET, FLAG_SET };
1367
1368 static int
1369 proc_modify_flag (procinfo *pi, long flag, long mode)
1370 {
1371   long win = 0;         /* default to fail */
1372
1373   /* These operations affect the process as a whole, and applying them
1374      to an individual LWP has the same meaning as applying them to the
1375      main process.  Therefore, if we're ever called with a pointer to
1376      an LWP's procinfo, let's substitute the process's procinfo and
1377      avoid opening the LWP's file descriptor unnecessarily.  */
1378
1379   if (pi->pid != 0)
1380     pi = find_procinfo_or_die (pi->pid, 0);
1381
1382 #ifdef NEW_PROC_API     /* Newest method: UnixWare and newer Solarii */
1383   /* First normalize the PCUNSET/PCRESET command opcode
1384      (which for no obvious reason has a different definition
1385      from one operating system to the next...)  */
1386 #ifdef  PCUNSET
1387 #define GDBRESET PCUNSET
1388 #else
1389 #ifdef  PCRESET
1390 #define GDBRESET PCRESET
1391 #endif
1392 #endif
1393   {
1394     procfs_ctl_t arg[2];
1395
1396     if (mode == FLAG_SET)       /* Set the flag (RLC, FORK, or ASYNC) */
1397       arg[0] = PCSET;
1398     else                        /* Reset the flag */
1399       arg[0] = GDBRESET;
1400
1401     arg[1] = flag;
1402     win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
1403   }
1404 #else
1405 #ifdef PIOCSET          /* Irix/Sol5 method */
1406   if (mode == FLAG_SET) /* Set the flag (hopefully RLC, FORK, or ASYNC) */
1407     {
1408       win = (ioctl (pi->ctl_fd, PIOCSET, &flag)   >= 0);
1409     }
1410   else                  /* Reset the flag */
1411     {
1412       win = (ioctl (pi->ctl_fd, PIOCRESET, &flag) >= 0);
1413     }
1414
1415 #else
1416 #ifdef PIOCSRLC         /* Oldest method: OSF */
1417   switch (flag) {
1418   case PR_RLC:
1419     if (mode == FLAG_SET)       /* Set run-on-last-close */
1420       {
1421         win = (ioctl (pi->ctl_fd, PIOCSRLC, NULL) >= 0);
1422       }
1423     else                        /* Clear run-on-last-close */
1424       {
1425         win = (ioctl (pi->ctl_fd, PIOCRRLC, NULL) >= 0);
1426       }
1427     break;
1428   case PR_FORK:
1429     if (mode == FLAG_SET)       /* Set inherit-on-fork */
1430       {
1431         win = (ioctl (pi->ctl_fd, PIOCSFORK, NULL) >= 0);
1432       }
1433     else                        /* Clear inherit-on-fork */
1434       {
1435         win = (ioctl (pi->ctl_fd, PIOCRFORK, NULL) >= 0);
1436       }
1437     break;
1438   default:
1439     win = 0;            /* fail -- unknown flag (can't do PR_ASYNC) */
1440     break;
1441   }
1442 #endif
1443 #endif
1444 #endif
1445 #undef GDBRESET
1446   /* The above operation renders the procinfo's cached pstatus
1447      obsolete.  */
1448   pi->status_valid = 0;
1449
1450   if (!win)
1451     warning (_("procfs: modify_flag failed to turn %s %s"),
1452              flag == PR_FORK  ? "PR_FORK"  :
1453              flag == PR_RLC   ? "PR_RLC"   :
1454 #ifdef PR_ASYNC
1455              flag == PR_ASYNC ? "PR_ASYNC" :
1456 #endif
1457 #ifdef PR_KLC
1458              flag == PR_KLC   ? "PR_KLC"   :
1459 #endif
1460              "<unknown flag>",
1461              mode == FLAG_RESET ? "off" : "on");
1462
1463   return win;
1464 }
1465
1466 /* Set the run_on_last_close flag.  Process with all threads will
1467    become runnable when debugger closes all /proc fds.  Returns
1468    non-zero for success, zero for failure.  */
1469
1470 int
1471 proc_set_run_on_last_close (procinfo *pi)
1472 {
1473   return proc_modify_flag (pi, PR_RLC, FLAG_SET);
1474 }
1475
1476 /* Reset the run_on_last_close flag.  The process will NOT become
1477    runnable when debugger closes its file handles.  Returns non-zero
1478    for success, zero for failure.  */
1479
1480 int
1481 proc_unset_run_on_last_close (procinfo *pi)
1482 {
1483   return proc_modify_flag (pi, PR_RLC, FLAG_RESET);
1484 }
1485
1486 #ifdef PR_KLC
1487 /* Set the kill_on_last_close flag.  Process with all threads will be
1488    killed when debugger closes all /proc fds (or debugger exits or
1489    dies).  Returns non-zero for success, zero for failure.  */
1490
1491 int
1492 proc_set_kill_on_last_close (procinfo *pi)
1493 {
1494   return proc_modify_flag (pi, PR_KLC, FLAG_SET);
1495 }
1496
1497 /* Reset the kill_on_last_close flag.  Process will NOT be killed when
1498    debugger closes its file handles (or exits or dies).  Returns
1499    non-zero for success, zero for failure.  */
1500
1501 int
1502 proc_unset_kill_on_last_close (procinfo *pi)
1503 {
1504   return proc_modify_flag (pi, PR_KLC, FLAG_RESET);
1505 }
1506 #endif /* PR_KLC */
1507
1508 /* Set inherit_on_fork flag.  If the process forks a child while we
1509    are registered for events in the parent, then we will also recieve
1510    events from the child.  Returns non-zero for success, zero for
1511    failure.  */
1512
1513 int
1514 proc_set_inherit_on_fork (procinfo *pi)
1515 {
1516   return proc_modify_flag (pi, PR_FORK, FLAG_SET);
1517 }
1518
1519 /* Reset inherit_on_fork flag.  If the process forks a child while we
1520    are registered for events in the parent, then we will NOT recieve
1521    events from the child.  Returns non-zero for success, zero for
1522    failure.  */
1523
1524 int
1525 proc_unset_inherit_on_fork (procinfo *pi)
1526 {
1527   return proc_modify_flag (pi, PR_FORK, FLAG_RESET);
1528 }
1529
1530 #ifdef PR_ASYNC
1531 /* Set PR_ASYNC flag.  If one LWP stops because of a debug event
1532    (signal etc.), the remaining LWPs will continue to run.  Returns
1533    non-zero for success, zero for failure.  */
1534
1535 int
1536 proc_set_async (procinfo *pi)
1537 {
1538   return proc_modify_flag (pi, PR_ASYNC, FLAG_SET);
1539 }
1540
1541 /* Reset PR_ASYNC flag.  If one LWP stops because of a debug event
1542    (signal etc.), then all other LWPs will stop as well.  Returns
1543    non-zero for success, zero for failure.  */
1544
1545 int
1546 proc_unset_async (procinfo *pi)
1547 {
1548   return proc_modify_flag (pi, PR_ASYNC, FLAG_RESET);
1549 }
1550 #endif /* PR_ASYNC */
1551
1552 /* Request the process/LWP to stop.  Does not wait.  Returns non-zero
1553    for success, zero for failure.  */
1554
1555 int
1556 proc_stop_process (procinfo *pi)
1557 {
1558   int win;
1559
1560   /* We might conceivably apply this operation to an LWP, and the
1561      LWP's ctl file descriptor might not be open.  */
1562
1563   if (pi->ctl_fd == 0 &&
1564       open_procinfo_files (pi, FD_CTL) == 0)
1565     return 0;
1566   else
1567     {
1568 #ifdef NEW_PROC_API
1569       procfs_ctl_t cmd = PCSTOP;
1570
1571       win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1572 #else   /* ioctl method */
1573       win = (ioctl (pi->ctl_fd, PIOCSTOP, &pi->prstatus) >= 0);
1574       /* Note: the call also reads the prstatus.  */
1575       if (win)
1576         {
1577           pi->status_valid = 1;
1578           PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1579                                     proc_why (pi),
1580                                     proc_what (pi),
1581                                     proc_get_current_thread (pi));
1582         }
1583 #endif
1584     }
1585
1586   return win;
1587 }
1588
1589 /* Wait for the process or LWP to stop (block until it does).  Returns
1590    non-zero for success, zero for failure.  */
1591
1592 int
1593 proc_wait_for_stop (procinfo *pi)
1594 {
1595   int win;
1596
1597   /* We should never have to apply this operation to any procinfo
1598      except the one for the main process.  If that ever changes for
1599      any reason, then take out the following clause and replace it
1600      with one that makes sure the ctl_fd is open.  */
1601
1602   if (pi->tid != 0)
1603     pi = find_procinfo_or_die (pi->pid, 0);
1604
1605 #ifdef NEW_PROC_API
1606   {
1607     procfs_ctl_t cmd = PCWSTOP;
1608
1609     win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1610     /* We been runnin' and we stopped -- need to update status.  */
1611     pi->status_valid = 0;
1612   }
1613 #else   /* ioctl method */
1614   win = (ioctl (pi->ctl_fd, PIOCWSTOP, &pi->prstatus) >= 0);
1615   /* Above call also refreshes the prstatus.  */
1616   if (win)
1617     {
1618       pi->status_valid = 1;
1619       PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1620                                 proc_why (pi),
1621                                 proc_what (pi),
1622                                 proc_get_current_thread (pi));
1623     }
1624 #endif
1625
1626   return win;
1627 }
1628
1629 /* Make the process or LWP runnable.
1630
1631    Options (not all are implemented):
1632      - single-step
1633      - clear current fault
1634      - clear current signal
1635      - abort the current system call
1636      - stop as soon as finished with system call
1637      - (ioctl): set traced signal set
1638      - (ioctl): set held   signal set
1639      - (ioctl): set traced fault  set
1640      - (ioctl): set start pc (vaddr)
1641
1642    Always clears the current fault.  PI is the process or LWP to
1643    operate on.  If STEP is true, set the process or LWP to trap after
1644    one instruction.  If SIGNO is zero, clear the current signal if
1645    any; if non-zero, set the current signal to this one.  Returns
1646    non-zero for success, zero for failure.  */
1647
1648 int
1649 proc_run_process (procinfo *pi, int step, int signo)
1650 {
1651   int win;
1652   int runflags;
1653
1654   /* We will probably have to apply this operation to individual
1655      threads, so make sure the control file descriptor is open.  */
1656
1657   if (pi->ctl_fd == 0 &&
1658       open_procinfo_files (pi, FD_CTL) == 0)
1659     {
1660       return 0;
1661     }
1662
1663   runflags    = PRCFAULT;       /* always clear current fault  */
1664   if (step)
1665     runflags |= PRSTEP;
1666   if (signo == 0)
1667     runflags |= PRCSIG;
1668   else if (signo != -1)         /* -1 means do nothing W.R.T. signals */
1669     proc_set_current_signal (pi, signo);
1670
1671 #ifdef NEW_PROC_API
1672   {
1673     procfs_ctl_t cmd[2];
1674
1675     cmd[0]  = PCRUN;
1676     cmd[1]  = runflags;
1677     win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1678   }
1679 #else   /* ioctl method */
1680   {
1681     prrun_t prrun;
1682
1683     memset (&prrun, 0, sizeof (prrun));
1684     prrun.pr_flags  = runflags;
1685     win = (ioctl (pi->ctl_fd, PIOCRUN, &prrun) >= 0);
1686   }
1687 #endif
1688
1689   return win;
1690 }
1691
1692 /* Register to trace signals in the process or LWP.  Returns non-zero
1693    for success, zero for failure.  */
1694
1695 int
1696 proc_set_traced_signals (procinfo *pi, gdb_sigset_t *sigset)
1697 {
1698   int win;
1699
1700   /* We should never have to apply this operation to any procinfo
1701      except the one for the main process.  If that ever changes for
1702      any reason, then take out the following clause and replace it
1703      with one that makes sure the ctl_fd is open.  */
1704
1705   if (pi->tid != 0)
1706     pi = find_procinfo_or_die (pi->pid, 0);
1707
1708 #ifdef NEW_PROC_API
1709   {
1710     struct {
1711       procfs_ctl_t cmd;
1712       /* Use char array to avoid alignment issues.  */
1713       char sigset[sizeof (gdb_sigset_t)];
1714     } arg;
1715
1716     arg.cmd = PCSTRACE;
1717     memcpy (&arg.sigset, sigset, sizeof (gdb_sigset_t));
1718
1719     win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
1720   }
1721 #else   /* ioctl method */
1722   win = (ioctl (pi->ctl_fd, PIOCSTRACE, sigset) >= 0);
1723 #endif
1724   /* The above operation renders the procinfo's cached pstatus obsolete. */
1725   pi->status_valid = 0;
1726
1727   if (!win)
1728     warning (_("procfs: set_traced_signals failed"));
1729   return win;
1730 }
1731
1732 /* Register to trace hardware faults in the process or LWP.  Returns
1733    non-zero for success, zero for failure.  */
1734
1735 int
1736 proc_set_traced_faults (procinfo *pi, fltset_t *fltset)
1737 {
1738   int win;
1739
1740   /* We should never have to apply this operation to any procinfo
1741      except the one for the main process.  If that ever changes for
1742      any reason, then take out the following clause and replace it
1743      with one that makes sure the ctl_fd is open.  */
1744
1745   if (pi->tid != 0)
1746     pi = find_procinfo_or_die (pi->pid, 0);
1747
1748 #ifdef NEW_PROC_API
1749   {
1750     struct {
1751       procfs_ctl_t cmd;
1752       /* Use char array to avoid alignment issues.  */
1753       char fltset[sizeof (fltset_t)];
1754     } arg;
1755
1756     arg.cmd = PCSFAULT;
1757     memcpy (&arg.fltset, fltset, sizeof (fltset_t));
1758
1759     win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
1760   }
1761 #else   /* ioctl method */
1762   win = (ioctl (pi->ctl_fd, PIOCSFAULT, fltset) >= 0);
1763 #endif
1764   /* The above operation renders the procinfo's cached pstatus obsolete. */
1765   pi->status_valid = 0;
1766
1767   return win;
1768 }
1769
1770 /* Register to trace entry to system calls in the process or LWP.
1771    Returns non-zero for success, zero for failure.  */
1772
1773 int
1774 proc_set_traced_sysentry (procinfo *pi, sysset_t *sysset)
1775 {
1776   int win;
1777
1778   /* We should never have to apply this operation to any procinfo
1779      except the one for the main process.  If that ever changes for
1780      any reason, then take out the following clause and replace it
1781      with one that makes sure the ctl_fd is open.  */
1782
1783   if (pi->tid != 0)
1784     pi = find_procinfo_or_die (pi->pid, 0);
1785
1786 #ifdef NEW_PROC_API
1787   {
1788     struct gdb_proc_ctl_pcsentry {
1789       procfs_ctl_t cmd;
1790       /* Use char array to avoid alignment issues.  */
1791       char sysset[sizeof (sysset_t)];
1792     } *argp;
1793     int argp_size = sizeof (struct gdb_proc_ctl_pcsentry)
1794                   - sizeof (sysset_t)
1795                   + sysset_t_size (pi);
1796
1797     argp = xmalloc (argp_size);
1798
1799     argp->cmd = PCSENTRY;
1800     memcpy (&argp->sysset, sysset, sysset_t_size (pi));
1801
1802     win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
1803     xfree (argp);
1804   }
1805 #else   /* ioctl method */
1806   win = (ioctl (pi->ctl_fd, PIOCSENTRY, sysset) >= 0);
1807 #endif
1808   /* The above operation renders the procinfo's cached pstatus
1809      obsolete.  */
1810   pi->status_valid = 0;
1811
1812   return win;
1813 }
1814
1815 /* Register to trace exit from system calls in the process or LWP.
1816    Returns non-zero for success, zero for failure.  */
1817
1818 int
1819 proc_set_traced_sysexit (procinfo *pi, sysset_t *sysset)
1820 {
1821   int win;
1822
1823   /* We should never have to apply this operation to any procinfo
1824      except the one for the main process.  If that ever changes for
1825      any reason, then take out the following clause and replace it
1826      with one that makes sure the ctl_fd is open.  */
1827
1828   if (pi->tid != 0)
1829     pi = find_procinfo_or_die (pi->pid, 0);
1830
1831 #ifdef NEW_PROC_API
1832   {
1833     struct gdb_proc_ctl_pcsexit {
1834       procfs_ctl_t cmd;
1835       /* Use char array to avoid alignment issues.  */
1836       char sysset[sizeof (sysset_t)];
1837     } *argp;
1838     int argp_size = sizeof (struct gdb_proc_ctl_pcsexit)
1839                   - sizeof (sysset_t)
1840                   + sysset_t_size (pi);
1841
1842     argp = xmalloc (argp_size);
1843
1844     argp->cmd = PCSEXIT;
1845     memcpy (&argp->sysset, sysset, sysset_t_size (pi));
1846
1847     win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
1848     xfree (argp);
1849   }
1850 #else   /* ioctl method */
1851   win = (ioctl (pi->ctl_fd, PIOCSEXIT, sysset) >= 0);
1852 #endif
1853   /* The above operation renders the procinfo's cached pstatus
1854      obsolete.  */
1855   pi->status_valid = 0;
1856
1857   return win;
1858 }
1859
1860 /* Specify the set of blocked / held signals in the process or LWP.
1861    Returns non-zero for success, zero for failure.  */
1862
1863 int
1864 proc_set_held_signals (procinfo *pi, gdb_sigset_t *sighold)
1865 {
1866   int win;
1867
1868   /* We should never have to apply this operation to any procinfo
1869      except the one for the main process.  If that ever changes for
1870      any reason, then take out the following clause and replace it
1871      with one that makes sure the ctl_fd is open.  */
1872
1873   if (pi->tid != 0)
1874     pi = find_procinfo_or_die (pi->pid, 0);
1875
1876 #ifdef NEW_PROC_API
1877   {
1878     struct {
1879       procfs_ctl_t cmd;
1880       /* Use char array to avoid alignment issues.  */
1881       char hold[sizeof (gdb_sigset_t)];
1882     } arg;
1883
1884     arg.cmd  = PCSHOLD;
1885     memcpy (&arg.hold, sighold, sizeof (gdb_sigset_t));
1886     win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
1887   }
1888 #else
1889   win = (ioctl (pi->ctl_fd, PIOCSHOLD, sighold) >= 0);
1890 #endif
1891   /* The above operation renders the procinfo's cached pstatus
1892      obsolete.  */
1893   pi->status_valid = 0;
1894
1895   return win;
1896 }
1897
1898 /* Returns the set of signals that are pending in the process or LWP.
1899    Will also copy the sigset if SAVE is non-zero.  */
1900
1901 gdb_sigset_t *
1902 proc_get_pending_signals (procinfo *pi, gdb_sigset_t *save)
1903 {
1904   gdb_sigset_t *ret = NULL;
1905
1906   /* We should never have to apply this operation to any procinfo
1907      except the one for the main process.  If that ever changes for
1908      any reason, then take out the following clause and replace it
1909      with one that makes sure the ctl_fd is open.  */
1910
1911   if (pi->tid != 0)
1912     pi = find_procinfo_or_die (pi->pid, 0);
1913
1914   if (!pi->status_valid)
1915     if (!proc_get_status (pi))
1916       return NULL;
1917
1918 #ifdef NEW_PROC_API
1919   ret = &pi->prstatus.pr_lwp.pr_lwppend;
1920 #else
1921   ret = &pi->prstatus.pr_sigpend;
1922 #endif
1923   if (save && ret)
1924     memcpy (save, ret, sizeof (gdb_sigset_t));
1925
1926   return ret;
1927 }
1928
1929 /* Returns the set of signal actions.  Will also copy the sigactionset
1930    if SAVE is non-zero.  */
1931
1932 gdb_sigaction_t *
1933 proc_get_signal_actions (procinfo *pi, gdb_sigaction_t *save)
1934 {
1935   gdb_sigaction_t *ret = NULL;
1936
1937   /* We should never have to apply this operation to any procinfo
1938      except the one for the main process.  If that ever changes for
1939      any reason, then take out the following clause and replace it
1940      with one that makes sure the ctl_fd is open.  */
1941
1942   if (pi->tid != 0)
1943     pi = find_procinfo_or_die (pi->pid, 0);
1944
1945   if (!pi->status_valid)
1946     if (!proc_get_status (pi))
1947       return NULL;
1948
1949 #ifdef NEW_PROC_API
1950   ret = &pi->prstatus.pr_lwp.pr_action;
1951 #else
1952   ret = &pi->prstatus.pr_action;
1953 #endif
1954   if (save && ret)
1955     memcpy (save, ret, sizeof (gdb_sigaction_t));
1956
1957   return ret;
1958 }
1959
1960 /* Returns the set of signals that are held / blocked.  Will also copy
1961    the sigset if SAVE is non-zero.  */
1962
1963 gdb_sigset_t *
1964 proc_get_held_signals (procinfo *pi, gdb_sigset_t *save)
1965 {
1966   gdb_sigset_t *ret = NULL;
1967
1968   /* We should never have to apply this operation to any procinfo
1969      except the one for the main process.  If that ever changes for
1970      any reason, then take out the following clause and replace it
1971      with one that makes sure the ctl_fd is open.  */
1972
1973   if (pi->tid != 0)
1974     pi = find_procinfo_or_die (pi->pid, 0);
1975
1976 #ifdef NEW_PROC_API
1977   if (!pi->status_valid)
1978     if (!proc_get_status (pi))
1979       return NULL;
1980
1981 #ifdef UNIXWARE
1982   ret = &pi->prstatus.pr_lwp.pr_context.uc_sigmask;
1983 #else
1984   ret = &pi->prstatus.pr_lwp.pr_lwphold;
1985 #endif /* UNIXWARE */
1986 #else  /* not NEW_PROC_API */
1987   {
1988     static gdb_sigset_t sigheld;
1989
1990     if (ioctl (pi->ctl_fd, PIOCGHOLD, &sigheld) >= 0)
1991       ret = &sigheld;
1992   }
1993 #endif /* NEW_PROC_API */
1994   if (save && ret)
1995     memcpy (save, ret, sizeof (gdb_sigset_t));
1996
1997   return ret;
1998 }
1999
2000 /* Returns the set of signals that are traced / debugged.  Will also
2001    copy the sigset if SAVE is non-zero.  */
2002
2003 gdb_sigset_t *
2004 proc_get_traced_signals (procinfo *pi, gdb_sigset_t *save)
2005 {
2006   gdb_sigset_t *ret = NULL;
2007
2008   /* We should never have to apply this operation to any procinfo
2009      except the one for the main process.  If that ever changes for
2010      any reason, then take out the following clause and replace it
2011      with one that makes sure the ctl_fd is open.  */
2012
2013   if (pi->tid != 0)
2014     pi = find_procinfo_or_die (pi->pid, 0);
2015
2016 #ifdef NEW_PROC_API
2017   if (!pi->status_valid)
2018     if (!proc_get_status (pi))
2019       return NULL;
2020
2021   ret = &pi->prstatus.pr_sigtrace;
2022 #else
2023   {
2024     static gdb_sigset_t sigtrace;
2025
2026     if (ioctl (pi->ctl_fd, PIOCGTRACE, &sigtrace) >= 0)
2027       ret = &sigtrace;
2028   }
2029 #endif
2030   if (save && ret)
2031     memcpy (save, ret, sizeof (gdb_sigset_t));
2032
2033   return ret;
2034 }
2035
2036 /* Add SIGNO to the set of signals that are traced.  Returns non-zero
2037    for success, zero for failure.  */
2038
2039 int
2040 proc_trace_signal (procinfo *pi, int signo)
2041 {
2042   gdb_sigset_t temp;
2043
2044   /* We should never have to apply this operation to any procinfo
2045      except the one for the main process.  If that ever changes for
2046      any reason, then take out the following clause and replace it
2047      with one that makes sure the ctl_fd is open.  */
2048
2049   if (pi->tid != 0)
2050     pi = find_procinfo_or_die (pi->pid, 0);
2051
2052   if (pi)
2053     {
2054       if (proc_get_traced_signals (pi, &temp))
2055         {
2056           gdb_praddset (&temp, signo);
2057           return proc_set_traced_signals (pi, &temp);
2058         }
2059     }
2060
2061   return 0;     /* failure */
2062 }
2063
2064 /* Remove SIGNO from the set of signals that are traced.  Returns
2065    non-zero for success, zero for failure.  */
2066
2067 int
2068 proc_ignore_signal (procinfo *pi, int signo)
2069 {
2070   gdb_sigset_t temp;
2071
2072   /* We should never have to apply this operation to any procinfo
2073      except the one for the main process.  If that ever changes for
2074      any reason, then take out the following clause and replace it
2075      with one that makes sure the ctl_fd is open.  */
2076
2077   if (pi->tid != 0)
2078     pi = find_procinfo_or_die (pi->pid, 0);
2079
2080   if (pi)
2081     {
2082       if (proc_get_traced_signals (pi, &temp))
2083         {
2084           gdb_prdelset (&temp, signo);
2085           return proc_set_traced_signals (pi, &temp);
2086         }
2087     }
2088
2089   return 0;     /* failure */
2090 }
2091
2092 /* Returns the set of hardware faults that are traced /debugged.  Will
2093    also copy the faultset if SAVE is non-zero.  */
2094
2095 fltset_t *
2096 proc_get_traced_faults (procinfo *pi, fltset_t *save)
2097 {
2098   fltset_t *ret = NULL;
2099
2100   /* We should never have to apply this operation to any procinfo
2101      except the one for the main process.  If that ever changes for
2102      any reason, then take out the following clause and replace it
2103      with one that makes sure the ctl_fd is open.  */
2104
2105   if (pi->tid != 0)
2106     pi = find_procinfo_or_die (pi->pid, 0);
2107
2108 #ifdef NEW_PROC_API
2109   if (!pi->status_valid)
2110     if (!proc_get_status (pi))
2111       return NULL;
2112
2113   ret = &pi->prstatus.pr_flttrace;
2114 #else
2115   {
2116     static fltset_t flttrace;
2117
2118     if (ioctl (pi->ctl_fd, PIOCGFAULT, &flttrace) >= 0)
2119       ret = &flttrace;
2120   }
2121 #endif
2122   if (save && ret)
2123     memcpy (save, ret, sizeof (fltset_t));
2124
2125   return ret;
2126 }
2127
2128 /* Returns the set of syscalls that are traced /debugged on entry.
2129    Will also copy the syscall set if SAVE is non-zero.  */
2130
2131 sysset_t *
2132 proc_get_traced_sysentry (procinfo *pi, sysset_t *save)
2133 {
2134   sysset_t *ret = NULL;
2135
2136   /* We should never have to apply this operation to any procinfo
2137      except the one for the main process.  If that ever changes for
2138      any reason, then take out the following clause and replace it
2139      with one that makes sure the ctl_fd is open.  */
2140
2141   if (pi->tid != 0)
2142     pi = find_procinfo_or_die (pi->pid, 0);
2143
2144 #ifdef NEW_PROC_API
2145   if (!pi->status_valid)
2146     if (!proc_get_status (pi))
2147       return NULL;
2148
2149 #ifndef DYNAMIC_SYSCALLS
2150   ret = &pi->prstatus.pr_sysentry;
2151 #else /* DYNAMIC_SYSCALLS */
2152   {
2153     static sysset_t *sysentry;
2154     size_t size;
2155
2156     if (!sysentry)
2157       sysentry = sysset_t_alloc (pi);
2158     ret = sysentry;
2159     if (pi->status_fd == 0 && open_procinfo_files (pi, FD_STATUS) == 0)
2160       return NULL;
2161     if (pi->prstatus.pr_sysentry_offset == 0)
2162       {
2163         gdb_premptysysset (sysentry);
2164       }
2165     else
2166       {
2167         int rsize;
2168
2169         if (lseek (pi->status_fd, (off_t) pi->prstatus.pr_sysentry_offset,
2170                    SEEK_SET)
2171             != (off_t) pi->prstatus.pr_sysentry_offset)
2172           return NULL;
2173         size = sysset_t_size (pi);
2174         gdb_premptysysset (sysentry);
2175         rsize = read (pi->status_fd, sysentry, size);
2176         if (rsize < 0)
2177           return NULL;
2178       }
2179   }
2180 #endif /* DYNAMIC_SYSCALLS */
2181 #else /* !NEW_PROC_API */
2182   {
2183     static sysset_t sysentry;
2184
2185     if (ioctl (pi->ctl_fd, PIOCGENTRY, &sysentry) >= 0)
2186       ret = &sysentry;
2187   }
2188 #endif /* NEW_PROC_API */
2189   if (save && ret)
2190     memcpy (save, ret, sysset_t_size (pi));
2191
2192   return ret;
2193 }
2194
2195 /* Returns the set of syscalls that are traced /debugged on exit.
2196    Will also copy the syscall set if SAVE is non-zero.  */
2197
2198 sysset_t *
2199 proc_get_traced_sysexit (procinfo *pi, sysset_t *save)
2200 {
2201   sysset_t * ret = NULL;
2202
2203   /* We should never have to apply this operation to any procinfo
2204      except the one for the main process.  If that ever changes for
2205      any reason, then take out the following clause and replace it
2206      with one that makes sure the ctl_fd is open.  */
2207
2208   if (pi->tid != 0)
2209     pi = find_procinfo_or_die (pi->pid, 0);
2210
2211 #ifdef NEW_PROC_API
2212   if (!pi->status_valid)
2213     if (!proc_get_status (pi))
2214       return NULL;
2215
2216 #ifndef DYNAMIC_SYSCALLS
2217   ret = &pi->prstatus.pr_sysexit;
2218 #else /* DYNAMIC_SYSCALLS */
2219   {
2220     static sysset_t *sysexit;
2221     size_t size;
2222
2223     if (!sysexit)
2224       sysexit = sysset_t_alloc (pi);
2225     ret = sysexit;
2226     if (pi->status_fd == 0 && open_procinfo_files (pi, FD_STATUS) == 0)
2227       return NULL;
2228     if (pi->prstatus.pr_sysexit_offset == 0)
2229       {
2230         gdb_premptysysset (sysexit);
2231       }
2232     else
2233       {
2234         int rsize;
2235
2236         if (lseek (pi->status_fd, (off_t) pi->prstatus.pr_sysexit_offset,
2237                    SEEK_SET)
2238             != (off_t) pi->prstatus.pr_sysexit_offset)
2239           return NULL;
2240         size = sysset_t_size (pi);
2241         gdb_premptysysset (sysexit);
2242         rsize = read (pi->status_fd, sysexit, size);
2243         if (rsize < 0)
2244           return NULL;
2245       }
2246   }
2247 #endif /* DYNAMIC_SYSCALLS */
2248 #else
2249   {
2250     static sysset_t sysexit;
2251
2252     if (ioctl (pi->ctl_fd, PIOCGEXIT, &sysexit) >= 0)
2253       ret = &sysexit;
2254   }
2255 #endif
2256   if (save && ret)
2257     memcpy (save, ret, sysset_t_size (pi));
2258
2259   return ret;
2260 }
2261
2262 /* The current fault (if any) is cleared; the associated signal will
2263    not be sent to the process or LWP when it resumes.  Returns
2264    non-zero for success, zero for failure.  */
2265
2266 int
2267 proc_clear_current_fault (procinfo *pi)
2268 {
2269   int win;
2270
2271   /* We should never have to apply this operation to any procinfo
2272      except the one for the main process.  If that ever changes for
2273      any reason, then take out the following clause and replace it
2274      with one that makes sure the ctl_fd is open.  */
2275
2276   if (pi->tid != 0)
2277     pi = find_procinfo_or_die (pi->pid, 0);
2278
2279 #ifdef NEW_PROC_API
2280   {
2281     procfs_ctl_t cmd = PCCFAULT;
2282
2283     win = (write (pi->ctl_fd, (void *) &cmd, sizeof (cmd)) == sizeof (cmd));
2284   }
2285 #else
2286   win = (ioctl (pi->ctl_fd, PIOCCFAULT, 0) >= 0);
2287 #endif
2288
2289   return win;
2290 }
2291
2292 /* Set the "current signal" that will be delivered next to the
2293    process.  NOTE: semantics are different from those of KILL.  This
2294    signal will be delivered to the process or LWP immediately when it
2295    is resumed (even if the signal is held/blocked); it will NOT
2296    immediately cause another event of interest, and will NOT first
2297    trap back to the debugger.  Returns non-zero for success, zero for
2298    failure.  */
2299
2300 int
2301 proc_set_current_signal (procinfo *pi, int signo)
2302 {
2303   int win;
2304   struct {
2305     procfs_ctl_t cmd;
2306     /* Use char array to avoid alignment issues.  */
2307     char sinfo[sizeof (gdb_siginfo_t)];
2308   } arg;
2309   gdb_siginfo_t mysinfo;
2310   ptid_t wait_ptid;
2311   struct target_waitstatus wait_status;
2312
2313   /* We should never have to apply this operation to any procinfo
2314      except the one for the main process.  If that ever changes for
2315      any reason, then take out the following clause and replace it
2316      with one that makes sure the ctl_fd is open.  */
2317
2318   if (pi->tid != 0)
2319     pi = find_procinfo_or_die (pi->pid, 0);
2320
2321 #ifdef PROCFS_DONT_PIOCSSIG_CURSIG
2322   /* With Alpha OSF/1 procfs, the kernel gets really confused if it
2323      receives a PIOCSSIG with a signal identical to the current
2324      signal, it messes up the current signal.  Work around the kernel
2325      bug.  */
2326   if (signo > 0 &&
2327       signo == proc_cursig (pi))
2328     return 1;           /* I assume this is a success? */
2329 #endif
2330
2331   /* The pointer is just a type alias.  */
2332   get_last_target_status (&wait_ptid, &wait_status);
2333   if (ptid_equal (wait_ptid, inferior_ptid)
2334       && wait_status.kind == TARGET_WAITKIND_STOPPED
2335       && wait_status.value.sig == target_signal_from_host (signo)
2336       && proc_get_status (pi)
2337 #ifdef NEW_PROC_API
2338       && pi->prstatus.pr_lwp.pr_info.si_signo == signo
2339 #else
2340       && pi->prstatus.pr_info.si_signo == signo
2341 #endif
2342       )
2343     /* Use the siginfo associated with the signal being
2344        redelivered.  */
2345 #ifdef NEW_PROC_API
2346     memcpy (arg.sinfo, &pi->prstatus.pr_lwp.pr_info, sizeof (gdb_siginfo_t));
2347 #else
2348     memcpy (arg.sinfo, &pi->prstatus.pr_info, sizeof (gdb_siginfo_t));
2349 #endif
2350   else
2351     {
2352       mysinfo.si_signo = signo;
2353       mysinfo.si_code  = 0;
2354       mysinfo.si_pid   = getpid ();       /* ?why? */
2355       mysinfo.si_uid   = getuid ();       /* ?why? */
2356       memcpy (arg.sinfo, &mysinfo, sizeof (gdb_siginfo_t));
2357     }
2358
2359 #ifdef NEW_PROC_API
2360   arg.cmd = PCSSIG;
2361   win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg))  == sizeof (arg));
2362 #else
2363   win = (ioctl (pi->ctl_fd, PIOCSSIG, (void *) &arg.sinfo) >= 0);
2364 #endif
2365
2366   return win;
2367 }
2368
2369 /* The current signal (if any) is cleared, and is not sent to the
2370    process or LWP when it resumes.  Returns non-zero for success, zero
2371    for failure.  */
2372
2373 int
2374 proc_clear_current_signal (procinfo *pi)
2375 {
2376   int win;
2377
2378   /* We should never have to apply this operation to any procinfo
2379      except the one for the main process.  If that ever changes for
2380      any reason, then take out the following clause and replace it
2381      with one that makes sure the ctl_fd is open.  */
2382
2383   if (pi->tid != 0)
2384     pi = find_procinfo_or_die (pi->pid, 0);
2385
2386 #ifdef NEW_PROC_API
2387   {
2388     struct {
2389       procfs_ctl_t cmd;
2390       /* Use char array to avoid alignment issues.  */
2391       char sinfo[sizeof (gdb_siginfo_t)];
2392     } arg;
2393     gdb_siginfo_t mysinfo;
2394
2395     arg.cmd = PCSSIG;
2396     /* The pointer is just a type alias.  */
2397     mysinfo.si_signo = 0;
2398     mysinfo.si_code  = 0;
2399     mysinfo.si_errno = 0;
2400     mysinfo.si_pid   = getpid ();       /* ?why? */
2401     mysinfo.si_uid   = getuid ();       /* ?why? */
2402     memcpy (arg.sinfo, &mysinfo, sizeof (gdb_siginfo_t));
2403
2404     win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2405   }
2406 #else
2407   win = (ioctl (pi->ctl_fd, PIOCSSIG, 0) >= 0);
2408 #endif
2409
2410   return win;
2411 }
2412
2413 /* Return the general-purpose registers for the process or LWP
2414    corresponding to PI.  Upon failure, return NULL.  */
2415
2416 gdb_gregset_t *
2417 proc_get_gregs (procinfo *pi)
2418 {
2419   if (!pi->status_valid || !pi->gregs_valid)
2420     if (!proc_get_status (pi))
2421       return NULL;
2422
2423   /* OK, sorry about the ifdef's.  There's three cases instead of two,
2424      because in this case Unixware and Solaris/RW differ.  */
2425
2426 #ifdef NEW_PROC_API
2427 # ifdef UNIXWARE                /* FIXME:  Should be autoconfigured.  */
2428   return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.gregs;
2429 # else
2430   return &pi->prstatus.pr_lwp.pr_reg;
2431 # endif
2432 #else
2433   return &pi->prstatus.pr_reg;
2434 #endif
2435 }
2436
2437 /* Return the general-purpose registers for the process or LWP
2438    corresponding to PI.  Upon failure, return NULL.  */
2439
2440 gdb_fpregset_t *
2441 proc_get_fpregs (procinfo *pi)
2442 {
2443 #ifdef NEW_PROC_API
2444   if (!pi->status_valid || !pi->fpregs_valid)
2445     if (!proc_get_status (pi))
2446       return NULL;
2447
2448 # ifdef UNIXWARE                /* FIXME:  Should be autoconfigured.  */
2449   return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.fpregs;
2450 # else
2451   return &pi->prstatus.pr_lwp.pr_fpreg;
2452 # endif
2453
2454 #else  /* not NEW_PROC_API */
2455   if (pi->fpregs_valid)
2456     return &pi->fpregset;       /* Already got 'em.  */
2457   else
2458     {
2459       if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2460         {
2461           return NULL;
2462         }
2463       else
2464         {
2465 # ifdef PIOCTGFPREG
2466           struct {
2467             long pr_count;
2468             tid_t pr_error_thread;
2469             tfpregset_t thread_1;
2470           } thread_fpregs;
2471
2472           thread_fpregs.pr_count = 1;
2473           thread_fpregs.thread_1.tid = pi->tid;
2474
2475           if (pi->tid == 0
2476               && ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset) >= 0)
2477             {
2478               pi->fpregs_valid = 1;
2479               return &pi->fpregset; /* Got 'em now!  */
2480             }
2481           else if (pi->tid != 0
2482                    && ioctl (pi->ctl_fd, PIOCTGFPREG, &thread_fpregs) >= 0)
2483             {
2484               memcpy (&pi->fpregset, &thread_fpregs.thread_1.pr_fpregs,
2485                       sizeof (pi->fpregset));
2486               pi->fpregs_valid = 1;
2487               return &pi->fpregset; /* Got 'em now!  */
2488             }
2489           else
2490             {
2491               return NULL;
2492             }
2493 # else
2494           if (ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset) >= 0)
2495             {
2496               pi->fpregs_valid = 1;
2497               return &pi->fpregset; /* Got 'em now!  */
2498             }
2499           else
2500             {
2501               return NULL;
2502             }
2503 # endif
2504         }
2505     }
2506 #endif /* NEW_PROC_API */
2507 }
2508
2509 /* Write the general-purpose registers back to the process or LWP
2510    corresponding to PI.  Return non-zero for success, zero for
2511    failure.  */
2512
2513 int
2514 proc_set_gregs (procinfo *pi)
2515 {
2516   gdb_gregset_t *gregs;
2517   int win;
2518
2519   gregs = proc_get_gregs (pi);
2520   if (gregs == NULL)
2521     return 0;                   /* proc_get_regs has already warned.  */
2522
2523   if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2524     {
2525       return 0;
2526     }
2527   else
2528     {
2529 #ifdef NEW_PROC_API
2530       struct {
2531         procfs_ctl_t cmd;
2532         /* Use char array to avoid alignment issues.  */
2533         char gregs[sizeof (gdb_gregset_t)];
2534       } arg;
2535
2536       arg.cmd = PCSREG;
2537       memcpy (&arg.gregs, gregs, sizeof (arg.gregs));
2538       win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2539 #else
2540       win = (ioctl (pi->ctl_fd, PIOCSREG, gregs) >= 0);
2541 #endif
2542     }
2543
2544   /* Policy: writing the registers invalidates our cache.  */
2545   pi->gregs_valid = 0;
2546   return win;
2547 }
2548
2549 /* Write the floating-pointer registers back to the process or LWP
2550    corresponding to PI.  Return non-zero for success, zero for
2551    failure.  */
2552
2553 int
2554 proc_set_fpregs (procinfo *pi)
2555 {
2556   gdb_fpregset_t *fpregs;
2557   int win;
2558
2559   fpregs = proc_get_fpregs (pi);
2560   if (fpregs == NULL)
2561     return 0;                   /* proc_get_fpregs has already warned.  */
2562
2563   if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2564     {
2565       return 0;
2566     }
2567   else
2568     {
2569 #ifdef NEW_PROC_API
2570       struct {
2571         procfs_ctl_t cmd;
2572         /* Use char array to avoid alignment issues.  */
2573         char fpregs[sizeof (gdb_fpregset_t)];
2574       } arg;
2575
2576       arg.cmd = PCSFPREG;
2577       memcpy (&arg.fpregs, fpregs, sizeof (arg.fpregs));
2578       win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2579 #else
2580 # ifdef PIOCTSFPREG
2581       if (pi->tid == 0)
2582         win = (ioctl (pi->ctl_fd, PIOCSFPREG, fpregs) >= 0);
2583       else
2584         {
2585           struct {
2586             long pr_count;
2587             tid_t pr_error_thread;
2588             tfpregset_t thread_1;
2589           } thread_fpregs;
2590
2591           thread_fpregs.pr_count = 1;
2592           thread_fpregs.thread_1.tid = pi->tid;
2593           memcpy (&thread_fpregs.thread_1.pr_fpregs, fpregs,
2594                   sizeof (*fpregs));
2595           win = (ioctl (pi->ctl_fd, PIOCTSFPREG, &thread_fpregs) >= 0);
2596         }
2597 # else
2598       win = (ioctl (pi->ctl_fd, PIOCSFPREG, fpregs) >= 0);
2599 # endif
2600 #endif /* NEW_PROC_API */
2601     }
2602
2603   /* Policy: writing the registers invalidates our cache.  */
2604   pi->fpregs_valid = 0;
2605   return win;
2606 }
2607
2608 /* Send a signal to the proc or lwp with the semantics of "kill()".
2609    Returns non-zero for success, zero for failure.  */
2610
2611 int
2612 proc_kill (procinfo *pi, int signo)
2613 {
2614   int win;
2615
2616   /* We might conceivably apply this operation to an LWP, and the
2617      LWP's ctl file descriptor might not be open.  */
2618
2619   if (pi->ctl_fd == 0 &&
2620       open_procinfo_files (pi, FD_CTL) == 0)
2621     {
2622       return 0;
2623     }
2624   else
2625     {
2626 #ifdef NEW_PROC_API
2627       procfs_ctl_t cmd[2];
2628
2629       cmd[0] = PCKILL;
2630       cmd[1] = signo;
2631       win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
2632 #else   /* ioctl method */
2633       /* FIXME: do I need the Alpha OSF fixups present in
2634          procfs.c/unconditionally_kill_inferior?  Perhaps only for SIGKILL? */
2635       win = (ioctl (pi->ctl_fd, PIOCKILL, &signo) >= 0);
2636 #endif
2637   }
2638
2639   return win;
2640 }
2641
2642 /* Find the pid of the process that started this one.  Returns the
2643    parent process pid, or zero.  */
2644
2645 int
2646 proc_parent_pid (procinfo *pi)
2647 {
2648   /* We should never have to apply this operation to any procinfo
2649      except the one for the main process.  If that ever changes for
2650      any reason, then take out the following clause and replace it
2651      with one that makes sure the ctl_fd is open.  */
2652
2653   if (pi->tid != 0)
2654     pi = find_procinfo_or_die (pi->pid, 0);
2655
2656   if (!pi->status_valid)
2657     if (!proc_get_status (pi))
2658       return 0;
2659
2660   return pi->prstatus.pr_ppid;
2661 }
2662
2663 /* Convert a target address (a.k.a. CORE_ADDR) into a host address
2664    (a.k.a void pointer)!  */
2665
2666 #if (defined (PCWATCH) || defined (PIOCSWATCH)) \
2667     && !(defined (PIOCOPENLWP) || defined (UNIXWARE))
2668 static void *
2669 procfs_address_to_host_pointer (CORE_ADDR addr)
2670 {
2671   struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
2672   void *ptr;
2673
2674   gdb_assert (sizeof (ptr) == TYPE_LENGTH (ptr_type));
2675   gdbarch_address_to_pointer (target_gdbarch, ptr_type,
2676                               (gdb_byte *) &ptr, addr);
2677   return ptr;
2678 }
2679 #endif
2680
2681 int
2682 proc_set_watchpoint (procinfo *pi, CORE_ADDR addr, int len, int wflags)
2683 {
2684 #if !defined (PCWATCH) && !defined (PIOCSWATCH)
2685   /* If neither or these is defined, we can't support watchpoints.
2686      This just avoids possibly failing to compile the below on such
2687      systems.  */
2688   return 0;
2689 #else
2690 /* Horrible hack!  Detect Solaris 2.5, because this doesn't work on 2.5 */
2691 #if defined (PIOCOPENLWP) || defined (UNIXWARE) /* Solaris 2.5: bail out */
2692   return 0;
2693 #else
2694   struct {
2695     procfs_ctl_t cmd;
2696     char watch[sizeof (prwatch_t)];
2697   } arg;
2698   prwatch_t pwatch;
2699
2700   /* NOTE: cagney/2003-02-01: Even more horrible hack.  Need to
2701      convert a target address into something that can be stored in a
2702      native data structure.  */
2703 #ifdef PCAGENT  /* Horrible hack: only defined on Solaris 2.6+ */
2704   pwatch.pr_vaddr  = (uintptr_t) procfs_address_to_host_pointer (addr);
2705 #else
2706   pwatch.pr_vaddr  = (caddr_t) procfs_address_to_host_pointer (addr);
2707 #endif
2708   pwatch.pr_size   = len;
2709   pwatch.pr_wflags = wflags;
2710 #if defined(NEW_PROC_API) && defined (PCWATCH)
2711   arg.cmd = PCWATCH;
2712   memcpy (arg.watch, &pwatch, sizeof (prwatch_t));
2713   return (write (pi->ctl_fd, &arg, sizeof (arg)) == sizeof (arg));
2714 #else
2715 #if defined (PIOCSWATCH)
2716   return (ioctl (pi->ctl_fd, PIOCSWATCH, &pwatch) >= 0);
2717 #else
2718   return 0;     /* Fail */
2719 #endif
2720 #endif
2721 #endif
2722 #endif
2723 }
2724
2725 #if (defined(__i386__) || defined(__x86_64__)) && defined (sun)
2726
2727 #include <sys/sysi86.h>
2728
2729 /* The KEY is actually the value of the lower 16 bits of the GS
2730    register for the LWP that we're interested in.  Returns the
2731    matching ssh struct (LDT entry).  */
2732
2733 struct ssd *
2734 proc_get_LDT_entry (procinfo *pi, int key)
2735 {
2736   static struct ssd *ldt_entry = NULL;
2737 #ifdef NEW_PROC_API
2738   char pathname[MAX_PROC_NAME_SIZE];
2739   struct cleanup *old_chain = NULL;
2740   int  fd;
2741
2742   /* Allocate space for one LDT entry.
2743      This alloc must persist, because we return a pointer to it.  */
2744   if (ldt_entry == NULL)
2745     ldt_entry = (struct ssd *) xmalloc (sizeof (struct ssd));
2746
2747   /* Open the file descriptor for the LDT table.  */
2748   sprintf (pathname, "/proc/%d/ldt", pi->pid);
2749   if ((fd = open_with_retry (pathname, O_RDONLY)) < 0)
2750     {
2751       proc_warn (pi, "proc_get_LDT_entry (open)", __LINE__);
2752       return NULL;
2753     }
2754   /* Make sure it gets closed again! */
2755   old_chain = make_cleanup_close (fd);
2756
2757   /* Now 'read' thru the table, find a match and return it.  */
2758   while (read (fd, ldt_entry, sizeof (struct ssd)) == sizeof (struct ssd))
2759     {
2760       if (ldt_entry->sel == 0 &&
2761           ldt_entry->bo  == 0 &&
2762           ldt_entry->acc1 == 0 &&
2763           ldt_entry->acc2 == 0)
2764         break;  /* end of table */
2765       /* If key matches, return this entry. */
2766       if (ldt_entry->sel == key)
2767         return ldt_entry;
2768     }
2769   /* Loop ended, match not found. */
2770   return NULL;
2771 #else
2772   int nldt, i;
2773   static int nalloc = 0;
2774
2775   /* Get the number of LDT entries.  */
2776   if (ioctl (pi->ctl_fd, PIOCNLDT, &nldt) < 0)
2777     {
2778       proc_warn (pi, "proc_get_LDT_entry (PIOCNLDT)", __LINE__);
2779       return NULL;
2780     }
2781
2782   /* Allocate space for the number of LDT entries. */
2783   /* This alloc has to persist, 'cause we return a pointer to it. */
2784   if (nldt > nalloc)
2785     {
2786       ldt_entry = (struct ssd *)
2787         xrealloc (ldt_entry, (nldt + 1) * sizeof (struct ssd));
2788       nalloc = nldt;
2789     }
2790
2791   /* Read the whole table in one gulp.  */
2792   if (ioctl (pi->ctl_fd, PIOCLDT, ldt_entry) < 0)
2793     {
2794       proc_warn (pi, "proc_get_LDT_entry (PIOCLDT)", __LINE__);
2795       return NULL;
2796     }
2797
2798   /* Search the table and return the (first) entry matching 'key'. */
2799   for (i = 0; i < nldt; i++)
2800     if (ldt_entry[i].sel == key)
2801       return &ldt_entry[i];
2802
2803   /* Loop ended, match not found. */
2804   return NULL;
2805 #endif
2806 }
2807
2808 /* Returns the pointer to the LDT entry of PTID.  */
2809
2810 struct ssd *
2811 procfs_find_LDT_entry (ptid_t ptid)
2812 {
2813   gdb_gregset_t *gregs;
2814   int            key;
2815   procinfo      *pi;
2816
2817   /* Find procinfo for the lwp. */
2818   if ((pi = find_procinfo (PIDGET (ptid), TIDGET (ptid))) == NULL)
2819     {
2820       warning (_("procfs_find_LDT_entry: could not find procinfo for %d:%ld."),
2821                PIDGET (ptid), TIDGET (ptid));
2822       return NULL;
2823     }
2824   /* get its general registers. */
2825   if ((gregs = proc_get_gregs (pi)) == NULL)
2826     {
2827       warning (_("procfs_find_LDT_entry: could not read gregs for %d:%ld."),
2828                PIDGET (ptid), TIDGET (ptid));
2829       return NULL;
2830     }
2831   /* Now extract the GS register's lower 16 bits. */
2832   key = (*gregs)[GS] & 0xffff;
2833
2834   /* Find the matching entry and return it. */
2835   return proc_get_LDT_entry (pi, key);
2836 }
2837
2838 #endif
2839
2840 /* =============== END, non-thread part of /proc  "MODULE" =============== */
2841
2842 /* =================== Thread "MODULE" =================== */
2843
2844 /* NOTE: you'll see more ifdefs and duplication of functions here,
2845    since there is a different way to do threads on every OS.  */
2846
2847 /* Returns the number of threads for the process.  */
2848
2849 #if defined (PIOCNTHR) && defined (PIOCTLIST)
2850 /* OSF version */
2851 int
2852 proc_get_nthreads (procinfo *pi)
2853 {
2854   int nthreads = 0;
2855
2856   if (ioctl (pi->ctl_fd, PIOCNTHR, &nthreads) < 0)
2857     proc_warn (pi, "procfs: PIOCNTHR failed", __LINE__);
2858
2859   return nthreads;
2860 }
2861
2862 #else
2863 #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */
2864 /* Solaris and Unixware version */
2865 int
2866 proc_get_nthreads (procinfo *pi)
2867 {
2868   if (!pi->status_valid)
2869     if (!proc_get_status (pi))
2870       return 0;
2871
2872   /* NEW_PROC_API: only works for the process procinfo, because the
2873      LWP procinfos do not get prstatus filled in.  */
2874 #ifdef NEW_PROC_API
2875   if (pi->tid != 0)     /* find the parent process procinfo */
2876     pi = find_procinfo_or_die (pi->pid, 0);
2877 #endif
2878   return pi->prstatus.pr_nlwp;
2879 }
2880
2881 #else
2882 /* Default version */
2883 int
2884 proc_get_nthreads (procinfo *pi)
2885 {
2886   return 0;
2887 }
2888 #endif
2889 #endif
2890
2891 /* LWP version.
2892
2893    Return the ID of the thread that had an event of interest.
2894    (ie. the one that hit a breakpoint or other traced event).  All
2895    other things being equal, this should be the ID of a thread that is
2896    currently executing.  */
2897
2898 #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */
2899 /* Solaris and Unixware version */
2900 int
2901 proc_get_current_thread (procinfo *pi)
2902 {
2903   /* Note: this should be applied to the root procinfo for the
2904      process, not to the procinfo for an LWP.  If applied to the
2905      procinfo for an LWP, it will simply return that LWP's ID.  In
2906      that case, find the parent process procinfo.  */
2907
2908   if (pi->tid != 0)
2909     pi = find_procinfo_or_die (pi->pid, 0);
2910
2911   if (!pi->status_valid)
2912     if (!proc_get_status (pi))
2913       return 0;
2914
2915 #ifdef NEW_PROC_API
2916   return pi->prstatus.pr_lwp.pr_lwpid;
2917 #else
2918   return pi->prstatus.pr_who;
2919 #endif
2920 }
2921
2922 #else
2923 #if defined (PIOCNTHR) && defined (PIOCTLIST)
2924 /* OSF version */
2925 int
2926 proc_get_current_thread (procinfo *pi)
2927 {
2928 #if 0   /* FIXME: not ready for prime time? */
2929   return pi->prstatus.pr_tid;
2930 #else
2931   return 0;
2932 #endif
2933 }
2934
2935 #else
2936 /* Default version */
2937 int
2938 proc_get_current_thread (procinfo *pi)
2939 {
2940   return 0;
2941 }
2942
2943 #endif
2944 #endif
2945
2946 /* Discover the IDs of all the threads within the process, and create
2947    a procinfo for each of them (chained to the parent).  This
2948    unfortunately requires a different method on every OS.  Returns
2949    non-zero for success, zero for failure.  */
2950
2951 int
2952 proc_delete_dead_threads (procinfo *parent, procinfo *thread, void *ignore)
2953 {
2954   if (thread && parent) /* sanity */
2955     {
2956       thread->status_valid = 0;
2957       if (!proc_get_status (thread))
2958         destroy_one_procinfo (&parent->thread_list, thread);
2959     }
2960   return 0;     /* keep iterating */
2961 }
2962
2963 #if defined (PIOCLSTATUS)
2964 /* Solaris 2.5 (ioctl) version */
2965 int
2966 proc_update_threads (procinfo *pi)
2967 {
2968   gdb_prstatus_t *prstatus;
2969   struct cleanup *old_chain = NULL;
2970   procinfo *thread;
2971   int nlwp, i;
2972
2973   /* We should never have to apply this operation to any procinfo
2974      except the one for the main process.  If that ever changes for
2975      any reason, then take out the following clause and replace it
2976      with one that makes sure the ctl_fd is open.  */
2977
2978   if (pi->tid != 0)
2979     pi = find_procinfo_or_die (pi->pid, 0);
2980
2981   proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
2982
2983   if ((nlwp = proc_get_nthreads (pi)) <= 1)
2984     return 1;   /* Process is not multi-threaded; nothing to do.  */
2985
2986   prstatus = xmalloc (sizeof (gdb_prstatus_t) * (nlwp + 1));
2987
2988   old_chain = make_cleanup (xfree, prstatus);
2989   if (ioctl (pi->ctl_fd, PIOCLSTATUS, prstatus) < 0)
2990     proc_error (pi, "update_threads (PIOCLSTATUS)", __LINE__);
2991
2992   /* Skip element zero, which represents the process as a whole.  */
2993   for (i = 1; i < nlwp + 1; i++)
2994     {
2995       if ((thread = create_procinfo (pi->pid, prstatus[i].pr_who)) == NULL)
2996         proc_error (pi, "update_threads, create_procinfo", __LINE__);
2997
2998       memcpy (&thread->prstatus, &prstatus[i], sizeof (*prstatus));
2999       thread->status_valid = 1;
3000     }
3001   pi->threads_valid = 1;
3002   do_cleanups (old_chain);
3003   return 1;
3004 }
3005 #else
3006 #ifdef NEW_PROC_API
3007 /* Unixware and Solaris 6 (and later) version */
3008 static void
3009 do_closedir_cleanup (void *dir)
3010 {
3011   closedir (dir);
3012 }
3013
3014 int
3015 proc_update_threads (procinfo *pi)
3016 {
3017   char pathname[MAX_PROC_NAME_SIZE + 16];
3018   struct dirent *direntry;
3019   struct cleanup *old_chain = NULL;
3020   procinfo *thread;
3021   DIR *dirp;
3022   int lwpid;
3023
3024   /* We should never have to apply this operation to any procinfo
3025      except the one for the main process.  If that ever changes for
3026      any reason, then take out the following clause and replace it
3027      with one that makes sure the ctl_fd is open.  */
3028
3029   if (pi->tid != 0)
3030     pi = find_procinfo_or_die (pi->pid, 0);
3031
3032   proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3033
3034   /* Unixware
3035
3036      Note: this brute-force method is the only way I know of to
3037      accomplish this task on Unixware.  This method will also work on
3038      Solaris 2.6 and 2.7.  There is a much simpler and more elegant
3039      way to do this on Solaris, but the margins of this manuscript are
3040      too small to write it here...  ;-)  */
3041
3042   strcpy (pathname, pi->pathname);
3043   strcat (pathname, "/lwp");
3044   if ((dirp = opendir (pathname)) == NULL)
3045     proc_error (pi, "update_threads, opendir", __LINE__);
3046
3047   old_chain = make_cleanup (do_closedir_cleanup, dirp);
3048   while ((direntry = readdir (dirp)) != NULL)
3049     if (direntry->d_name[0] != '.')             /* skip '.' and '..' */
3050       {
3051         lwpid = atoi (&direntry->d_name[0]);
3052         if ((thread = create_procinfo (pi->pid, lwpid)) == NULL)
3053           proc_error (pi, "update_threads, create_procinfo", __LINE__);
3054       }
3055   pi->threads_valid = 1;
3056   do_cleanups (old_chain);
3057   return 1;
3058 }
3059 #else
3060 #ifdef PIOCTLIST
3061 /* OSF version */
3062 int
3063 proc_update_threads (procinfo *pi)
3064 {
3065   int nthreads, i;
3066   tid_t *threads;
3067
3068   /* We should never have to apply this operation to any procinfo
3069      except the one for the main process.  If that ever changes for
3070      any reason, then take out the following clause and replace it
3071      with one that makes sure the ctl_fd is open.  */
3072
3073   if (pi->tid != 0)
3074     pi = find_procinfo_or_die (pi->pid, 0);
3075
3076   proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3077
3078   nthreads = proc_get_nthreads (pi);
3079   if (nthreads < 2)
3080     return 0;           /* nothing to do for 1 or fewer threads */
3081
3082   threads = xmalloc (nthreads * sizeof (tid_t));
3083
3084   if (ioctl (pi->ctl_fd, PIOCTLIST, threads) < 0)
3085     proc_error (pi, "procfs: update_threads (PIOCTLIST)", __LINE__);
3086
3087   for (i = 0; i < nthreads; i++)
3088     {
3089       if (!find_procinfo (pi->pid, threads[i]))
3090         if (!create_procinfo  (pi->pid, threads[i]))
3091           proc_error (pi, "update_threads, create_procinfo", __LINE__);
3092     }
3093   pi->threads_valid = 1;
3094   return 1;
3095 }
3096 #else
3097 /* Default version */
3098 int
3099 proc_update_threads (procinfo *pi)
3100 {
3101   return 0;
3102 }
3103 #endif  /* OSF PIOCTLIST */
3104 #endif  /* NEW_PROC_API   */
3105 #endif  /* SOL 2.5 PIOCLSTATUS */
3106
3107 /* Given a pointer to a function, call that function once for each lwp
3108    in the procinfo list, until the function returns non-zero, in which
3109    event return the value returned by the function.
3110
3111    Note: this function does NOT call update_threads.  If you want to
3112    discover new threads first, you must call that function explicitly.
3113    This function just makes a quick pass over the currently-known
3114    procinfos.
3115
3116    PI is the parent process procinfo.  FUNC is the per-thread
3117    function.  PTR is an opaque parameter for function.  Returns the
3118    first non-zero return value from the callee, or zero.  */
3119
3120 int
3121 proc_iterate_over_threads (procinfo *pi,
3122                            int (*func) (procinfo *, procinfo *, void *),
3123                            void *ptr)
3124 {
3125   procinfo *thread, *next;
3126   int retval = 0;
3127
3128   /* We should never have to apply this operation to any procinfo
3129      except the one for the main process.  If that ever changes for
3130      any reason, then take out the following clause and replace it
3131      with one that makes sure the ctl_fd is open.  */
3132
3133   if (pi->tid != 0)
3134     pi = find_procinfo_or_die (pi->pid, 0);
3135
3136   for (thread = pi->thread_list; thread != NULL; thread = next)
3137     {
3138       next = thread->next;      /* in case thread is destroyed */
3139       if ((retval = (*func) (pi, thread, ptr)) != 0)
3140         break;
3141     }
3142
3143   return retval;
3144 }
3145
3146 /* =================== END, Thread "MODULE" =================== */
3147
3148 /* =================== END, /proc  "MODULE" =================== */
3149
3150 /* ===================  GDB  "MODULE" =================== */
3151
3152 /* Here are all of the gdb target vector functions and their
3153    friends.  */
3154
3155 static ptid_t do_attach (ptid_t ptid);
3156 static void do_detach (int signo);
3157 static int register_gdb_signals (procinfo *, gdb_sigset_t *);
3158 static void proc_trace_syscalls_1 (procinfo *pi, int syscallnum,
3159                                    int entry_or_exit, int mode, int from_tty);
3160
3161 /* On mips-irix, we need to insert a breakpoint at __dbx_link during
3162    the startup phase.  The following two variables are used to record
3163    the address of the breakpoint, and the code that was replaced by
3164    a breakpoint.  */
3165 static int dbx_link_bpt_addr = 0;
3166 static void *dbx_link_bpt;
3167
3168 /* Sets up the inferior to be debugged.  Registers to trace signals,
3169    hardware faults, and syscalls.  Note: does not set RLC flag: caller
3170    may want to customize that.  Returns zero for success (note!
3171    unlike most functions in this module); on failure, returns the LINE
3172    NUMBER where it failed!  */
3173
3174 static int
3175 procfs_debug_inferior (procinfo *pi)
3176 {
3177   fltset_t traced_faults;
3178   gdb_sigset_t traced_signals;
3179   sysset_t *traced_syscall_entries;
3180   sysset_t *traced_syscall_exits;
3181   int status;
3182
3183 #ifdef PROCFS_DONT_TRACE_FAULTS
3184   /* On some systems (OSF), we don't trace hardware faults.
3185      Apparently it's enough that we catch them as signals.
3186      Wonder why we don't just do that in general? */
3187   premptyset (&traced_faults);          /* don't trace faults. */
3188 #else
3189   /* Register to trace hardware faults in the child. */
3190   prfillset (&traced_faults);           /* trace all faults... */
3191   gdb_prdelset  (&traced_faults, FLTPAGE);      /* except page fault.  */
3192 #endif
3193   if (!proc_set_traced_faults  (pi, &traced_faults))
3194     return __LINE__;
3195
3196   /* Register to trace selected signals in the child. */
3197   premptyset (&traced_signals);
3198   if (!register_gdb_signals (pi, &traced_signals))
3199     return __LINE__;
3200
3201
3202   /* Register to trace the 'exit' system call (on entry).  */
3203   traced_syscall_entries = sysset_t_alloc (pi);
3204   gdb_premptysysset (traced_syscall_entries);
3205 #ifdef SYS_exit
3206   gdb_praddsysset (traced_syscall_entries, SYS_exit);
3207 #endif
3208 #ifdef SYS_lwpexit
3209   gdb_praddsysset (traced_syscall_entries, SYS_lwpexit);        /* And _lwp_exit... */
3210 #endif
3211 #ifdef SYS_lwp_exit
3212   gdb_praddsysset (traced_syscall_entries, SYS_lwp_exit);
3213 #endif
3214 #ifdef DYNAMIC_SYSCALLS
3215   {
3216     int callnum = find_syscall (pi, "_exit");
3217
3218     if (callnum >= 0)
3219       gdb_praddsysset (traced_syscall_entries, callnum);
3220   }
3221 #endif
3222
3223   status = proc_set_traced_sysentry (pi, traced_syscall_entries);
3224   xfree (traced_syscall_entries);
3225   if (!status)
3226     return __LINE__;
3227
3228 #ifdef PRFS_STOPEXEC    /* defined on OSF */
3229   /* OSF method for tracing exec syscalls.  Quoting:
3230      Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
3231      exits from exec system calls because of the user level loader.  */
3232   /* FIXME: make nice and maybe move into an access function. */
3233   {
3234     int prfs_flags;
3235
3236     if (ioctl (pi->ctl_fd, PIOCGSPCACT, &prfs_flags) < 0)
3237       return __LINE__;
3238
3239     prfs_flags |= PRFS_STOPEXEC;
3240
3241     if (ioctl (pi->ctl_fd, PIOCSSPCACT, &prfs_flags) < 0)
3242       return __LINE__;
3243   }
3244 #else /* not PRFS_STOPEXEC */
3245   /* Everyone else's (except OSF) method for tracing exec syscalls */
3246   /* GW: Rationale...
3247      Not all systems with /proc have all the exec* syscalls with the same
3248      names.  On the SGI, for example, there is no SYS_exec, but there
3249      *is* a SYS_execv.  So, we try to account for that. */
3250
3251   traced_syscall_exits = sysset_t_alloc (pi);
3252   gdb_premptysysset (traced_syscall_exits);
3253 #ifdef SYS_exec
3254   gdb_praddsysset (traced_syscall_exits, SYS_exec);
3255 #endif
3256 #ifdef SYS_execve
3257   gdb_praddsysset (traced_syscall_exits, SYS_execve);
3258 #endif
3259 #ifdef SYS_execv
3260   gdb_praddsysset (traced_syscall_exits, SYS_execv);
3261 #endif
3262
3263 #ifdef SYS_lwpcreate
3264   gdb_praddsysset (traced_syscall_exits, SYS_lwpcreate);
3265   gdb_praddsysset (traced_syscall_exits, SYS_lwpexit);
3266 #endif
3267
3268 #ifdef SYS_lwp_create   /* FIXME: once only, please */
3269   gdb_praddsysset (traced_syscall_exits, SYS_lwp_create);
3270   gdb_praddsysset (traced_syscall_exits, SYS_lwp_exit);
3271 #endif
3272
3273 #ifdef DYNAMIC_SYSCALLS
3274   {
3275     int callnum = find_syscall (pi, "execve");
3276
3277     if (callnum >= 0)
3278       gdb_praddsysset (traced_syscall_exits, callnum);
3279     callnum = find_syscall (pi, "ra_execve");
3280     if (callnum >= 0)
3281       gdb_praddsysset (traced_syscall_exits, callnum);
3282   }
3283 #endif
3284
3285   status = proc_set_traced_sysexit (pi, traced_syscall_exits);
3286   xfree (traced_syscall_exits);
3287   if (!status)
3288     return __LINE__;
3289
3290 #endif /* PRFS_STOPEXEC */
3291   return 0;
3292 }
3293
3294 static void
3295 procfs_attach (struct target_ops *ops, char *args, int from_tty)
3296 {
3297   char *exec_file;
3298   int   pid;
3299
3300   pid = parse_pid_to_attach (args);
3301
3302   if (pid == getpid ())
3303     error (_("Attaching GDB to itself is not a good idea..."));
3304
3305   if (from_tty)
3306     {
3307       exec_file = get_exec_file (0);
3308
3309       if (exec_file)
3310         printf_filtered (_("Attaching to program `%s', %s\n"),
3311                          exec_file, target_pid_to_str (pid_to_ptid (pid)));
3312       else
3313         printf_filtered (_("Attaching to %s\n"),
3314                          target_pid_to_str (pid_to_ptid (pid)));
3315
3316       fflush (stdout);
3317     }
3318   inferior_ptid = do_attach (pid_to_ptid (pid));
3319   push_target (ops);
3320 }
3321
3322 static void
3323 procfs_detach (struct target_ops *ops, char *args, int from_tty)
3324 {
3325   int sig = 0;
3326   int pid = PIDGET (inferior_ptid);
3327
3328   if (args)
3329     sig = atoi (args);
3330
3331   if (from_tty)
3332     {
3333       char *exec_file;
3334
3335       exec_file = get_exec_file (0);
3336       if (exec_file == NULL)
3337         exec_file = "";
3338
3339       printf_filtered (_("Detaching from program: %s, %s\n"), exec_file,
3340                        target_pid_to_str (pid_to_ptid (pid)));
3341       gdb_flush (gdb_stdout);
3342     }
3343
3344   do_detach (sig);
3345
3346   inferior_ptid = null_ptid;
3347   detach_inferior (pid);
3348   unpush_target (ops);
3349 }
3350
3351 static ptid_t
3352 do_attach (ptid_t ptid)
3353 {
3354   procinfo *pi;
3355   struct inferior *inf;
3356   int fail;
3357   int lwpid;
3358
3359   if ((pi = create_procinfo (PIDGET (ptid), 0)) == NULL)
3360     perror (_("procfs: out of memory in 'attach'"));
3361
3362   if (!open_procinfo_files (pi, FD_CTL))
3363     {
3364       fprintf_filtered (gdb_stderr, "procfs:%d -- ", __LINE__);
3365       sprintf (errmsg, "do_attach: couldn't open /proc file for process %d",
3366                PIDGET (ptid));
3367       dead_procinfo (pi, errmsg, NOKILL);
3368     }
3369
3370   /* Stop the process (if it isn't already stopped).  */
3371   if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
3372     {
3373       pi->was_stopped = 1;
3374       proc_prettyprint_why (proc_why (pi), proc_what (pi), 1);
3375     }
3376   else
3377     {
3378       pi->was_stopped = 0;
3379       /* Set the process to run again when we close it.  */
3380       if (!proc_set_run_on_last_close (pi))
3381         dead_procinfo (pi, "do_attach: couldn't set RLC.", NOKILL);
3382
3383       /* Now stop the process. */
3384       if (!proc_stop_process (pi))
3385         dead_procinfo (pi, "do_attach: couldn't stop the process.", NOKILL);
3386       pi->ignore_next_sigstop = 1;
3387     }
3388   /* Save some of the /proc state to be restored if we detach.  */
3389   if (!proc_get_traced_faults   (pi, &pi->saved_fltset))
3390     dead_procinfo (pi, "do_attach: couldn't save traced faults.", NOKILL);
3391   if (!proc_get_traced_signals  (pi, &pi->saved_sigset))
3392     dead_procinfo (pi, "do_attach: couldn't save traced signals.", NOKILL);
3393   if (!proc_get_traced_sysentry (pi, pi->saved_entryset))
3394     dead_procinfo (pi, "do_attach: couldn't save traced syscall entries.",
3395                    NOKILL);
3396   if (!proc_get_traced_sysexit  (pi, pi->saved_exitset))
3397     dead_procinfo (pi, "do_attach: couldn't save traced syscall exits.",
3398                    NOKILL);
3399   if (!proc_get_held_signals    (pi, &pi->saved_sighold))
3400     dead_procinfo (pi, "do_attach: couldn't save held signals.", NOKILL);
3401
3402   if ((fail = procfs_debug_inferior (pi)) != 0)
3403     dead_procinfo (pi, "do_attach: failed in procfs_debug_inferior", NOKILL);
3404
3405   inf = current_inferior ();
3406   inferior_appeared (inf, pi->pid);
3407   /* Let GDB know that the inferior was attached.  */
3408   inf->attach_flag = 1;
3409
3410   /* Create a procinfo for the current lwp.  */
3411   lwpid = proc_get_current_thread (pi);
3412   create_procinfo (pi->pid, lwpid);
3413
3414   /* Add it to gdb's thread list.  */
3415   ptid = MERGEPID (pi->pid, lwpid);
3416   add_thread (ptid);
3417
3418   return ptid;
3419 }
3420
3421 static void
3422 do_detach (int signo)
3423 {
3424   procinfo *pi;
3425
3426   /* Find procinfo for the main process */
3427   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); /* FIXME: threads */
3428   if (signo)
3429     if (!proc_set_current_signal (pi, signo))
3430       proc_warn (pi, "do_detach, set_current_signal", __LINE__);
3431
3432   if (!proc_set_traced_signals (pi, &pi->saved_sigset))
3433     proc_warn (pi, "do_detach, set_traced_signal", __LINE__);
3434
3435   if (!proc_set_traced_faults (pi, &pi->saved_fltset))
3436     proc_warn (pi, "do_detach, set_traced_faults", __LINE__);
3437
3438   if (!proc_set_traced_sysentry (pi, pi->saved_entryset))
3439     proc_warn (pi, "do_detach, set_traced_sysentry", __LINE__);
3440
3441   if (!proc_set_traced_sysexit (pi, pi->saved_exitset))
3442     proc_warn (pi, "do_detach, set_traced_sysexit", __LINE__);
3443
3444   if (!proc_set_held_signals (pi, &pi->saved_sighold))
3445     proc_warn (pi, "do_detach, set_held_signals", __LINE__);
3446
3447   if (signo || (proc_flags (pi) & (PR_STOPPED | PR_ISTOP)))
3448     if (signo || !(pi->was_stopped) ||
3449         query (_("Was stopped when attached, make it runnable again? ")))
3450       {
3451         /* Clear any pending signal.  */
3452         if (!proc_clear_current_fault (pi))
3453           proc_warn (pi, "do_detach, clear_current_fault", __LINE__);
3454
3455         if (signo == 0 && !proc_clear_current_signal (pi))
3456           proc_warn (pi, "do_detach, clear_current_signal", __LINE__);
3457
3458         if (!proc_set_run_on_last_close (pi))
3459           proc_warn (pi, "do_detach, set_rlc", __LINE__);
3460       }
3461
3462   destroy_procinfo (pi);
3463 }
3464
3465 /* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
3466    for all registers.
3467
3468    ??? Is the following note still relevant?  We can't get individual
3469    registers with the PT_GETREGS ptrace(2) request either, yet we
3470    don't bother with caching at all in that case.
3471
3472    NOTE: Since the /proc interface cannot give us individual
3473    registers, we pay no attention to REGNUM, and just fetch them all.
3474    This results in the possibility that we will do unnecessarily many
3475    fetches, since we may be called repeatedly for individual
3476    registers.  So we cache the results, and mark the cache invalid
3477    when the process is resumed.  */
3478
3479 static void
3480 procfs_fetch_registers (struct target_ops *ops,
3481                         struct regcache *regcache, int regnum)
3482 {
3483   gdb_gregset_t *gregs;
3484   procinfo *pi;
3485   int pid = PIDGET (inferior_ptid);
3486   int tid = TIDGET (inferior_ptid);
3487   struct gdbarch *gdbarch = get_regcache_arch (regcache);
3488
3489   pi = find_procinfo_or_die (pid, tid);
3490
3491   if (pi == NULL)
3492     error (_("procfs: fetch_registers failed to find procinfo for %s"),
3493            target_pid_to_str (inferior_ptid));
3494
3495   gregs = proc_get_gregs (pi);
3496   if (gregs == NULL)
3497     proc_error (pi, "fetch_registers, get_gregs", __LINE__);
3498
3499   supply_gregset (regcache, (const gdb_gregset_t *) gregs);
3500
3501   if (gdbarch_fp0_regnum (gdbarch) >= 0) /* Do we have an FPU?  */
3502     {
3503       gdb_fpregset_t *fpregs;
3504
3505       if ((regnum >= 0 && regnum < gdbarch_fp0_regnum (gdbarch))
3506           || regnum == gdbarch_pc_regnum (gdbarch)
3507           || regnum == gdbarch_sp_regnum (gdbarch))
3508         return;                 /* Not a floating point register.  */
3509
3510       fpregs = proc_get_fpregs (pi);
3511       if (fpregs == NULL)
3512         proc_error (pi, "fetch_registers, get_fpregs", __LINE__);
3513
3514       supply_fpregset (regcache, (const gdb_fpregset_t *) fpregs);
3515     }
3516 }
3517
3518 /* Store register REGNUM back into the inferior.  If REGNUM is -1, do
3519    this for all registers.
3520
3521    NOTE: Since the /proc interface will not read individual registers,
3522    we will cache these requests until the process is resumed, and only
3523    then write them back to the inferior process.
3524
3525    FIXME: is that a really bad idea?  Have to think about cases where
3526    writing one register might affect the value of others, etc.  */
3527
3528 static void
3529 procfs_store_registers (struct target_ops *ops,
3530                         struct regcache *regcache, int regnum)
3531 {
3532   gdb_gregset_t *gregs;
3533   procinfo *pi;
3534   int pid = PIDGET (inferior_ptid);
3535   int tid = TIDGET (inferior_ptid);
3536   struct gdbarch *gdbarch = get_regcache_arch (regcache);
3537
3538   pi = find_procinfo_or_die (pid, tid);
3539
3540   if (pi == NULL)
3541     error (_("procfs: store_registers: failed to find procinfo for %s"),
3542            target_pid_to_str (inferior_ptid));
3543
3544   gregs = proc_get_gregs (pi);
3545   if (gregs == NULL)
3546     proc_error (pi, "store_registers, get_gregs", __LINE__);
3547
3548   fill_gregset (regcache, gregs, regnum);
3549   if (!proc_set_gregs (pi))
3550     proc_error (pi, "store_registers, set_gregs", __LINE__);
3551
3552   if (gdbarch_fp0_regnum (gdbarch) >= 0) /* Do we have an FPU?  */
3553     {
3554       gdb_fpregset_t *fpregs;
3555
3556       if ((regnum >= 0 && regnum < gdbarch_fp0_regnum (gdbarch))
3557           || regnum == gdbarch_pc_regnum (gdbarch)
3558           || regnum == gdbarch_sp_regnum (gdbarch))
3559         return;                 /* Not a floating point register.  */
3560
3561       fpregs = proc_get_fpregs (pi);
3562       if (fpregs == NULL)
3563         proc_error (pi, "store_registers, get_fpregs", __LINE__);
3564
3565       fill_fpregset (regcache, fpregs, regnum);
3566       if (!proc_set_fpregs (pi))
3567         proc_error (pi, "store_registers, set_fpregs", __LINE__);
3568     }
3569 }
3570
3571 static int
3572 syscall_is_lwp_exit (procinfo *pi, int scall)
3573 {
3574 #ifdef SYS_lwp_exit
3575   if (scall == SYS_lwp_exit)
3576     return 1;
3577 #endif
3578 #ifdef SYS_lwpexit
3579   if (scall == SYS_lwpexit)
3580     return 1;
3581 #endif
3582   return 0;
3583 }
3584
3585 static int
3586 syscall_is_exit (procinfo *pi, int scall)
3587 {
3588 #ifdef SYS_exit
3589   if (scall == SYS_exit)
3590     return 1;
3591 #endif
3592 #ifdef DYNAMIC_SYSCALLS
3593   if (find_syscall (pi, "_exit") == scall)
3594     return 1;
3595 #endif
3596   return 0;
3597 }
3598
3599 static int
3600 syscall_is_exec (procinfo *pi, int scall)
3601 {
3602 #ifdef SYS_exec
3603   if (scall == SYS_exec)
3604     return 1;
3605 #endif
3606 #ifdef SYS_execv
3607   if (scall == SYS_execv)
3608     return 1;
3609 #endif
3610 #ifdef SYS_execve
3611   if (scall == SYS_execve)
3612     return 1;
3613 #endif
3614 #ifdef DYNAMIC_SYSCALLS
3615   if (find_syscall (pi, "_execve"))
3616     return 1;
3617   if (find_syscall (pi, "ra_execve"))
3618     return 1;
3619 #endif
3620   return 0;
3621 }
3622
3623 static int
3624 syscall_is_lwp_create (procinfo *pi, int scall)
3625 {
3626 #ifdef SYS_lwp_create
3627   if (scall == SYS_lwp_create)
3628     return 1;
3629 #endif
3630 #ifdef SYS_lwpcreate
3631   if (scall == SYS_lwpcreate)
3632     return 1;
3633 #endif
3634   return 0;
3635 }
3636
3637 /* Remove the breakpoint that we inserted in __dbx_link().
3638    Does nothing if the breakpoint hasn't been inserted or has already
3639    been removed.  */
3640
3641 static void
3642 remove_dbx_link_breakpoint (void)
3643 {
3644   if (dbx_link_bpt_addr == 0)
3645     return;
3646
3647   if (deprecated_remove_raw_breakpoint (target_gdbarch, dbx_link_bpt) != 0)
3648     warning (_("Unable to remove __dbx_link breakpoint."));
3649
3650   dbx_link_bpt_addr = 0;
3651   dbx_link_bpt = NULL;
3652 }
3653
3654 #ifdef SYS_syssgi
3655 /* Return the address of the __dbx_link() function in the file
3656    refernced by ABFD by scanning its symbol table.  Return 0 if
3657    the symbol was not found.  */
3658
3659 static CORE_ADDR
3660 dbx_link_addr (bfd *abfd)
3661 {
3662   long storage_needed;
3663   asymbol **symbol_table;
3664   long number_of_symbols;
3665   long i;
3666
3667   storage_needed = bfd_get_symtab_upper_bound (abfd);
3668   if (storage_needed <= 0)
3669     return 0;
3670
3671   symbol_table = (asymbol **) xmalloc (storage_needed);
3672   make_cleanup (xfree, symbol_table);
3673
3674   number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
3675
3676   for (i = 0; i < number_of_symbols; i++)
3677     {
3678       asymbol *sym = symbol_table[i];
3679
3680       if ((sym->flags & BSF_GLOBAL)
3681           && sym->name != NULL && strcmp (sym->name, "__dbx_link") == 0)
3682         return (sym->value + sym->section->vma);
3683     }
3684
3685   /* Symbol not found, return NULL.  */
3686   return 0;
3687 }
3688
3689 /* Search the symbol table of the file referenced by FD for a symbol
3690    named __dbx_link(). If found, then insert a breakpoint at this location,
3691    and return nonzero.  Return zero otherwise.  */
3692
3693 static int
3694 insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored)
3695 {
3696   bfd *abfd;
3697   long storage_needed;
3698   CORE_ADDR sym_addr;
3699
3700   abfd = bfd_fdopenr ("unamed", 0, fd);
3701   if (abfd == NULL)
3702     {
3703       warning (_("Failed to create a bfd: %s."), bfd_errmsg (bfd_get_error ()));
3704       return 0;
3705     }
3706
3707   if (!bfd_check_format (abfd, bfd_object))
3708     {
3709       /* Not the correct format, so we can not possibly find the dbx_link
3710          symbol in it.  */
3711       bfd_close (abfd);
3712       return 0;
3713     }
3714
3715   sym_addr = dbx_link_addr (abfd);
3716   if (sym_addr != 0)
3717     {
3718       /* Insert the breakpoint.  */
3719       dbx_link_bpt_addr = sym_addr;
3720       dbx_link_bpt = deprecated_insert_raw_breakpoint (target_gdbarch, NULL,
3721                                                        sym_addr);
3722       if (dbx_link_bpt == NULL)
3723         {
3724           warning (_("Failed to insert dbx_link breakpoint."));
3725           bfd_close (abfd);
3726           return 0;
3727         }
3728       bfd_close (abfd);
3729       return 1;
3730     }
3731
3732   bfd_close (abfd);
3733   return 0;
3734 }
3735
3736 /* Calls the supplied callback function once for each mapped address
3737    space in the process.  The callback function receives an open file
3738    descriptor for the file corresponding to that mapped address space
3739    (if there is one), and the base address of the mapped space.  Quit
3740    when the callback function returns a nonzero value, or at teh end
3741    of the mappings.  Returns the first non-zero return value of the
3742    callback function, or zero.  */
3743
3744 static int
3745 solib_mappings_callback (struct prmap *map, int (*func) (int, CORE_ADDR),
3746                          void *data)
3747 {
3748   procinfo *pi = data;
3749   int fd;
3750
3751 #ifdef NEW_PROC_API
3752   char name[MAX_PROC_NAME_SIZE + sizeof (map->pr_mapname)];
3753
3754   if (map->pr_vaddr == 0 && map->pr_size == 0)
3755     return -1;          /* sanity */
3756
3757   if (map->pr_mapname[0] == 0)
3758     {
3759       fd = -1;  /* no map file */
3760     }
3761   else
3762     {
3763       sprintf (name, "/proc/%d/object/%s", pi->pid, map->pr_mapname);
3764       /* Note: caller's responsibility to close this fd!  */
3765       fd = open_with_retry (name, O_RDONLY);
3766       /* Note: we don't test the above call for failure;
3767          we just pass the FD on as given.  Sometimes there is
3768          no file, so the open may return failure, but that's
3769          not a problem.  */
3770     }
3771 #else
3772   fd = ioctl (pi->ctl_fd, PIOCOPENM, &map->pr_vaddr);
3773   /* Note: we don't test the above call for failure;
3774      we just pass the FD on as given.  Sometimes there is
3775      no file, so the ioctl may return failure, but that's
3776      not a problem.  */
3777 #endif
3778   return (*func) (fd, (CORE_ADDR) map->pr_vaddr);
3779 }
3780
3781 /* If the given memory region MAP contains a symbol named __dbx_link,
3782    insert a breakpoint at this location and return nonzero.  Return
3783    zero otherwise.  */
3784
3785 static int
3786 insert_dbx_link_bpt_in_region (struct prmap *map,
3787                                iterate_over_mappings_cb_ftype *child_func,
3788                                void *data)
3789 {
3790   procinfo *pi = (procinfo *) data;
3791
3792   /* We know the symbol we're looking for is in a text region, so
3793      only look for it if the region is a text one.  */
3794   if (map->pr_mflags & MA_EXEC)
3795     return solib_mappings_callback (map, insert_dbx_link_bpt_in_file, pi);
3796
3797   return 0;
3798 }
3799
3800 /* Search all memory regions for a symbol named __dbx_link.  If found,
3801    insert a breakpoint at its location, and return nonzero.  Return zero
3802    otherwise.  */
3803
3804 static int
3805 insert_dbx_link_breakpoint (procinfo *pi)
3806 {
3807   return iterate_over_mappings (pi, NULL, pi, insert_dbx_link_bpt_in_region);
3808 }
3809 #endif
3810
3811 /* Retrieve the next stop event from the child process.  If child has
3812    not stopped yet, wait for it to stop.  Translate /proc eventcodes
3813    (or possibly wait eventcodes) into gdb internal event codes.
3814    Returns the id of process (and possibly thread) that incurred the
3815    event.  Event codes are returned through a pointer parameter.  */
3816
3817 static ptid_t
3818 procfs_wait (struct target_ops *ops,
3819              ptid_t ptid, struct target_waitstatus *status, int options)
3820 {
3821   /* First cut: loosely based on original version 2.1 */
3822   procinfo *pi;
3823   int       wstat;
3824   int       temp_tid;
3825   ptid_t    retval, temp_ptid;
3826   int       why, what, flags;
3827   int       retry = 0;
3828
3829 wait_again:
3830
3831   retry++;
3832   wstat    = 0;
3833   retval   = pid_to_ptid (-1);
3834
3835   /* Find procinfo for main process */
3836   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
3837   if (pi)
3838     {
3839       /* We must assume that the status is stale now... */
3840       pi->status_valid = 0;
3841       pi->gregs_valid  = 0;
3842       pi->fpregs_valid = 0;
3843
3844 #if 0   /* just try this out... */
3845       flags = proc_flags (pi);
3846       why   = proc_why (pi);
3847       if ((flags & PR_STOPPED) && (why == PR_REQUESTED))
3848         pi->status_valid = 0;   /* re-read again, IMMEDIATELY... */
3849 #endif
3850       /* If child is not stopped, wait for it to stop.  */
3851       if (!(proc_flags (pi) & (PR_STOPPED | PR_ISTOP)) &&
3852           !proc_wait_for_stop (pi))
3853         {
3854           /* wait_for_stop failed: has the child terminated? */
3855           if (errno == ENOENT)
3856             {
3857               int wait_retval;
3858
3859               /* /proc file not found; presumably child has terminated. */
3860               wait_retval = wait (&wstat); /* "wait" for the child's exit  */
3861
3862               if (wait_retval != PIDGET (inferior_ptid)) /* wrong child? */
3863                 error (_("procfs: couldn't stop process %d: wait returned %d."),
3864                        PIDGET (inferior_ptid), wait_retval);
3865               /* FIXME: might I not just use waitpid?
3866                  Or try find_procinfo to see if I know about this child? */
3867               retval = pid_to_ptid (wait_retval);
3868             }
3869           else if (errno == EINTR)
3870             goto wait_again;
3871           else
3872             {
3873               /* Unknown error from wait_for_stop. */
3874               proc_error (pi, "target_wait (wait_for_stop)", __LINE__);
3875             }
3876         }
3877       else
3878         {
3879           /* This long block is reached if either:
3880              a) the child was already stopped, or
3881              b) we successfully waited for the child with wait_for_stop.
3882              This block will analyze the /proc status, and translate it
3883              into a waitstatus for GDB.
3884
3885              If we actually had to call wait because the /proc file
3886              is gone (child terminated), then we skip this block,
3887              because we already have a waitstatus.  */
3888
3889           flags = proc_flags (pi);
3890           why   = proc_why (pi);
3891           what  = proc_what (pi);
3892
3893           if (flags & (PR_STOPPED | PR_ISTOP))
3894             {
3895 #ifdef PR_ASYNC
3896               /* If it's running async (for single_thread control),
3897                  set it back to normal again.  */
3898               if (flags & PR_ASYNC)
3899                 if (!proc_unset_async (pi))
3900                   proc_error (pi, "target_wait, unset_async", __LINE__);
3901 #endif
3902
3903               if (info_verbose)
3904                 proc_prettyprint_why (why, what, 1);
3905
3906               /* The 'pid' we will return to GDB is composed of
3907                  the process ID plus the lwp ID.  */
3908               retval = MERGEPID (pi->pid, proc_get_current_thread (pi));
3909
3910               switch (why) {
3911               case PR_SIGNALLED:
3912                 wstat = (what << 8) | 0177;
3913                 break;
3914               case PR_SYSENTRY:
3915                 if (syscall_is_lwp_exit (pi, what))
3916                   {
3917                     if (print_thread_events)
3918                       printf_unfiltered (_("[%s exited]\n"),
3919                                          target_pid_to_str (retval));
3920                     delete_thread (retval);
3921                     status->kind = TARGET_WAITKIND_SPURIOUS;
3922                     return retval;
3923                   }
3924                 else if (syscall_is_exit (pi, what))
3925                   {
3926                     struct inferior *inf;
3927
3928                     /* Handle SYS_exit call only */
3929                     /* Stopped at entry to SYS_exit.
3930                        Make it runnable, resume it, then use
3931                        the wait system call to get its exit code.
3932                        Proc_run_process always clears the current
3933                        fault and signal.
3934                        Then return its exit status.  */
3935                     pi->status_valid = 0;
3936                     wstat = 0;
3937                     /* FIXME: what we should do is return
3938                        TARGET_WAITKIND_SPURIOUS.  */
3939                     if (!proc_run_process (pi, 0, 0))
3940                       proc_error (pi, "target_wait, run_process", __LINE__);
3941
3942                     inf = find_inferior_pid (pi->pid);
3943                     if (inf->attach_flag)
3944                       {
3945                         /* Don't call wait: simulate waiting for exit,
3946                            return a "success" exit code.  Bogus: what if
3947                            it returns something else?  */
3948                         wstat = 0;
3949                         retval = inferior_ptid;  /* ? ? ? */
3950                       }
3951                     else
3952                       {
3953                         int temp = wait (&wstat);
3954
3955                         /* FIXME: shouldn't I make sure I get the right
3956                            event from the right process?  If (for
3957                            instance) I have killed an earlier inferior
3958                            process but failed to clean up after it
3959                            somehow, I could get its termination event
3960                            here.  */
3961
3962                         /* If wait returns -1, that's what we return to GDB. */
3963                         if (temp < 0)
3964                           retval = pid_to_ptid (temp);
3965                       }
3966                   }
3967                 else
3968                   {
3969                     printf_filtered (_("procfs: trapped on entry to "));
3970                     proc_prettyprint_syscall (proc_what (pi), 0);
3971                     printf_filtered ("\n");
3972 #ifndef PIOCSSPCACT
3973                     {
3974                       long i, nsysargs, *sysargs;
3975
3976                       if ((nsysargs = proc_nsysarg (pi)) > 0 &&
3977                           (sysargs  = proc_sysargs (pi)) != NULL)
3978                         {
3979                           printf_filtered (_("%ld syscall arguments:\n"), nsysargs);
3980                           for (i = 0; i < nsysargs; i++)
3981                             printf_filtered ("#%ld: 0x%08lx\n",
3982                                              i, sysargs[i]);
3983                         }
3984
3985                     }
3986 #endif
3987                     if (status)
3988                       {
3989                         /* How to exit gracefully, returning "unknown event" */
3990                         status->kind = TARGET_WAITKIND_SPURIOUS;
3991                         return inferior_ptid;
3992                       }
3993                     else
3994                       {
3995                         /* How to keep going without returning to wfi: */
3996                         target_resume (ptid, 0, TARGET_SIGNAL_0);
3997                         goto wait_again;
3998                       }
3999                   }
4000                 break;
4001               case PR_SYSEXIT:
4002                 if (syscall_is_exec (pi, what))
4003                   {
4004                     /* Hopefully this is our own "fork-child" execing
4005                        the real child.  Hoax this event into a trap, and
4006                        GDB will see the child about to execute its start
4007                        address. */
4008                     wstat = (SIGTRAP << 8) | 0177;
4009                   }
4010 #ifdef SYS_syssgi
4011                 else if (what == SYS_syssgi)
4012                   {
4013                     /* see if we can break on dbx_link().  If yes, then
4014                        we no longer need the SYS_syssgi notifications.  */
4015                     if (insert_dbx_link_breakpoint (pi))
4016                       proc_trace_syscalls_1 (pi, SYS_syssgi, PR_SYSEXIT,
4017                                              FLAG_RESET, 0);
4018
4019                     /* This is an internal event and should be transparent
4020                        to wfi, so resume the execution and wait again.  See
4021                        comment in procfs_init_inferior() for more details.  */
4022                     target_resume (ptid, 0, TARGET_SIGNAL_0);
4023                     goto wait_again;
4024                   }
4025 #endif
4026                 else if (syscall_is_lwp_create (pi, what))
4027                   {
4028                     /* This syscall is somewhat like fork/exec.  We
4029                        will get the event twice: once for the parent
4030                        LWP, and once for the child.  We should already
4031                        know about the parent LWP, but the child will
4032                        be new to us.  So, whenever we get this event,
4033                        if it represents a new thread, simply add the
4034                        thread to the list.  */
4035
4036                     /* If not in procinfo list, add it.  */
4037                     temp_tid = proc_get_current_thread (pi);
4038                     if (!find_procinfo (pi->pid, temp_tid))
4039                       create_procinfo  (pi->pid, temp_tid);
4040
4041                     temp_ptid = MERGEPID (pi->pid, temp_tid);
4042                     /* If not in GDB's thread list, add it.  */
4043                     if (!in_thread_list (temp_ptid))
4044                       add_thread (temp_ptid);
4045
4046                     /* Return to WFI, but tell it to immediately resume. */
4047                     status->kind = TARGET_WAITKIND_SPURIOUS;
4048                     return inferior_ptid;
4049                   }
4050                 else if (syscall_is_lwp_exit (pi, what))
4051                   {
4052                     if (print_thread_events)
4053                       printf_unfiltered (_("[%s exited]\n"),
4054                                          target_pid_to_str (retval));
4055                     delete_thread (retval);
4056                     status->kind = TARGET_WAITKIND_SPURIOUS;
4057                     return retval;
4058                   }
4059                 else if (0)
4060                   {
4061                     /* FIXME:  Do we need to handle SYS_sproc,
4062                        SYS_fork, or SYS_vfork here?  The old procfs
4063                        seemed to use this event to handle threads on
4064                        older (non-LWP) systems, where I'm assuming
4065                        that threads were actually separate processes.
4066                        Irix, maybe?  Anyway, low priority for now.  */
4067                   }
4068                 else
4069                   {
4070                     printf_filtered (_("procfs: trapped on exit from "));
4071                     proc_prettyprint_syscall (proc_what (pi), 0);
4072                     printf_filtered ("\n");
4073 #ifndef PIOCSSPCACT
4074                     {
4075                       long i, nsysargs, *sysargs;
4076
4077                       if ((nsysargs = proc_nsysarg (pi)) > 0 &&
4078                           (sysargs  = proc_sysargs (pi)) != NULL)
4079                         {
4080                           printf_filtered (_("%ld syscall arguments:\n"),
4081                                            nsysargs);
4082                           for (i = 0; i < nsysargs; i++)
4083                             printf_filtered ("#%ld: 0x%08lx\n",
4084                                              i, sysargs[i]);
4085                         }
4086                     }
4087 #endif
4088                     status->kind = TARGET_WAITKIND_SPURIOUS;
4089                     return inferior_ptid;
4090                   }
4091                 break;
4092               case PR_REQUESTED:
4093 #if 0   /* FIXME */
4094                 wstat = (SIGSTOP << 8) | 0177;
4095                 break;
4096 #else
4097                 if (retry < 5)
4098                   {
4099                     printf_filtered (_("Retry #%d:\n"), retry);
4100                     pi->status_valid = 0;
4101                     goto wait_again;
4102                   }
4103                 else
4104                   {
4105                     /* If not in procinfo list, add it.  */
4106                     temp_tid = proc_get_current_thread (pi);
4107                     if (!find_procinfo (pi->pid, temp_tid))
4108                       create_procinfo  (pi->pid, temp_tid);
4109
4110                     /* If not in GDB's thread list, add it.  */
4111                     temp_ptid = MERGEPID (pi->pid, temp_tid);
4112                     if (!in_thread_list (temp_ptid))
4113                       add_thread (temp_ptid);
4114
4115                     status->kind = TARGET_WAITKIND_STOPPED;
4116                     status->value.sig = 0;
4117                     return retval;
4118                   }
4119 #endif
4120               case PR_JOBCONTROL:
4121                 wstat = (what << 8) | 0177;
4122                 break;
4123               case PR_FAULTED:
4124                 switch (what) {
4125 #ifdef FLTWATCH
4126                 case FLTWATCH:
4127                   wstat = (SIGTRAP << 8) | 0177;
4128                   break;
4129 #endif
4130 #ifdef FLTKWATCH
4131                 case FLTKWATCH:
4132                   wstat = (SIGTRAP << 8) | 0177;
4133                   break;
4134 #endif
4135                   /* FIXME: use si_signo where possible. */
4136                 case FLTPRIV:
4137 #if (FLTILL != FLTPRIV)         /* avoid "duplicate case" error */
4138                 case FLTILL:
4139 #endif
4140                   wstat = (SIGILL << 8) | 0177;
4141                   break;
4142                 case FLTBPT:
4143 #if (FLTTRACE != FLTBPT)        /* avoid "duplicate case" error */
4144                 case FLTTRACE:
4145 #endif
4146                   /* If we hit our __dbx_link() internal breakpoint,
4147                      then remove it.  See comments in procfs_init_inferior()
4148                      for more details.  */
4149                   if (dbx_link_bpt_addr != 0
4150                       && dbx_link_bpt_addr
4151                          == regcache_read_pc (get_current_regcache ()))
4152                     remove_dbx_link_breakpoint ();
4153
4154                   wstat = (SIGTRAP << 8) | 0177;
4155                   break;
4156                 case FLTSTACK:
4157                 case FLTACCESS:
4158 #if (FLTBOUNDS != FLTSTACK)     /* avoid "duplicate case" error */
4159                 case FLTBOUNDS:
4160 #endif
4161                   wstat = (SIGSEGV << 8) | 0177;
4162                   break;
4163                 case FLTIOVF:
4164                 case FLTIZDIV:
4165 #if (FLTFPE != FLTIOVF)         /* avoid "duplicate case" error */
4166                 case FLTFPE:
4167 #endif
4168                   wstat = (SIGFPE << 8) | 0177;
4169                   break;
4170                 case FLTPAGE:           /* Recoverable page fault */
4171                 default:         /* FIXME: use si_signo if possible for fault */
4172                   retval = pid_to_ptid (-1);
4173                   printf_filtered ("procfs:%d -- ", __LINE__);
4174                   printf_filtered (_("child stopped for unknown reason:\n"));
4175                   proc_prettyprint_why (why, what, 1);
4176                   error (_("... giving up..."));
4177                   break;
4178                 }
4179                 break;  /* case PR_FAULTED: */
4180               default:  /* switch (why) unmatched */
4181                 printf_filtered ("procfs:%d -- ", __LINE__);
4182                 printf_filtered (_("child stopped for unknown reason:\n"));
4183                 proc_prettyprint_why (why, what, 1);
4184                 error (_("... giving up..."));
4185                 break;
4186               }
4187               /* Got this far without error: If retval isn't in the
4188                  threads database, add it.  */
4189               if (PIDGET (retval) > 0 &&
4190                   !ptid_equal (retval, inferior_ptid) &&
4191                   !in_thread_list (retval))
4192                 {
4193                   /* We have a new thread.  We need to add it both to
4194                      GDB's list and to our own.  If we don't create a
4195                      procinfo, resume may be unhappy later.  */
4196                   add_thread (retval);
4197                   if (find_procinfo (PIDGET (retval), TIDGET (retval)) == NULL)
4198                     create_procinfo (PIDGET (retval), TIDGET (retval));
4199                 }
4200             }
4201           else  /* flags do not indicate STOPPED */
4202             {
4203               /* surely this can't happen... */
4204               printf_filtered ("procfs:%d -- process not stopped.\n",
4205                                __LINE__);
4206               proc_prettyprint_flags (flags, 1);
4207               error (_("procfs: ...giving up..."));
4208             }
4209         }
4210
4211       if (status)
4212         store_waitstatus (status, wstat);
4213     }
4214
4215   return retval;
4216 }
4217
4218 /* Perform a partial transfer to/from the specified object.  For
4219    memory transfers, fall back to the old memory xfer functions.  */
4220
4221 static LONGEST
4222 procfs_xfer_partial (struct target_ops *ops, enum target_object object,
4223                      const char *annex, gdb_byte *readbuf,
4224                      const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4225 {
4226   switch (object)
4227     {
4228     case TARGET_OBJECT_MEMORY:
4229       if (readbuf)
4230         return (*ops->deprecated_xfer_memory) (offset, readbuf,
4231                                                len, 0/*read*/, NULL, ops);
4232       if (writebuf)
4233         return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
4234                                                len, 1/*write*/, NULL, ops);
4235       return -1;
4236
4237 #ifdef NEW_PROC_API
4238     case TARGET_OBJECT_AUXV:
4239       return memory_xfer_auxv (ops, object, annex, readbuf, writebuf,
4240                                offset, len);
4241 #endif
4242
4243     default:
4244       if (ops->beneath != NULL)
4245         return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
4246                                               readbuf, writebuf, offset, len);
4247       return -1;
4248     }
4249 }
4250
4251
4252 /* Transfer LEN bytes between GDB address MYADDR and target address
4253    MEMADDR.  If DOWRITE is non-zero, transfer them to the target,
4254    otherwise transfer them from the target.  TARGET is unused.
4255
4256    The return value is 0 if an error occurred or no bytes were
4257    transferred.  Otherwise, it will be a positive value which
4258    indicates the number of bytes transferred between gdb and the
4259    target.  (Note that the interface also makes provisions for
4260    negative values, but this capability isn't implemented here.) */
4261
4262 static int
4263 procfs_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int dowrite,
4264                     struct mem_attrib *attrib, struct target_ops *target)
4265 {
4266   procinfo *pi;
4267   int nbytes = 0;
4268
4269   /* Find procinfo for main process */
4270   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
4271   if (pi->as_fd == 0 &&
4272       open_procinfo_files (pi, FD_AS) == 0)
4273     {
4274       proc_warn (pi, "xfer_memory, open_proc_files", __LINE__);
4275       return 0;
4276     }
4277
4278   if (lseek (pi->as_fd, (off_t) memaddr, SEEK_SET) == (off_t) memaddr)
4279     {
4280       if (dowrite)
4281         {
4282 #ifdef NEW_PROC_API
4283           PROCFS_NOTE ("write memory:\n");
4284 #else
4285           PROCFS_NOTE ("write memory:\n");
4286 #endif
4287           nbytes = write (pi->as_fd, myaddr, len);
4288         }
4289       else
4290         {
4291           PROCFS_NOTE ("read  memory:\n");
4292           nbytes = read (pi->as_fd, myaddr, len);
4293         }
4294       if (nbytes < 0)
4295         {
4296           nbytes = 0;
4297         }
4298     }
4299   return nbytes;
4300 }
4301
4302 /* Called by target_resume before making child runnable.  Mark cached
4303    registers and status's invalid.  If there are "dirty" caches that
4304    need to be written back to the child process, do that.
4305
4306    File descriptors are also cached.  As they are a limited resource,
4307    we cannot hold onto them indefinitely.  However, as they are
4308    expensive to open, we don't want to throw them away
4309    indescriminately either.  As a compromise, we will keep the file
4310    descriptors for the parent process, but discard any file
4311    descriptors we may have accumulated for the threads.
4312
4313    As this function is called by iterate_over_threads, it always
4314    returns zero (so that iterate_over_threads will keep
4315    iterating).  */
4316
4317 static int
4318 invalidate_cache (procinfo *parent, procinfo *pi, void *ptr)
4319 {
4320   /* About to run the child; invalidate caches and do any other
4321      cleanup.  */
4322
4323 #if 0
4324   if (pi->gregs_dirty)
4325     if (parent == NULL ||
4326         proc_get_current_thread (parent) != pi->tid)
4327       if (!proc_set_gregs (pi)) /* flush gregs cache */
4328         proc_warn (pi, "target_resume, set_gregs",
4329                    __LINE__);
4330   if (gdbarch_fp0_regnum (target_gdbarch) >= 0)
4331     if (pi->fpregs_dirty)
4332       if (parent == NULL ||
4333           proc_get_current_thread (parent) != pi->tid)
4334         if (!proc_set_fpregs (pi))      /* flush fpregs cache */
4335           proc_warn (pi, "target_resume, set_fpregs",
4336                      __LINE__);
4337 #endif
4338
4339   if (parent != NULL)
4340     {
4341       /* The presence of a parent indicates that this is an LWP.
4342          Close any file descriptors that it might have open.
4343          We don't do this to the master (parent) procinfo.  */
4344
4345       close_procinfo_files (pi);
4346     }
4347   pi->gregs_valid   = 0;
4348   pi->fpregs_valid  = 0;
4349 #if 0
4350   pi->gregs_dirty   = 0;
4351   pi->fpregs_dirty  = 0;
4352 #endif
4353   pi->status_valid  = 0;
4354   pi->threads_valid = 0;
4355
4356   return 0;
4357 }
4358
4359 #if 0
4360 /* A callback function for iterate_over_threads.  Find the
4361    asynchronous signal thread, and make it runnable.  See if that
4362    helps matters any.  */
4363
4364 static int
4365 make_signal_thread_runnable (procinfo *process, procinfo *pi, void *ptr)
4366 {
4367 #ifdef PR_ASLWP
4368   if (proc_flags (pi) & PR_ASLWP)
4369     {
4370       if (!proc_run_process (pi, 0, -1))
4371         proc_error (pi, "make_signal_thread_runnable", __LINE__);
4372       return 1;
4373     }
4374 #endif
4375   return 0;
4376 }
4377 #endif
4378
4379 /* Make the child process runnable.  Normally we will then call
4380    procfs_wait and wait for it to stop again (unless gdb is async).
4381
4382    If STEP is true, then arrange for the child to stop again after
4383    executing a single instruction.  If SIGNO is zero, then cancel any
4384    pending signal; if non-zero, then arrange for the indicated signal
4385    to be delivered to the child when it runs.  If PID is -1, then
4386    allow any child thread to run; if non-zero, then allow only the
4387    indicated thread to run.  (not implemented yet).  */
4388
4389 static void
4390 procfs_resume (struct target_ops *ops,
4391                ptid_t ptid, int step, enum target_signal signo)
4392 {
4393   procinfo *pi, *thread;
4394   int native_signo;
4395
4396   /* 2.1:
4397      prrun.prflags |= PRSVADDR;
4398      prrun.pr_vaddr = $PC;         set resume address
4399      prrun.prflags |= PRSTRACE;    trace signals in pr_trace (all)
4400      prrun.prflags |= PRSFAULT;    trace faults in pr_fault (all but PAGE)
4401      prrun.prflags |= PRCFAULT;    clear current fault.
4402
4403      PRSTRACE and PRSFAULT can be done by other means
4404         (proc_trace_signals, proc_trace_faults)
4405      PRSVADDR is unnecessary.
4406      PRCFAULT may be replaced by a PIOCCFAULT call (proc_clear_current_fault)
4407      This basically leaves PRSTEP and PRCSIG.
4408      PRCSIG is like PIOCSSIG (proc_clear_current_signal).
4409      So basically PR_STEP is the sole argument that must be passed
4410      to proc_run_process (for use in the prrun struct by ioctl).  */
4411
4412   /* Find procinfo for main process */
4413   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
4414
4415   /* First cut: ignore pid argument.  */
4416   errno = 0;
4417
4418   /* Convert signal to host numbering.  */
4419   if (signo == 0 ||
4420       (signo == TARGET_SIGNAL_STOP && pi->ignore_next_sigstop))
4421     native_signo = 0;
4422   else
4423     native_signo = target_signal_to_host (signo);
4424
4425   pi->ignore_next_sigstop = 0;
4426
4427   /* Running the process voids all cached registers and status.  */
4428   /* Void the threads' caches first.  */
4429   proc_iterate_over_threads (pi, invalidate_cache, NULL);
4430   /* Void the process procinfo's caches.  */
4431   invalidate_cache (NULL, pi, NULL);
4432
4433   if (PIDGET (ptid) != -1)
4434     {
4435       /* Resume a specific thread, presumably suppressing the
4436          others.  */
4437       thread = find_procinfo (PIDGET (ptid), TIDGET (ptid));
4438       if (thread != NULL)
4439         {
4440           if (thread->tid != 0)
4441             {
4442               /* We're to resume a specific thread, and not the
4443                  others.  Set the child process's PR_ASYNC flag.  */
4444 #ifdef PR_ASYNC
4445               if (!proc_set_async (pi))
4446                 proc_error (pi, "target_resume, set_async", __LINE__);
4447 #endif
4448 #if 0
4449               proc_iterate_over_threads (pi,
4450                                          make_signal_thread_runnable,
4451                                          NULL);
4452 #endif
4453               pi = thread;      /* substitute the thread's procinfo for run */
4454             }
4455         }
4456     }
4457
4458   if (!proc_run_process (pi, step, native_signo))
4459     {
4460       if (errno == EBUSY)
4461         warning (_("resume: target already running.  "
4462                    "Pretend to resume, and hope for the best!"));
4463       else
4464         proc_error (pi, "target_resume", __LINE__);
4465     }
4466 }
4467
4468 /* Traverse the list of signals that GDB knows about (see "handle"
4469    command), and arrange for the target to be stopped or not,
4470    according to these settings.  Returns non-zero for success, zero
4471    for failure.  */
4472
4473 static int
4474 register_gdb_signals (procinfo *pi, gdb_sigset_t *signals)
4475 {
4476   int signo;
4477
4478   for (signo = 0; signo < NSIG; signo ++)
4479     if (signal_stop_state  (target_signal_from_host (signo)) == 0 &&
4480         signal_print_state (target_signal_from_host (signo)) == 0 &&
4481         signal_pass_state  (target_signal_from_host (signo)) == 1)
4482       gdb_prdelset (signals, signo);
4483     else
4484       gdb_praddset (signals, signo);
4485
4486   return proc_set_traced_signals (pi, signals);
4487 }
4488
4489 /* Set up to trace signals in the child process.  */
4490
4491 static void
4492 procfs_notice_signals (ptid_t ptid)
4493 {
4494   gdb_sigset_t signals;
4495   procinfo *pi = find_procinfo_or_die (PIDGET (ptid), 0);
4496
4497   if (proc_get_traced_signals (pi, &signals) &&
4498       register_gdb_signals    (pi, &signals))
4499     return;
4500   else
4501     proc_error (pi, "notice_signals", __LINE__);
4502 }
4503
4504 /* Print status information about the child process.  */
4505
4506 static void
4507 procfs_files_info (struct target_ops *ignore)
4508 {
4509   struct inferior *inf = current_inferior ();
4510
4511   printf_filtered (_("\tUsing the running image of %s %s via /proc.\n"),
4512                    inf->attach_flag? "attached": "child",
4513                    target_pid_to_str (inferior_ptid));
4514 }
4515
4516 /* Stop the child process asynchronously, as when the gdb user types
4517    control-c or presses a "stop" button.  Works by sending
4518    kill(SIGINT) to the child's process group.  */
4519
4520 static void
4521 procfs_stop (ptid_t ptid)
4522 {
4523   kill (-inferior_process_group (), SIGINT);
4524 }
4525
4526 /* Make it die.  Wait for it to die.  Clean up after it.  Note: this
4527    should only be applied to the real process, not to an LWP, because
4528    of the check for parent-process.  If we need this to work for an
4529    LWP, it needs some more logic.  */
4530
4531 static void
4532 unconditionally_kill_inferior (procinfo *pi)
4533 {
4534   int parent_pid;
4535
4536   parent_pid = proc_parent_pid (pi);
4537 #ifdef PROCFS_NEED_CLEAR_CURSIG_FOR_KILL
4538   /* FIXME: use access functions */
4539   /* Alpha OSF/1-3.x procfs needs a clear of the current signal
4540      before the PIOCKILL, otherwise it might generate a corrupted core
4541      file for the inferior.  */
4542   if (ioctl (pi->ctl_fd, PIOCSSIG, NULL) < 0)
4543     {
4544       printf_filtered ("unconditionally_kill: SSIG failed!\n");
4545     }
4546 #endif
4547 #ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
4548   /* Alpha OSF/1-2.x procfs needs a PIOCSSIG call with a SIGKILL signal
4549      to kill the inferior, otherwise it might remain stopped with a
4550      pending SIGKILL.
4551      We do not check the result of the PIOCSSIG, the inferior might have
4552      died already.  */
4553   {
4554     gdb_siginfo_t newsiginfo;
4555
4556     memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
4557     newsiginfo.si_signo = SIGKILL;
4558     newsiginfo.si_code = 0;
4559     newsiginfo.si_errno = 0;
4560     newsiginfo.si_pid = getpid ();
4561     newsiginfo.si_uid = getuid ();
4562     /* FIXME: use proc_set_current_signal */
4563     ioctl (pi->ctl_fd, PIOCSSIG, &newsiginfo);
4564   }
4565 #else /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
4566   if (!proc_kill (pi, SIGKILL))
4567     proc_error (pi, "unconditionally_kill, proc_kill", __LINE__);
4568 #endif /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
4569   destroy_procinfo (pi);
4570
4571   /* If pi is GDB's child, wait for it to die.  */
4572   if (parent_pid == getpid ())
4573     /* FIXME: should we use waitpid to make sure we get the right event?
4574        Should we check the returned event?  */
4575     {
4576 #if 0
4577       int status, ret;
4578
4579       ret = waitpid (pi->pid, &status, 0);
4580 #else
4581       wait (NULL);
4582 #endif
4583     }
4584 }
4585
4586 /* We're done debugging it, and we want it to go away.  Then we want
4587    GDB to forget all about it.  */
4588
4589 static void
4590 procfs_kill_inferior (struct target_ops *ops)
4591 {
4592   if (!ptid_equal (inferior_ptid, null_ptid)) /* ? */
4593     {
4594       /* Find procinfo for main process */
4595       procinfo *pi = find_procinfo (PIDGET (inferior_ptid), 0);
4596
4597       if (pi)
4598         unconditionally_kill_inferior (pi);
4599       target_mourn_inferior ();
4600     }
4601 }
4602
4603 /* Forget we ever debugged this thing!  */
4604
4605 static void
4606 procfs_mourn_inferior (struct target_ops *ops)
4607 {
4608   procinfo *pi;
4609
4610   if (!ptid_equal (inferior_ptid, null_ptid))
4611     {
4612       /* Find procinfo for main process */
4613       pi = find_procinfo (PIDGET (inferior_ptid), 0);
4614       if (pi)
4615         destroy_procinfo (pi);
4616     }
4617   unpush_target (ops);
4618
4619   if (dbx_link_bpt != NULL)
4620     {
4621       deprecated_remove_raw_breakpoint (target_gdbarch, dbx_link_bpt);
4622       dbx_link_bpt_addr = 0;
4623       dbx_link_bpt = NULL;
4624     }
4625
4626   generic_mourn_inferior ();
4627 }
4628
4629 /* When GDB forks to create a runnable inferior process, this function
4630    is called on the parent side of the fork.  It's job is to do
4631    whatever is necessary to make the child ready to be debugged, and
4632    then wait for the child to synchronize.  */
4633
4634 static void
4635 procfs_init_inferior (struct target_ops *ops, int pid)
4636 {
4637   procinfo *pi;
4638   gdb_sigset_t signals;
4639   int fail;
4640   int lwpid;
4641
4642   /* This routine called on the parent side (GDB side)
4643      after GDB forks the inferior.  */
4644   push_target (ops);
4645
4646   if ((pi = create_procinfo (pid, 0)) == NULL)
4647     perror ("procfs: out of memory in 'init_inferior'");
4648
4649   if (!open_procinfo_files (pi, FD_CTL))
4650     proc_error (pi, "init_inferior, open_proc_files", __LINE__);
4651
4652   /*
4653     xmalloc                     // done
4654     open_procinfo_files         // done
4655     link list                   // done
4656     prfillset (trace)
4657     procfs_notice_signals
4658     prfillset (fault)
4659     prdelset (FLTPAGE)
4660     PIOCWSTOP
4661     PIOCSFAULT
4662     */
4663
4664   /* If not stopped yet, wait for it to stop.  */
4665   if (!(proc_flags (pi) & PR_STOPPED) &&
4666       !(proc_wait_for_stop (pi)))
4667     dead_procinfo (pi, "init_inferior: wait_for_stop failed", KILL);
4668
4669   /* Save some of the /proc state to be restored if we detach.  */
4670   /* FIXME: Why?  In case another debugger was debugging it?
4671      We're it's parent, for Ghu's sake! */
4672   if (!proc_get_traced_signals  (pi, &pi->saved_sigset))
4673     proc_error (pi, "init_inferior, get_traced_signals", __LINE__);
4674   if (!proc_get_held_signals    (pi, &pi->saved_sighold))
4675     proc_error (pi, "init_inferior, get_held_signals", __LINE__);
4676   if (!proc_get_traced_faults   (pi, &pi->saved_fltset))
4677     proc_error (pi, "init_inferior, get_traced_faults", __LINE__);
4678   if (!proc_get_traced_sysentry (pi, pi->saved_entryset))
4679     proc_error (pi, "init_inferior, get_traced_sysentry", __LINE__);
4680   if (!proc_get_traced_sysexit  (pi, pi->saved_exitset))
4681     proc_error (pi, "init_inferior, get_traced_sysexit", __LINE__);
4682
4683   /* Register to trace selected signals in the child.  */
4684   prfillset (&signals);
4685   if (!register_gdb_signals (pi, &signals))
4686     proc_error (pi, "init_inferior, register_signals", __LINE__);
4687
4688   if ((fail = procfs_debug_inferior (pi)) != 0)
4689     proc_error (pi, "init_inferior (procfs_debug_inferior)", fail);
4690
4691   /* FIXME: logically, we should really be turning OFF run-on-last-close,
4692      and possibly even turning ON kill-on-last-close at this point.  But
4693      I can't make that change without careful testing which I don't have
4694      time to do right now...  */
4695   /* Turn on run-on-last-close flag so that the child
4696      will die if GDB goes away for some reason.  */
4697   if (!proc_set_run_on_last_close (pi))
4698     proc_error (pi, "init_inferior, set_RLC", __LINE__);
4699
4700   /* We now have have access to the lwpid of the main thread/lwp.  */
4701   lwpid = proc_get_current_thread (pi);
4702
4703   /* Create a procinfo for the main lwp.  */
4704   create_procinfo (pid, lwpid);
4705
4706   /* We already have a main thread registered in the thread table at
4707      this point, but it didn't have any lwp info yet.  Notify the core
4708      about it.  This changes inferior_ptid as well.  */
4709   thread_change_ptid (pid_to_ptid (pid),
4710                       MERGEPID (pid, lwpid));
4711
4712   /* Typically two, one trap to exec the shell, one to exec the
4713      program being debugged.  Defined by "inferior.h".  */
4714   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
4715
4716 #ifdef SYS_syssgi
4717   /* On mips-irix, we need to stop the inferior early enough during
4718      the startup phase in order to be able to load the shared library
4719      symbols and insert the breakpoints that are located in these shared
4720      libraries.  Stopping at the program entry point is not good enough
4721      because the -init code is executed before the execution reaches
4722      that point.
4723
4724      So what we need to do is to insert a breakpoint in the runtime
4725      loader (rld), more precisely in __dbx_link().  This procedure is
4726      called by rld once all shared libraries have been mapped, but before
4727      the -init code is executed. Unfortuantely, this is not straightforward,
4728      as rld is not part of the executable we are running, and thus we need
4729      the inferior to run until rld itself has been mapped in memory.
4730
4731      For this, we trace all syssgi() syscall exit events.  Each time
4732      we detect such an event, we iterate over each text memory maps,
4733      get its associated fd, and scan the symbol table for __dbx_link().
4734      When found, we know that rld has been mapped, and that we can insert
4735      the breakpoint at the symbol address.  Once the dbx_link() breakpoint
4736      has been inserted, the syssgi() notifications are no longer necessary,
4737      so they should be canceled.  */
4738   proc_trace_syscalls_1 (pi, SYS_syssgi, PR_SYSEXIT, FLAG_SET, 0);
4739 #endif
4740 }
4741
4742 /* When GDB forks to create a new process, this function is called on
4743    the child side of the fork before GDB exec's the user program.  Its
4744    job is to make the child minimally debuggable, so that the parent
4745    GDB process can connect to the child and take over.  This function
4746    should do only the minimum to make that possible, and to
4747    synchronize with the parent process.  The parent process should
4748    take care of the details.  */
4749
4750 static void
4751 procfs_set_exec_trap (void)
4752 {
4753   /* This routine called on the child side (inferior side)
4754      after GDB forks the inferior.  It must use only local variables,
4755      because it may be sharing data space with its parent.  */
4756
4757   procinfo *pi;
4758   sysset_t *exitset;
4759
4760   if ((pi = create_procinfo (getpid (), 0)) == NULL)
4761     perror_with_name (_("procfs: create_procinfo failed in child."));
4762
4763   if (open_procinfo_files (pi, FD_CTL) == 0)
4764     {
4765       proc_warn (pi, "set_exec_trap, open_proc_files", __LINE__);
4766       gdb_flush (gdb_stderr);
4767       /* No need to call "dead_procinfo", because we're going to
4768          exit.  */
4769       _exit (127);
4770     }
4771
4772 #ifdef PRFS_STOPEXEC    /* defined on OSF */
4773   /* OSF method for tracing exec syscalls.  Quoting:
4774      Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
4775      exits from exec system calls because of the user level loader.  */
4776   /* FIXME: make nice and maybe move into an access function.  */
4777   {
4778     int prfs_flags;
4779
4780     if (ioctl (pi->ctl_fd, PIOCGSPCACT, &prfs_flags) < 0)
4781       {
4782         proc_warn (pi, "set_exec_trap (PIOCGSPCACT)", __LINE__);
4783         gdb_flush (gdb_stderr);
4784         _exit (127);
4785       }
4786     prfs_flags |= PRFS_STOPEXEC;
4787
4788     if (ioctl (pi->ctl_fd, PIOCSSPCACT, &prfs_flags) < 0)
4789       {
4790         proc_warn (pi, "set_exec_trap (PIOCSSPCACT)", __LINE__);
4791         gdb_flush (gdb_stderr);
4792         _exit (127);
4793       }
4794   }
4795 #else /* not PRFS_STOPEXEC */
4796   /* Everyone else's (except OSF) method for tracing exec syscalls.  */
4797   /* GW: Rationale...
4798      Not all systems with /proc have all the exec* syscalls with the same
4799      names.  On the SGI, for example, there is no SYS_exec, but there
4800      *is* a SYS_execv.  So, we try to account for that.  */
4801
4802   exitset = sysset_t_alloc (pi);
4803   gdb_premptysysset (exitset);
4804 #ifdef SYS_exec
4805   gdb_praddsysset (exitset, SYS_exec);
4806 #endif
4807 #ifdef SYS_execve
4808   gdb_praddsysset (exitset, SYS_execve);
4809 #endif
4810 #ifdef SYS_execv
4811   gdb_praddsysset (exitset, SYS_execv);
4812 #endif
4813 #ifdef DYNAMIC_SYSCALLS
4814   {
4815     int callnum = find_syscall (pi, "execve");
4816
4817     if (callnum >= 0)
4818       gdb_praddsysset (exitset, callnum);
4819
4820     callnum = find_syscall (pi, "ra_execve");
4821     if (callnum >= 0)
4822       gdb_praddsysset (exitset, callnum);
4823   }
4824 #endif /* DYNAMIC_SYSCALLS */
4825
4826   if (!proc_set_traced_sysexit (pi, exitset))
4827     {
4828       proc_warn (pi, "set_exec_trap, set_traced_sysexit", __LINE__);
4829       gdb_flush (gdb_stderr);
4830       _exit (127);
4831     }
4832 #endif /* PRFS_STOPEXEC */
4833
4834   /* FIXME: should this be done in the parent instead? */
4835   /* Turn off inherit on fork flag so that all grand-children
4836      of gdb start with tracing flags cleared.  */
4837   if (!proc_unset_inherit_on_fork (pi))
4838     proc_warn (pi, "set_exec_trap, unset_inherit", __LINE__);
4839
4840   /* Turn off run on last close flag, so that the child process
4841      cannot run away just because we close our handle on it.
4842      We want it to wait for the parent to attach.  */
4843   if (!proc_unset_run_on_last_close (pi))
4844     proc_warn (pi, "set_exec_trap, unset_RLC", __LINE__);
4845
4846   /* FIXME: No need to destroy the procinfo --
4847      we have our own address space, and we're about to do an exec! */
4848   /*destroy_procinfo (pi);*/
4849 }
4850
4851 /* This function is called BEFORE gdb forks the inferior process.  Its
4852    only real responsibility is to set things up for the fork, and tell
4853    GDB which two functions to call after the fork (one for the parent,
4854    and one for the child).
4855
4856    This function does a complicated search for a unix shell program,
4857    which it then uses to parse arguments and environment variables to
4858    be sent to the child.  I wonder whether this code could not be
4859    abstracted out and shared with other unix targets such as
4860    inf-ptrace?  */
4861
4862 static void
4863 procfs_create_inferior (struct target_ops *ops, char *exec_file,
4864                         char *allargs, char **env, int from_tty)
4865 {
4866   char *shell_file = getenv ("SHELL");
4867   char *tryname;
4868   int pid;
4869
4870   if (shell_file != NULL && strchr (shell_file, '/') == NULL)
4871     {
4872
4873       /* We will be looking down the PATH to find shell_file.  If we
4874          just do this the normal way (via execlp, which operates by
4875          attempting an exec for each element of the PATH until it
4876          finds one which succeeds), then there will be an exec for
4877          each failed attempt, each of which will cause a PR_SYSEXIT
4878          stop, and we won't know how to distinguish the PR_SYSEXIT's
4879          for these failed execs with the ones for successful execs
4880          (whether the exec has succeeded is stored at that time in the
4881          carry bit or some such architecture-specific and
4882          non-ABI-specified place).
4883
4884          So I can't think of anything better than to search the PATH
4885          now.  This has several disadvantages: (1) There is a race
4886          condition; if we find a file now and it is deleted before we
4887          exec it, we lose, even if the deletion leaves a valid file
4888          further down in the PATH, (2) there is no way to know exactly
4889          what an executable (in the sense of "capable of being
4890          exec'd") file is.  Using access() loses because it may lose
4891          if the caller is the superuser; failing to use it loses if
4892          there are ACLs or some such.  */
4893
4894       char *p;
4895       char *p1;
4896       /* FIXME-maybe: might want "set path" command so user can change what
4897          path is used from within GDB.  */
4898       char *path = getenv ("PATH");
4899       int len;
4900       struct stat statbuf;
4901
4902       if (path == NULL)
4903         path = "/bin:/usr/bin";
4904
4905       tryname = alloca (strlen (path) + strlen (shell_file) + 2);
4906       for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
4907         {
4908           p1 = strchr (p, ':');
4909           if (p1 != NULL)
4910             len = p1 - p;
4911           else
4912             len = strlen (p);
4913           strncpy (tryname, p, len);
4914           tryname[len] = '\0';
4915           strcat (tryname, "/");
4916           strcat (tryname, shell_file);
4917           if (access (tryname, X_OK) < 0)
4918             continue;
4919           if (stat (tryname, &statbuf) < 0)
4920             continue;
4921           if (!S_ISREG (statbuf.st_mode))
4922             /* We certainly need to reject directories.  I'm not quite
4923                as sure about FIFOs, sockets, etc., but I kind of doubt
4924                that people want to exec() these things.  */
4925             continue;
4926           break;
4927         }
4928       if (p == NULL)
4929         /* Not found.  This must be an error rather than merely passing
4930            the file to execlp(), because execlp() would try all the
4931            exec()s, causing GDB to get confused.  */
4932         error (_("procfs:%d -- Can't find shell %s in PATH"),
4933                __LINE__, shell_file);
4934
4935       shell_file = tryname;
4936     }
4937
4938   pid = fork_inferior (exec_file, allargs, env, procfs_set_exec_trap,
4939                        NULL, NULL, shell_file);
4940
4941   procfs_init_inferior (ops, pid);
4942 }
4943
4944 /* An observer for the "inferior_created" event.  */
4945
4946 static void
4947 procfs_inferior_created (struct target_ops *ops, int from_tty)
4948 {
4949 #ifdef SYS_syssgi
4950   /* Make sure to cancel the syssgi() syscall-exit notifications.
4951      They should normally have been removed by now, but they may still
4952      be activated if the inferior doesn't use shared libraries, or if
4953      we didn't locate __dbx_link, or if we never stopped in __dbx_link.
4954      See procfs_init_inferior() for more details.
4955
4956      Since these notifications are only ever enabled when we spawned
4957      the inferior ourselves, there is nothing to do when the inferior
4958      was created by attaching to an already running process, or when
4959      debugging a core file.  */
4960   if (current_inferior ()->attach_flag || !target_can_run (&current_target))
4961     return;
4962
4963   proc_trace_syscalls_1 (find_procinfo_or_die (PIDGET (inferior_ptid), 0),
4964                          SYS_syssgi, PR_SYSEXIT, FLAG_RESET, 0);
4965 #endif
4966 }
4967
4968 /* Callback for find_new_threads.  Calls "add_thread".  */
4969
4970 static int
4971 procfs_notice_thread (procinfo *pi, procinfo *thread, void *ptr)
4972 {
4973   ptid_t gdb_threadid = MERGEPID (pi->pid, thread->tid);
4974
4975   if (!in_thread_list (gdb_threadid) || is_exited (gdb_threadid))
4976     add_thread (gdb_threadid);
4977
4978   return 0;
4979 }
4980
4981 /* Query all the threads that the target knows about, and give them
4982    back to GDB to add to its list.  */
4983
4984 void
4985 procfs_find_new_threads (struct target_ops *ops)
4986 {
4987   procinfo *pi;
4988
4989   /* Find procinfo for main process */
4990   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
4991   proc_update_threads (pi);
4992   proc_iterate_over_threads (pi, procfs_notice_thread, NULL);
4993 }
4994
4995 /* Return true if the thread is still 'alive'.  This guy doesn't
4996    really seem to be doing his job.  Got to investigate how to tell
4997    when a thread is really gone.  */
4998
4999 static int
5000 procfs_thread_alive (struct target_ops *ops, ptid_t ptid)
5001 {
5002   int proc, thread;
5003   procinfo *pi;
5004
5005   proc    = PIDGET (ptid);
5006   thread  = TIDGET (ptid);
5007   /* If I don't know it, it ain't alive! */
5008   if ((pi = find_procinfo (proc, thread)) == NULL)
5009     return 0;
5010
5011   /* If I can't get its status, it ain't alive!
5012      What's more, I need to forget about it!  */
5013   if (!proc_get_status (pi))
5014     {
5015       destroy_procinfo (pi);
5016       return 0;
5017     }
5018   /* I couldn't have got its status if it weren't alive, so it's
5019      alive.  */
5020   return 1;
5021 }
5022
5023 /* Convert PTID to a string.  Returns the string in a static
5024    buffer.  */
5025
5026 char *
5027 procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
5028 {
5029   static char buf[80];
5030
5031   if (TIDGET (ptid) == 0)
5032     sprintf (buf, "process %d", PIDGET (ptid));
5033   else
5034     sprintf (buf, "LWP %ld", TIDGET (ptid));
5035
5036   return buf;
5037 }
5038
5039 /* Insert a watchpoint.  */
5040
5041 int
5042 procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag,
5043                        int after)
5044 {
5045 #ifndef UNIXWARE
5046 #ifndef AIX5
5047   int       pflags = 0;
5048   procinfo *pi;
5049
5050   pi = find_procinfo_or_die (PIDGET (ptid) == -1 ?
5051                              PIDGET (inferior_ptid) : PIDGET (ptid), 0);
5052
5053   /* Translate from GDB's flags to /proc's */
5054   if (len > 0)  /* len == 0 means delete watchpoint */
5055     {
5056       switch (rwflag) {         /* FIXME: need an enum! */
5057       case hw_write:            /* default watchpoint (write) */
5058         pflags = WRITE_WATCHFLAG;
5059         break;
5060       case hw_read:             /* read watchpoint */
5061         pflags = READ_WATCHFLAG;
5062         break;
5063       case hw_access:           /* access watchpoint */
5064         pflags = READ_WATCHFLAG | WRITE_WATCHFLAG;
5065         break;
5066       case hw_execute:          /* execution HW breakpoint */
5067         pflags = EXEC_WATCHFLAG;
5068         break;
5069       default:                  /* Something weird.  Return error. */
5070         return -1;
5071       }
5072       if (after)                /* Stop after r/w access is completed. */
5073         pflags |= AFTER_WATCHFLAG;
5074     }
5075
5076   if (!proc_set_watchpoint (pi, addr, len, pflags))
5077     {
5078       if (errno == E2BIG)       /* Typical error for no resources */
5079         return -1;              /* fail */
5080       /* GDB may try to remove the same watchpoint twice.
5081          If a remove request returns no match, don't error.  */
5082       if (errno == ESRCH && len == 0)
5083         return 0;               /* ignore */
5084       proc_error (pi, "set_watchpoint", __LINE__);
5085     }
5086 #endif /* AIX5 */
5087 #endif /* UNIXWARE */
5088   return 0;
5089 }
5090
5091 /* Return non-zero if we can set a hardware watchpoint of type TYPE.  TYPE
5092    is one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint,
5093    or bp_hardware_watchpoint.  CNT is the number of watchpoints used so
5094    far.
5095
5096    Note:  procfs_can_use_hw_breakpoint() is not yet used by all
5097    procfs.c targets due to the fact that some of them still define
5098    target_can_use_hardware_watchpoint.  */
5099
5100 static int
5101 procfs_can_use_hw_breakpoint (int type, int cnt, int othertype)
5102 {
5103   /* Due to the way that proc_set_watchpoint() is implemented, host
5104      and target pointers must be of the same size.  If they are not,
5105      we can't use hardware watchpoints.  This limitation is due to the
5106      fact that proc_set_watchpoint() calls
5107      procfs_address_to_host_pointer(); a close inspection of
5108      procfs_address_to_host_pointer will reveal that an internal error
5109      will be generated when the host and target pointer sizes are
5110      different.  */
5111   struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
5112
5113   if (sizeof (void *) != TYPE_LENGTH (ptr_type))
5114     return 0;
5115
5116   /* Other tests here???  */
5117
5118   return 1;
5119 }
5120
5121 /* Returns non-zero if process is stopped on a hardware watchpoint
5122    fault, else returns zero.  */
5123
5124 static int
5125 procfs_stopped_by_watchpoint (void)
5126 {
5127   procinfo *pi;
5128
5129   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5130
5131   if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
5132     {
5133       if (proc_why (pi) == PR_FAULTED)
5134         {
5135 #ifdef FLTWATCH
5136           if (proc_what (pi) == FLTWATCH)
5137             return 1;
5138 #endif
5139 #ifdef FLTKWATCH
5140           if (proc_what (pi) == FLTKWATCH)
5141             return 1;
5142 #endif
5143         }
5144     }
5145   return 0;
5146 }
5147
5148 /* Returns 1 if the OS knows the position of the triggered watchpoint,
5149    and sets *ADDR to that address.  Returns 0 if OS cannot report that
5150    address.  This function is only called if
5151    procfs_stopped_by_watchpoint returned 1, thus no further checks are
5152    done.  The function also assumes that ADDR is not NULL.  */
5153
5154 static int
5155 procfs_stopped_data_address (struct target_ops *targ, CORE_ADDR *addr)
5156 {
5157   procinfo *pi;
5158
5159   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5160   return proc_watchpoint_address (pi, addr);
5161 }
5162
5163 static int
5164 procfs_insert_watchpoint (CORE_ADDR addr, int len, int type)
5165 {
5166   if (!target_have_steppable_watchpoint
5167       && !gdbarch_have_nonsteppable_watchpoint (target_gdbarch))
5168     {
5169       /* When a hardware watchpoint fires off the PC will be left at
5170          the instruction following the one which caused the
5171          watchpoint.  It will *NOT* be necessary for GDB to step over
5172          the watchpoint.  */
5173       return procfs_set_watchpoint (inferior_ptid, addr, len, type, 1);
5174     }
5175   else
5176     {
5177       /* When a hardware watchpoint fires off the PC will be left at
5178          the instruction which caused the watchpoint.  It will be
5179          necessary for GDB to step over the watchpoint.  */
5180       return procfs_set_watchpoint (inferior_ptid, addr, len, type, 0);
5181     }
5182 }
5183
5184 static int
5185 procfs_remove_watchpoint (CORE_ADDR addr, int len, int type)
5186 {
5187   return procfs_set_watchpoint (inferior_ptid, addr, 0, 0, 0);
5188 }
5189
5190 static int
5191 procfs_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
5192 {
5193   /* The man page for proc(4) on Solaris 2.6 and up says that the
5194      system can support "thousands" of hardware watchpoints, but gives
5195      no method for finding out how many; It doesn't say anything about
5196      the allowed size for the watched area either.  So we just tell
5197      GDB 'yes'.  */
5198   return 1;
5199 }
5200
5201 void
5202 procfs_use_watchpoints (struct target_ops *t)
5203 {
5204   t->to_stopped_by_watchpoint = procfs_stopped_by_watchpoint;
5205   t->to_insert_watchpoint = procfs_insert_watchpoint;
5206   t->to_remove_watchpoint = procfs_remove_watchpoint;
5207   t->to_region_ok_for_hw_watchpoint = procfs_region_ok_for_hw_watchpoint;
5208   t->to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint;
5209   t->to_stopped_data_address = procfs_stopped_data_address;
5210 }
5211
5212 /* Memory Mappings Functions: */
5213
5214 /* Call a callback function once for each mapping, passing it the
5215    mapping, an optional secondary callback function, and some optional
5216    opaque data.  Quit and return the first non-zero value returned
5217    from the callback.
5218
5219    PI is the procinfo struct for the process to be mapped.  FUNC is
5220    the callback function to be called by this iterator.  DATA is the
5221    optional opaque data to be passed to the callback function.
5222    CHILD_FUNC is the optional secondary function pointer to be passed
5223    to the child function.  Returns the first non-zero return value
5224    from the callback function, or zero.  */
5225
5226 static int
5227 iterate_over_mappings (procinfo *pi,
5228                        iterate_over_mappings_cb_ftype *child_func,
5229                        void *data,
5230                        int (*func) (struct prmap *map,
5231                                     iterate_over_mappings_cb_ftype *child_func,
5232                                     void *data))
5233 {
5234   char pathname[MAX_PROC_NAME_SIZE];
5235   struct prmap *prmaps;
5236   struct prmap *prmap;
5237   int funcstat;
5238   int map_fd;
5239   int nmap;
5240 #ifdef NEW_PROC_API
5241   struct stat sbuf;
5242 #endif
5243
5244   /* Get the number of mappings, allocate space,
5245      and read the mappings into prmaps.  */
5246 #ifdef NEW_PROC_API
5247   /* Open map fd. */
5248   sprintf (pathname, "/proc/%d/map", pi->pid);
5249   if ((map_fd = open (pathname, O_RDONLY)) < 0)
5250     proc_error (pi, "iterate_over_mappings (open)", __LINE__);
5251
5252   /* Make sure it gets closed again. */
5253   make_cleanup_close (map_fd);
5254
5255   /* Use stat to determine the file size, and compute
5256      the number of prmap_t objects it contains.  */
5257   if (fstat (map_fd, &sbuf) != 0)
5258     proc_error (pi, "iterate_over_mappings (fstat)", __LINE__);
5259
5260   nmap = sbuf.st_size / sizeof (prmap_t);
5261   prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
5262   if (read (map_fd, (char *) prmaps, nmap * sizeof (*prmaps))
5263       != (nmap * sizeof (*prmaps)))
5264     proc_error (pi, "iterate_over_mappings (read)", __LINE__);
5265 #else
5266   /* Use ioctl command PIOCNMAP to get number of mappings.  */
5267   if (ioctl (pi->ctl_fd, PIOCNMAP, &nmap) != 0)
5268     proc_error (pi, "iterate_over_mappings (PIOCNMAP)", __LINE__);
5269
5270   prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
5271   if (ioctl (pi->ctl_fd, PIOCMAP, prmaps) != 0)
5272     proc_error (pi, "iterate_over_mappings (PIOCMAP)", __LINE__);
5273 #endif
5274
5275   for (prmap = prmaps; nmap > 0; prmap++, nmap--)
5276     if ((funcstat = (*func) (prmap, child_func, data)) != 0)
5277       return funcstat;
5278
5279   return 0;
5280 }
5281
5282 /* Implements the to_find_memory_regions method.  Calls an external
5283    function for each memory region.  The external function will have
5284    the signature:
5285
5286      int callback (CORE_ADDR vaddr,
5287                    unsigned long size,
5288                    int read, int write, int execute,
5289                    void *data);
5290
5291    Returns the integer value returned by the callback.  */
5292
5293 static int
5294 find_memory_regions_callback (struct prmap *map,
5295                               int (*func) (CORE_ADDR,
5296                                            unsigned long,
5297                                            int, int, int,
5298                                            void *),
5299                               void *data)
5300 {
5301   return (*func) ((CORE_ADDR) map->pr_vaddr,
5302                   map->pr_size,
5303                   (map->pr_mflags & MA_READ) != 0,
5304                   (map->pr_mflags & MA_WRITE) != 0,
5305                   (map->pr_mflags & MA_EXEC) != 0,
5306                   data);
5307 }
5308
5309 /* External interface.  Calls a callback function once for each
5310    mapped memory region in the child process, passing as arguments:
5311
5312         CORE_ADDR virtual_address,
5313         unsigned long size,
5314         int read,       TRUE if region is readable by the child
5315         int write,      TRUE if region is writable by the child
5316         int execute     TRUE if region is executable by the child.
5317
5318    Stops iterating and returns the first non-zero value returned by
5319    the callback.  */
5320
5321 static int
5322 proc_find_memory_regions (int (*func) (CORE_ADDR,
5323                                        unsigned long,
5324                                        int, int, int,
5325                                        void *),
5326                           void *data)
5327 {
5328   procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5329
5330   return iterate_over_mappings (pi, func, data,
5331                                 find_memory_regions_callback);
5332 }
5333
5334 /* Returns an ascii representation of a memory mapping's flags.  */
5335
5336 static char *
5337 mappingflags (long flags)
5338 {
5339   static char asciiflags[8];
5340
5341   strcpy (asciiflags, "-------");
5342 #if defined (MA_PHYS)
5343   if (flags & MA_PHYS)
5344     asciiflags[0] = 'd';
5345 #endif
5346   if (flags & MA_STACK)
5347     asciiflags[1] = 's';
5348   if (flags & MA_BREAK)
5349     asciiflags[2] = 'b';
5350   if (flags & MA_SHARED)
5351     asciiflags[3] = 's';
5352   if (flags & MA_READ)
5353     asciiflags[4] = 'r';
5354   if (flags & MA_WRITE)
5355     asciiflags[5] = 'w';
5356   if (flags & MA_EXEC)
5357     asciiflags[6] = 'x';
5358   return (asciiflags);
5359 }
5360
5361 /* Callback function, does the actual work for 'info proc
5362    mappings'.  */
5363
5364 static int
5365 info_mappings_callback (struct prmap *map,
5366                         iterate_over_mappings_cb_ftype *ignore,
5367                         void *unused)
5368 {
5369   unsigned int pr_off;
5370
5371 #ifdef PCAGENT  /* Horrible hack: only defined on Solaris 2.6+ */
5372   pr_off = (unsigned int) map->pr_offset;
5373 #else
5374   pr_off = map->pr_off;
5375 #endif
5376
5377   if (gdbarch_addr_bit (target_gdbarch) == 32)
5378     printf_filtered ("\t%#10lx %#10lx %#10lx %#10x %7s\n",
5379                      (unsigned long) map->pr_vaddr,
5380                      (unsigned long) map->pr_vaddr + map->pr_size - 1,
5381                      (unsigned long) map->pr_size,
5382                      pr_off,
5383                      mappingflags (map->pr_mflags));
5384   else
5385     printf_filtered ("  %#18lx %#18lx %#10lx %#10x %7s\n",
5386                      (unsigned long) map->pr_vaddr,
5387                      (unsigned long) map->pr_vaddr + map->pr_size - 1,
5388                      (unsigned long) map->pr_size,
5389                      pr_off,
5390                      mappingflags (map->pr_mflags));
5391
5392   return 0;
5393 }
5394
5395 /* Implement the "info proc mappings" subcommand.  */
5396
5397 static void
5398 info_proc_mappings (procinfo *pi, int summary)
5399 {
5400   if (summary)
5401     return;     /* No output for summary mode. */
5402
5403   printf_filtered (_("Mapped address spaces:\n\n"));
5404   if (gdbarch_ptr_bit (target_gdbarch) == 32)
5405     printf_filtered ("\t%10s %10s %10s %10s %7s\n",
5406                      "Start Addr",
5407                      "  End Addr",
5408                      "      Size",
5409                      "    Offset",
5410                      "Flags");
5411   else
5412     printf_filtered ("  %18s %18s %10s %10s %7s\n",
5413                      "Start Addr",
5414                      "  End Addr",
5415                      "      Size",
5416                      "    Offset",
5417                      "Flags");
5418
5419   iterate_over_mappings (pi, NULL, NULL, info_mappings_callback);
5420   printf_filtered ("\n");
5421 }
5422
5423 /* Implement the "info proc" command.  */
5424
5425 static void
5426 info_proc_cmd (char *args, int from_tty)
5427 {
5428   struct cleanup *old_chain;
5429   procinfo *process  = NULL;
5430   procinfo *thread   = NULL;
5431   char    **argv     = NULL;
5432   char     *tmp      = NULL;
5433   int       pid      = 0;
5434   int       tid      = 0;
5435   int       mappings = 0;
5436
5437   old_chain = make_cleanup (null_cleanup, 0);
5438   if (args)
5439     {
5440       argv = gdb_buildargv (args);
5441       make_cleanup_freeargv (argv);
5442     }
5443   while (argv != NULL && *argv != NULL)
5444     {
5445       if (isdigit (argv[0][0]))
5446         {
5447           pid = strtoul (argv[0], &tmp, 10);
5448           if (*tmp == '/')
5449             tid = strtoul (++tmp, NULL, 10);
5450         }
5451       else if (argv[0][0] == '/')
5452         {
5453           tid = strtoul (argv[0] + 1, NULL, 10);
5454         }
5455       else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0)
5456         {
5457           mappings = 1;
5458         }
5459       else
5460         {
5461           /* [...] */
5462         }
5463       argv++;
5464     }
5465   if (pid == 0)
5466     pid = PIDGET (inferior_ptid);
5467   if (pid == 0)
5468     error (_("No current process: you must name one."));
5469   else
5470     {
5471       /* Have pid, will travel.
5472          First see if it's a process we're already debugging. */
5473       process = find_procinfo (pid, 0);
5474        if (process == NULL)
5475          {
5476            /* No.  So open a procinfo for it, but
5477               remember to close it again when finished.  */
5478            process = create_procinfo (pid, 0);
5479            make_cleanup (do_destroy_procinfo_cleanup, process);
5480            if (!open_procinfo_files (process, FD_CTL))
5481              proc_error (process, "info proc, open_procinfo_files", __LINE__);
5482          }
5483     }
5484   if (tid != 0)
5485     thread = create_procinfo (pid, tid);
5486
5487   if (process)
5488     {
5489       printf_filtered (_("process %d flags:\n"), process->pid);
5490       proc_prettyprint_flags (proc_flags (process), 1);
5491       if (proc_flags (process) & (PR_STOPPED | PR_ISTOP))
5492         proc_prettyprint_why (proc_why (process), proc_what (process), 1);
5493       if (proc_get_nthreads (process) > 1)
5494         printf_filtered ("Process has %d threads.\n",
5495                          proc_get_nthreads (process));
5496     }
5497   if (thread)
5498     {
5499       printf_filtered (_("thread %d flags:\n"), thread->tid);
5500       proc_prettyprint_flags (proc_flags (thread), 1);
5501       if (proc_flags (thread) & (PR_STOPPED | PR_ISTOP))
5502         proc_prettyprint_why (proc_why (thread), proc_what (thread), 1);
5503     }
5504
5505   if (mappings)
5506     {
5507       info_proc_mappings (process, 0);
5508     }
5509
5510   do_cleanups (old_chain);
5511 }
5512
5513 /* Modify the status of the system call identified by SYSCALLNUM in
5514    the set of syscalls that are currently traced/debugged.
5515
5516    If ENTRY_OR_EXIT is set to PR_SYSENTRY, then the entry syscalls set
5517    will be updated. Otherwise, the exit syscalls set will be updated.
5518
5519    If MODE is FLAG_SET, then traces will be enabled. Otherwise, they
5520    will be disabled.  */
5521
5522 static void
5523 proc_trace_syscalls_1 (procinfo *pi, int syscallnum, int entry_or_exit,
5524                        int mode, int from_tty)
5525 {
5526   sysset_t *sysset;
5527
5528   if (entry_or_exit == PR_SYSENTRY)
5529     sysset = proc_get_traced_sysentry (pi, NULL);
5530   else
5531     sysset = proc_get_traced_sysexit (pi, NULL);
5532
5533   if (sysset == NULL)
5534     proc_error (pi, "proc-trace, get_traced_sysset", __LINE__);
5535
5536   if (mode == FLAG_SET)
5537     gdb_praddsysset (sysset, syscallnum);
5538   else
5539     gdb_prdelsysset (sysset, syscallnum);
5540
5541   if (entry_or_exit == PR_SYSENTRY)
5542     {
5543       if (!proc_set_traced_sysentry (pi, sysset))
5544         proc_error (pi, "proc-trace, set_traced_sysentry", __LINE__);
5545     }
5546   else
5547     {
5548       if (!proc_set_traced_sysexit (pi, sysset))
5549         proc_error (pi, "proc-trace, set_traced_sysexit", __LINE__);
5550     }
5551 }
5552
5553 static void
5554 proc_trace_syscalls (char *args, int from_tty, int entry_or_exit, int mode)
5555 {
5556   procinfo *pi;
5557
5558   if (PIDGET (inferior_ptid) <= 0)
5559     error (_("you must be debugging a process to use this command."));
5560
5561   if (args == NULL || args[0] == 0)
5562     error_no_arg (_("system call to trace"));
5563
5564   pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5565   if (isdigit (args[0]))
5566     {
5567       const int syscallnum = atoi (args);
5568
5569       proc_trace_syscalls_1 (pi, syscallnum, entry_or_exit, mode, from_tty);
5570     }
5571 }
5572
5573 static void
5574 proc_trace_sysentry_cmd (char *args, int from_tty)
5575 {
5576   proc_trace_syscalls (args, from_tty, PR_SYSENTRY, FLAG_SET);
5577 }
5578
5579 static void
5580 proc_trace_sysexit_cmd (char *args, int from_tty)
5581 {
5582   proc_trace_syscalls (args, from_tty, PR_SYSEXIT, FLAG_SET);
5583 }
5584
5585 static void
5586 proc_untrace_sysentry_cmd (char *args, int from_tty)
5587 {
5588   proc_trace_syscalls (args, from_tty, PR_SYSENTRY, FLAG_RESET);
5589 }
5590
5591 static void
5592 proc_untrace_sysexit_cmd (char *args, int from_tty)
5593 {
5594   proc_trace_syscalls (args, from_tty, PR_SYSEXIT, FLAG_RESET);
5595 }
5596
5597
5598 void
5599 _initialize_procfs (void)
5600 {
5601   observer_attach_inferior_created (procfs_inferior_created);
5602
5603   add_info ("proc", info_proc_cmd, _("\
5604 Show /proc process information about any running process.\n\
5605 Specify process id, or use the program being debugged by default.\n\
5606 Specify keyword 'mappings' for detailed info on memory mappings."));
5607   add_com ("proc-trace-entry", no_class, proc_trace_sysentry_cmd,
5608            _("Give a trace of entries into the syscall."));
5609   add_com ("proc-trace-exit", no_class, proc_trace_sysexit_cmd,
5610            _("Give a trace of exits from the syscall."));
5611   add_com ("proc-untrace-entry", no_class, proc_untrace_sysentry_cmd,
5612            _("Cancel a trace of entries into the syscall."));
5613   add_com ("proc-untrace-exit", no_class, proc_untrace_sysexit_cmd,
5614            _("Cancel a trace of exits from the syscall."));
5615 }
5616
5617 /* =================== END, GDB  "MODULE" =================== */
5618
5619
5620
5621 /* miscellaneous stubs: */
5622
5623 /* The following satisfy a few random symbols mostly created by the
5624    solaris threads implementation, which I will chase down later.  */
5625
5626 /* Return a pid for which we guarantee we will be able to find a
5627    'live' procinfo.  */
5628
5629 ptid_t
5630 procfs_first_available (void)
5631 {
5632   return pid_to_ptid (procinfo_list ? procinfo_list->pid : -1);
5633 }
5634
5635 /* ===================  GCORE .NOTE "MODULE" =================== */
5636 #if defined (UNIXWARE) || defined (PIOCOPENLWP) || defined (PCAGENT)
5637 /* gcore only implemented on solaris and unixware (so far) */
5638
5639 static char *
5640 procfs_do_thread_registers (bfd *obfd, ptid_t ptid,
5641                             char *note_data, int *note_size,
5642                             enum target_signal stop_signal)
5643 {
5644   struct regcache *regcache = get_thread_regcache (ptid);
5645   gdb_gregset_t gregs;
5646   gdb_fpregset_t fpregs;
5647   unsigned long merged_pid;
5648   struct cleanup *old_chain;
5649
5650   merged_pid = TIDGET (ptid) << 16 | PIDGET (ptid);
5651
5652   /* This part is the old method for fetching registers.
5653      It should be replaced by the newer one using regsets
5654      once it is implemented in this platform:
5655      gdbarch_regset_from_core_section() and regset->collect_regset(). */
5656
5657   old_chain = save_inferior_ptid ();
5658   inferior_ptid = ptid;
5659   target_fetch_registers (regcache, -1);
5660
5661   fill_gregset (regcache, &gregs, -1);
5662 #if defined (NEW_PROC_API)
5663   note_data = (char *) elfcore_write_lwpstatus (obfd,
5664                                                 note_data,
5665                                                 note_size,
5666                                                 merged_pid,
5667                                                 stop_signal,
5668                                                 &gregs);
5669 #else
5670   note_data = (char *) elfcore_write_prstatus (obfd,
5671                                                note_data,
5672                                                note_size,
5673                                                merged_pid,
5674                                                stop_signal,
5675                                                &gregs);
5676 #endif
5677   fill_fpregset (regcache, &fpregs, -1);
5678   note_data = (char *) elfcore_write_prfpreg (obfd,
5679                                               note_data,
5680                                               note_size,
5681                                               &fpregs,
5682                                               sizeof (fpregs));
5683
5684   do_cleanups (old_chain);
5685
5686   return note_data;
5687 }
5688
5689 struct procfs_corefile_thread_data {
5690   bfd *obfd;
5691   char *note_data;
5692   int *note_size;
5693   enum target_signal stop_signal;
5694 };
5695
5696 static int
5697 procfs_corefile_thread_callback (procinfo *pi, procinfo *thread, void *data)
5698 {
5699   struct procfs_corefile_thread_data *args = data;
5700
5701   if (pi != NULL)
5702     {
5703       ptid_t ptid = MERGEPID (pi->pid, thread->tid);
5704
5705       args->note_data = procfs_do_thread_registers (args->obfd, ptid,
5706                                                     args->note_data,
5707                                                     args->note_size,
5708                                                     args->stop_signal);
5709     }
5710   return 0;
5711 }
5712
5713 static int
5714 find_signalled_thread (struct thread_info *info, void *data)
5715 {
5716   if (info->stop_signal != TARGET_SIGNAL_0
5717       && ptid_get_pid (info->ptid) == ptid_get_pid (inferior_ptid))
5718     return 1;
5719
5720   return 0;
5721 }
5722
5723 static enum target_signal
5724 find_stop_signal (void)
5725 {
5726   struct thread_info *info =
5727     iterate_over_threads (find_signalled_thread, NULL);
5728
5729   if (info)
5730     return info->stop_signal;
5731   else
5732     return TARGET_SIGNAL_0;
5733 }
5734
5735 static char *
5736 procfs_make_note_section (bfd *obfd, int *note_size)
5737 {
5738   struct cleanup *old_chain;
5739   gdb_gregset_t gregs;
5740   gdb_fpregset_t fpregs;
5741   char fname[16] = {'\0'};
5742   char psargs[80] = {'\0'};
5743   procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5744   char *note_data = NULL;
5745   char *inf_args;
5746   struct procfs_corefile_thread_data thread_args;
5747   gdb_byte *auxv;
5748   int auxv_len;
5749   enum target_signal stop_signal;
5750
5751   if (get_exec_file (0))
5752     {
5753       strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
5754       strncpy (psargs, get_exec_file (0),
5755                sizeof (psargs));
5756
5757       inf_args = get_inferior_args ();
5758       if (inf_args && *inf_args &&
5759           strlen (inf_args) < ((int) sizeof (psargs) - (int) strlen (psargs)))
5760         {
5761           strncat (psargs, " ",
5762                    sizeof (psargs) - strlen (psargs));
5763           strncat (psargs, inf_args,
5764                    sizeof (psargs) - strlen (psargs));
5765         }
5766     }
5767
5768   note_data = (char *) elfcore_write_prpsinfo (obfd,
5769                                                note_data,
5770                                                note_size,
5771                                                fname,
5772                                                psargs);
5773
5774   stop_signal = find_stop_signal ();
5775
5776 #ifdef UNIXWARE
5777   fill_gregset (get_current_regcache (), &gregs, -1);
5778   note_data = elfcore_write_pstatus (obfd, note_data, note_size,
5779                                      PIDGET (inferior_ptid),
5780                                      stop_signal, &gregs);
5781 #endif
5782
5783   thread_args.obfd = obfd;
5784   thread_args.note_data = note_data;
5785   thread_args.note_size = note_size;
5786   thread_args.stop_signal = stop_signal;
5787   proc_iterate_over_threads (pi, procfs_corefile_thread_callback, &thread_args);
5788
5789   /* There should be always at least one thread.  */
5790   gdb_assert (thread_args.note_data != note_data);
5791   note_data = thread_args.note_data;
5792
5793   auxv_len = target_read_alloc (&current_target, TARGET_OBJECT_AUXV,
5794                                 NULL, &auxv);
5795   if (auxv_len > 0)
5796     {
5797       note_data = elfcore_write_note (obfd, note_data, note_size,
5798                                       "CORE", NT_AUXV, auxv, auxv_len);
5799       xfree (auxv);
5800     }
5801
5802   make_cleanup (xfree, note_data);
5803   return note_data;
5804 }
5805 #else /* !(Solaris or Unixware) */
5806 static char *
5807 procfs_make_note_section (bfd *obfd, int *note_size)
5808 {
5809   error (_("gcore not implemented for this host."));
5810   return NULL;  /* lint */
5811 }
5812 #endif /* Solaris or Unixware */
5813 /* ===================  END GCORE .NOTE "MODULE" =================== */