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