]> Git Repo - binutils.git/blob - gdb/procfs.c
* config/sh/tm-sh.h (BELIEVE_PCC_PROMOTION): Define, so that
[binutils.git] / gdb / procfs.c
1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
2    Copyright 1991, 1992-97, 1998 Free Software Foundation, Inc.
3    Written by Fred Fish at Cygnus Support.  Changes for sysv4.2mp procfs
4    compatibility by Geoffrey Noer at Cygnus Solutions.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22
23 /*                      N  O  T  E  S
24
25 For information on the details of using /proc consult section proc(4)
26 in the UNIX System V Release 4 System Administrator's Reference Manual.
27
28 The general register and floating point register sets are manipulated
29 separately.  This file makes the assumption that if FP0_REGNUM is
30 defined, then support for the floating point register set is desired,
31 regardless of whether or not the actual target has floating point hardware.
32
33  */
34
35
36 #include "defs.h"
37
38 #include <sys/types.h>
39 #include <time.h>
40 #include <sys/fault.h>
41 #include <sys/syscall.h>
42 #include <sys/procfs.h>
43 #include <fcntl.h>
44 #include <errno.h>
45 #include "gdb_string.h"
46 #include <stropts.h>
47 #include <poll.h>
48 #include <unistd.h>
49 #include "gdb_stat.h"
50
51 #include "inferior.h"
52 #include "target.h"
53 #include "command.h"
54 #include "gdbcore.h"
55 #include "gdbthread.h"
56
57 #if !defined(SYS_lwp_create) && defined(SYS_lwpcreate)
58 # define SYS_lwp_create SYS_lwpcreate
59 #endif
60
61 #if !defined(SYS_lwp_exit) && defined(SYS_lwpexit)
62 # define SYS_lwp_exit SYS_lwpexit
63 #endif
64
65 #if !defined(SYS_lwp_wait) && defined(SYS_lwpwait)
66 # define SYS_lwp_wait SYS_lwpwait
67 #endif
68
69 #if !defined(SYS_lwp_self) && defined(SYS_lwpself)
70 # define SYS_lwp_self SYS_lwpself
71 #endif
72
73 #if !defined(SYS_lwp_info) && defined(SYS_lwpinfo)
74 # define SYS_lwp_info SYS_lwpinfo
75 #endif
76
77 #if !defined(SYS_lwp_private) && defined(SYS_lwpprivate)
78 # define SYS_lwp_private SYS_lwpprivate
79 #endif
80
81 #if !defined(SYS_lwp_kill) && defined(SYS_lwpkill)
82 # define SYS_lwp_kill SYS_lwpkill
83 #endif
84
85 #if !defined(SYS_lwp_suspend) && defined(SYS_lwpsuspend)
86 # define SYS_lwp_suspend SYS_lwpsuspend
87 #endif
88
89 #if !defined(SYS_lwp_continue) && defined(SYS_lwpcontinue)
90 # define SYS_lwp_continue SYS_lwpcontinue
91 #endif
92
93 /* the name of the proc status struct depends on the implementation */
94 #ifdef HAVE_PSTATUS_T
95   typedef pstatus_t gdb_prstatus_t;
96 #else
97   typedef prstatus_t gdb_prstatus_t;
98 #endif
99
100 #define MAX_SYSCALLS    256     /* Maximum number of syscalls for table */
101
102 /* proc name formats may vary depending on the proc implementation */
103 #ifdef HAVE_MULTIPLE_PROC_FDS
104 #  ifndef CTL_PROC_NAME_FMT
105 #  define CTL_PROC_NAME_FMT "/proc/%d/ctl"
106 #  define AS_PROC_NAME_FMT "/proc/%d/as"
107 #  define MAP_PROC_NAME_FMT "/proc/%d/map"
108 #  define STATUS_PROC_NAME_FMT "/proc/%d/status"
109 #  endif
110 #else /* HAVE_MULTIPLE_PROC_FDS */
111 #  ifndef CTL_PROC_NAME_FMT
112 #  define CTL_PROC_NAME_FMT "/proc/%05d"
113 #  define AS_PROC_NAME_FMT "/proc/%05d"
114 #  define MAP_PROC_NAME_FMT "/proc/%05d"
115 #  define STATUS_PROC_NAME_FMT "/proc/%05d"
116 #  endif
117 #endif /* HAVE_MULTIPLE_PROC_FDS */
118
119
120 /* These #ifdefs are for sol2.x in particular.  sol2.x has
121    both a "gregset_t" and a "prgregset_t", which have
122    similar uses but different layouts.  sol2.x gdb tries to
123    use prgregset_t (and prfpregset_t) everywhere. */
124
125 #ifdef GDB_GREGSET_TYPE
126   typedef GDB_GREGSET_TYPE gdb_gregset_t;
127 #else
128   typedef gregset_t gdb_gregset_t;
129 #endif
130
131 #ifdef GDB_FPREGSET_TYPE
132   typedef GDB_FPREGSET_TYPE gdb_fpregset_t;
133 #else
134   typedef fpregset_t gdb_fpregset_t;
135 #endif
136
137
138 #define MAX_PROC_NAME_SIZE sizeof("/proc/1234567890/status")
139
140 struct target_ops procfs_ops;
141
142 int procfs_suppress_run = 0;    /* Non-zero if procfs should pretend not to
143                                    be a runnable target.  Used by targets
144                                    that can sit atop procfs, such as solaris
145                                    thread support.  */
146
147 #if 1   /* FIXME: Gross and ugly hack to resolve coredep.c global */
148 CORE_ADDR kernel_u_addr;
149 #endif
150
151 #ifdef BROKEN_SIGINFO_H         /* Workaround broken SGS <sys/siginfo.h> */
152 #undef si_pid
153 #define si_pid _data._proc.pid
154 #undef si_uid
155 #define si_uid _data._proc._pdata._kill.uid
156 #endif /* BROKEN_SIGINFO_H */
157
158 /* Define structures for passing commands to /proc/pid/ctl file.  Note that
159    while we create these for the PROCFS_USE_READ_WRITE world, we use them
160    and ignore the extra cmd int in other proc schemes.
161 */
162 /* generic ctl msg */
163 struct proc_ctl {
164         int     cmd;
165         long    data;
166 };
167
168 /* set general registers */
169 struct greg_ctl {
170         int             cmd;
171         gdb_gregset_t   gregset;
172 };
173
174 /* set fp registers */
175 struct fpreg_ctl {
176         int             cmd;
177         gdb_fpregset_t  fpregset;
178 };
179
180 /* set signals to be traced */
181 struct sig_ctl {
182         int             cmd;
183         sigset_t        sigset;
184 };
185
186 /* set faults to be traced */
187 struct flt_ctl {
188         int             cmd;
189         fltset_t        fltset;
190 };
191
192 /* set system calls to be traced */
193 struct sys_ctl {
194         int             cmd;
195         sysset_t        sysset;
196 };
197
198 /* set current signal to be traced */
199 struct sigi_ctl {
200         int             cmd;
201         siginfo_t       siginfo;
202 };
203
204 /*  All access to the inferior, either one started by gdb or one that has
205     been attached to, is controlled by an instance of a procinfo structure,
206     defined below.  Since gdb currently only handles one inferior at a time,
207     the procinfo structure for the inferior is statically allocated and
208     only one exists at any given time.  There is a separate procinfo
209     structure for use by the "info proc" command, so that we can print
210     useful information about any random process without interfering with
211     the inferior's procinfo information. */
212
213 struct procinfo {
214   struct procinfo *next;
215   int pid;                      /* Process ID of inferior */
216   int ctl_fd;                   /* File descriptor for /proc ctl file */
217   int status_fd;                /* File descriptor for /proc status file */
218   int as_fd;                    /* File descriptor for /proc as file */
219   int map_fd;                   /* File descriptor for /proc map file */
220   char *pathname;               /* Pathname to /proc entry */
221   int had_event;                /* poll/select says something happened */
222   int was_stopped;              /* Nonzero if was stopped prior to attach */
223   int nopass_next_sigstop;      /* Don't pass a sigstop on next resume */
224 #ifndef HAVE_NO_PRRUN_T
225   prrun_t prrun;                /* Control state when it is run */
226 #endif
227   gdb_prstatus_t prstatus;      /* Current process status info */
228   struct greg_ctl gregset;      /* General register set */
229   struct fpreg_ctl fpregset;    /* Floating point register set */
230   struct flt_ctl fltset;        /* Current traced hardware fault set */
231   struct sig_ctl trace;         /* Current traced signal set */
232   struct sys_ctl exitset;       /* Current traced system call exit set */
233   struct sys_ctl entryset;      /* Current traced system call entry set */
234   struct sig_ctl saved_sighold; /* Saved held signal set */
235   struct flt_ctl saved_fltset;  /* Saved traced hardware fault set */
236   struct sig_ctl saved_trace;   /* Saved traced signal set */
237   struct sys_ctl saved_exitset; /* Saved traced system call exit set */
238   struct sys_ctl saved_entryset;/* Saved traced system call entry set */
239   int num_syscall_handlers;     /* Number of syscall trap handlers
240                                    currently installed */
241                                 /* Pointer to list of syscall trap handlers */
242   struct procfs_syscall_handler *syscall_handlers; 
243   int saved_rtnval;             /* return value and status for wait(), */
244   int saved_statval;            /*  as supplied by a syscall handler. */
245   int new_child;                /* Non-zero if it's a new thread */
246 };
247
248 /* List of inferior process information */
249 static struct procinfo *procinfo_list = NULL;
250 static struct pollfd *poll_list; /* pollfds used for waiting on /proc */
251
252 static int num_poll_list = 0;   /* Number of entries in poll_list */
253
254 /*  Much of the information used in the /proc interface, particularly for
255     printing status information, is kept as tables of structures of the
256     following form.  These tables can be used to map numeric values to
257     their symbolic names and to a string that describes their specific use. */
258
259 struct trans {
260   int value;                    /* The numeric value */
261   char *name;                   /* The equivalent symbolic value */
262   char *desc;                   /* Short description of value */
263 };
264
265 /*  Translate bits in the pr_flags member of the prstatus structure, into the
266     names and desc information. */
267
268 static struct trans pr_flag_table[] =
269 {
270 #if defined (PR_STOPPED)
271   { PR_STOPPED, "PR_STOPPED", "Process is stopped" },
272 #endif
273 #if defined (PR_ISTOP)
274   { PR_ISTOP, "PR_ISTOP", "Stopped on an event of interest" },
275 #endif
276 #if defined (PR_DSTOP)
277   { PR_DSTOP, "PR_DSTOP", "A stop directive is in effect" },
278 #endif
279 #if defined (PR_ASLEEP)
280   { PR_ASLEEP, "PR_ASLEEP", "Sleeping in an interruptible system call" },
281 #endif
282 #if defined (PR_FORK)
283   { PR_FORK, "PR_FORK", "Inherit-on-fork is in effect" },
284 #endif
285 #if defined (PR_RLC)
286   { PR_RLC, "PR_RLC", "Run-on-last-close is in effect" },
287 #endif
288 #if defined (PR_PTRACE)
289   { PR_PTRACE, "PR_PTRACE", "Process is being controlled by ptrace" },
290 #endif
291 #if defined (PR_PCINVAL)
292   { PR_PCINVAL, "PR_PCINVAL", "PC refers to an invalid virtual address" },
293 #endif
294 #if defined (PR_ISSYS)
295   { PR_ISSYS, "PR_ISSYS", "Is a system process" },
296 #endif
297 #if defined (PR_STEP)
298   { PR_STEP, "PR_STEP", "Process has single step pending" },
299 #endif
300 #if defined (PR_KLC)
301   { PR_KLC, "PR_KLC", "Kill-on-last-close is in effect" },
302 #endif
303 #if defined (PR_ASYNC)
304   { PR_ASYNC, "PR_ASYNC", "Asynchronous stop is in effect" },
305 #endif
306 #if defined (PR_PCOMPAT)
307   { PR_PCOMPAT, "PR_PCOMPAT", "Ptrace compatibility mode in effect" },
308 #endif
309 #if defined (PR_MSACCT)
310   { PR_MSACCT, "PR_MSACCT", "Microstate accounting enabled" },
311 #endif
312 #if defined (PR_BPTADJ)
313   { PR_BPTADJ, "PR_BPTADJ", "Breakpoint PC adjustment in effect" },
314 #endif
315 #if defined (PR_ASLWP)
316   { PR_ASLWP, "PR_ASLWP", "Asynchronus signal LWP" },
317 #endif
318   { 0, NULL, NULL }
319 };
320
321 /*  Translate values in the pr_why field of the prstatus struct. */
322
323 static struct trans pr_why_table[] =
324 {
325 #if defined (PR_REQUESTED)
326   { PR_REQUESTED, "PR_REQUESTED", "Directed to stop via PIOCSTOP/PIOCWSTOP" },
327 #endif
328 #if defined (PR_SIGNALLED)
329   { PR_SIGNALLED, "PR_SIGNALLED", "Receipt of a traced signal" },
330 #endif
331 #if defined (PR_SYSENTRY)
332   { PR_SYSENTRY, "PR_SYSENTRY", "Entry to a traced system call" },
333 #endif
334 #if defined (PR_SYSEXIT)
335   { PR_SYSEXIT, "PR_SYSEXIT", "Exit from a traced system call" },
336 #endif
337 #if defined (PR_JOBCONTROL)
338   { PR_JOBCONTROL, "PR_JOBCONTROL", "Default job control stop signal action" },
339 #endif
340 #if defined (PR_FAULTED)
341   { PR_FAULTED, "PR_FAULTED", "Incurred a traced hardware fault" },
342 #endif
343 #if defined (PR_SUSPENDED)
344   { PR_SUSPENDED, "PR_SUSPENDED", "Process suspended" },
345 #endif
346 #if defined (PR_CHECKPOINT)
347   { PR_CHECKPOINT, "PR_CHECKPOINT", "(???)" },
348 #endif
349   { 0, NULL, NULL }
350 };
351
352 /*  Hardware fault translation table. */
353
354 static struct trans faults_table[] =
355 {
356 #if defined (FLTILL)
357   { FLTILL, "FLTILL", "Illegal instruction" },
358 #endif
359 #if defined (FLTPRIV)
360   { FLTPRIV, "FLTPRIV", "Privileged instruction" },
361 #endif
362 #if defined (FLTBPT)
363   { FLTBPT, "FLTBPT", "Breakpoint trap" },
364 #endif
365 #if defined (FLTTRACE)
366   { FLTTRACE, "FLTTRACE", "Trace trap" },
367 #endif
368 #if defined (FLTACCESS)
369   { FLTACCESS, "FLTACCESS", "Memory access fault" },
370 #endif
371 #if defined (FLTBOUNDS)
372   { FLTBOUNDS, "FLTBOUNDS", "Memory bounds violation" },
373 #endif
374 #if defined (FLTIOVF)
375   { FLTIOVF, "FLTIOVF", "Integer overflow" },
376 #endif
377 #if defined (FLTIZDIV)
378   { FLTIZDIV, "FLTIZDIV", "Integer zero divide" },
379 #endif
380 #if defined (FLTFPE)
381   { FLTFPE, "FLTFPE", "Floating-point exception" },
382 #endif
383 #if defined (FLTSTACK)
384   { FLTSTACK, "FLTSTACK", "Unrecoverable stack fault" },
385 #endif
386 #if defined (FLTPAGE)
387   { FLTPAGE, "FLTPAGE", "Recoverable page fault" },
388 #endif
389   { 0, NULL, NULL }
390 };
391
392 /* Translation table for signal generation information.  See UNIX System
393    V Release 4 Programmer's Reference Manual, siginfo(5).  */
394
395 static struct sigcode {
396   int signo;
397   int code;
398   char *codename;
399   char *desc;
400 } siginfo_table[] = {
401 #if defined (SIGILL) && defined (ILL_ILLOPC)
402   { SIGILL, ILL_ILLOPC, "ILL_ILLOPC", "Illegal opcode" },
403 #endif
404 #if defined (SIGILL) && defined (ILL_ILLOPN)
405   { SIGILL, ILL_ILLOPN, "ILL_ILLOPN", "Illegal operand", },
406 #endif
407 #if defined (SIGILL) && defined (ILL_ILLADR)
408   { SIGILL, ILL_ILLADR, "ILL_ILLADR", "Illegal addressing mode" },
409 #endif
410 #if defined (SIGILL) && defined (ILL_ILLTRP)
411   { SIGILL, ILL_ILLTRP, "ILL_ILLTRP", "Illegal trap" },
412 #endif
413 #if defined (SIGILL) && defined (ILL_PRVOPC)
414   { SIGILL, ILL_PRVOPC, "ILL_PRVOPC", "Privileged opcode" },
415 #endif
416 #if defined (SIGILL) && defined (ILL_PRVREG)
417   { SIGILL, ILL_PRVREG, "ILL_PRVREG", "Privileged register" },
418 #endif
419 #if defined (SIGILL) && defined (ILL_COPROC)
420   { SIGILL, ILL_COPROC, "ILL_COPROC", "Coprocessor error" },
421 #endif
422 #if defined (SIGILL) && defined (ILL_BADSTK)
423   { SIGILL, ILL_BADSTK, "ILL_BADSTK", "Internal stack error" },
424 #endif
425 #if defined (SIGFPE) && defined (FPE_INTDIV)
426   { SIGFPE, FPE_INTDIV, "FPE_INTDIV", "Integer divide by zero" },
427 #endif
428 #if defined (SIGFPE) && defined (FPE_INTOVF)
429   { SIGFPE, FPE_INTOVF, "FPE_INTOVF", "Integer overflow" },
430 #endif
431 #if defined (SIGFPE) && defined (FPE_FLTDIV)
432   { SIGFPE, FPE_FLTDIV, "FPE_FLTDIV", "Floating point divide by zero" },
433 #endif
434 #if defined (SIGFPE) && defined (FPE_FLTOVF)
435   { SIGFPE, FPE_FLTOVF, "FPE_FLTOVF", "Floating point overflow" },
436 #endif
437 #if defined (SIGFPE) && defined (FPE_FLTUND)
438   { SIGFPE, FPE_FLTUND, "FPE_FLTUND", "Floating point underflow" },
439 #endif
440 #if defined (SIGFPE) && defined (FPE_FLTRES)
441   { SIGFPE, FPE_FLTRES, "FPE_FLTRES", "Floating point inexact result" },
442 #endif
443 #if defined (SIGFPE) && defined (FPE_FLTINV)
444   { SIGFPE, FPE_FLTINV, "FPE_FLTINV", "Invalid floating point operation" },
445 #endif
446 #if defined (SIGFPE) && defined (FPE_FLTSUB)
447   { SIGFPE, FPE_FLTSUB, "FPE_FLTSUB", "Subscript out of range" },
448 #endif
449 #if defined (SIGSEGV) && defined (SEGV_MAPERR)
450   { SIGSEGV, SEGV_MAPERR, "SEGV_MAPERR", "Address not mapped to object" },
451 #endif
452 #if defined (SIGSEGV) && defined (SEGV_ACCERR)
453   { SIGSEGV, SEGV_ACCERR, "SEGV_ACCERR", "Invalid permissions for object" },
454 #endif
455 #if defined (SIGBUS) && defined (BUS_ADRALN)
456   { SIGBUS, BUS_ADRALN, "BUS_ADRALN", "Invalid address alignment" },
457 #endif
458 #if defined (SIGBUS) && defined (BUS_ADRERR)
459   { SIGBUS, BUS_ADRERR, "BUS_ADRERR", "Non-existent physical address" },
460 #endif
461 #if defined (SIGBUS) && defined (BUS_OBJERR)
462   { SIGBUS, BUS_OBJERR, "BUS_OBJERR", "Object specific hardware error" },
463 #endif
464 #if defined (SIGTRAP) && defined (TRAP_BRKPT)
465   { SIGTRAP, TRAP_BRKPT, "TRAP_BRKPT", "Process breakpoint" },
466 #endif
467 #if defined (SIGTRAP) && defined (TRAP_TRACE)
468   { SIGTRAP, TRAP_TRACE, "TRAP_TRACE", "Process trace trap" },
469 #endif
470 #if defined (SIGCLD) && defined (CLD_EXITED)
471   { SIGCLD, CLD_EXITED, "CLD_EXITED", "Child has exited" },
472 #endif
473 #if defined (SIGCLD) && defined (CLD_KILLED)
474   { SIGCLD, CLD_KILLED, "CLD_KILLED", "Child was killed" },
475 #endif
476 #if defined (SIGCLD) && defined (CLD_DUMPED)
477   { SIGCLD, CLD_DUMPED, "CLD_DUMPED", "Child has terminated abnormally" },
478 #endif
479 #if defined (SIGCLD) && defined (CLD_TRAPPED)
480   { SIGCLD, CLD_TRAPPED, "CLD_TRAPPED", "Traced child has trapped" },
481 #endif
482 #if defined (SIGCLD) && defined (CLD_STOPPED)
483   { SIGCLD, CLD_STOPPED, "CLD_STOPPED", "Child has stopped" },
484 #endif
485 #if defined (SIGCLD) && defined (CLD_CONTINUED)
486   { SIGCLD, CLD_CONTINUED, "CLD_CONTINUED", "Stopped child had continued" },
487 #endif
488 #if defined (SIGPOLL) && defined (POLL_IN)
489   { SIGPOLL, POLL_IN, "POLL_IN", "Input input available" },
490 #endif
491 #if defined (SIGPOLL) && defined (POLL_OUT)
492   { SIGPOLL, POLL_OUT, "POLL_OUT", "Output buffers available" },
493 #endif
494 #if defined (SIGPOLL) && defined (POLL_MSG)
495   { SIGPOLL, POLL_MSG, "POLL_MSG", "Input message available" },
496 #endif
497 #if defined (SIGPOLL) && defined (POLL_ERR)
498   { SIGPOLL, POLL_ERR, "POLL_ERR", "I/O error" },
499 #endif
500 #if defined (SIGPOLL) && defined (POLL_PRI)
501   { SIGPOLL, POLL_PRI, "POLL_PRI", "High priority input available" },
502 #endif
503 #if defined (SIGPOLL) && defined (POLL_HUP)
504   { SIGPOLL, POLL_HUP, "POLL_HUP", "Device disconnected" },
505 #endif
506   { 0, 0, NULL, NULL }
507 };
508
509 static char *syscall_table[MAX_SYSCALLS];
510
511 /* Prototypes for local functions */
512
513 static void procfs_stop PARAMS ((void));
514
515 static int procfs_thread_alive PARAMS ((int));
516
517 static int procfs_can_run PARAMS ((void));
518
519 static void procfs_mourn_inferior PARAMS ((void));
520
521 static void procfs_fetch_registers PARAMS ((int));
522
523 static int procfs_wait PARAMS ((int, struct target_waitstatus *));
524
525 static void procfs_open PARAMS ((char *, int));
526
527 static void procfs_files_info PARAMS ((struct target_ops *));
528
529 static void procfs_prepare_to_store PARAMS ((void));
530
531 static void procfs_detach PARAMS ((char *, int));
532
533 static void procfs_attach PARAMS ((char *, int));
534
535 static void proc_set_exec_trap PARAMS ((void));
536
537 static void  procfs_init_inferior PARAMS ((int));
538
539 static struct procinfo *create_procinfo PARAMS ((int));
540
541 static void procfs_store_registers PARAMS ((int));
542
543 static int procfs_xfer_memory PARAMS ((CORE_ADDR, char *, int, int, struct target_ops *));
544
545 static void procfs_kill_inferior PARAMS ((void));
546
547 static char *sigcodedesc PARAMS ((siginfo_t *));
548
549 static char *sigcodename PARAMS ((siginfo_t *));
550
551 static struct procinfo *wait_fd PARAMS ((void));
552
553 static void remove_fd PARAMS ((struct procinfo *));
554
555 static void add_fd PARAMS ((struct procinfo *));
556
557 static void set_proc_siginfo PARAMS ((struct procinfo *, int));
558
559 static void init_syscall_table PARAMS ((void));
560
561 static char *syscallname PARAMS ((int));
562
563 static char *signalname PARAMS ((int));
564
565 static char *errnoname PARAMS ((int));
566
567 static int proc_address_to_fd PARAMS ((struct procinfo *, CORE_ADDR, int));
568
569 static int open_proc_file PARAMS ((int, struct procinfo *, int, int));
570
571 static void close_proc_file PARAMS ((struct procinfo *));
572
573 static void unconditionally_kill_inferior PARAMS ((struct procinfo *));
574
575 static NORETURN void proc_init_failed PARAMS ((struct procinfo *, char *, int)) ATTR_NORETURN;
576
577 static void info_proc PARAMS ((char *, int));
578
579 static void info_proc_flags PARAMS ((struct procinfo *, int));
580
581 static void info_proc_stop PARAMS ((struct procinfo *, int));
582
583 static void info_proc_siginfo PARAMS ((struct procinfo *, int));
584
585 static void info_proc_syscalls PARAMS ((struct procinfo *, int));
586
587 static void info_proc_mappings PARAMS ((struct procinfo *, int));
588
589 static void info_proc_signals PARAMS ((struct procinfo *, int));
590
591 static void info_proc_faults PARAMS ((struct procinfo *, int));
592
593 static char *mappingflags PARAMS ((long));
594
595 static char *lookupname PARAMS ((struct trans *, unsigned int, char *));
596
597 static char *lookupdesc PARAMS ((struct trans *, unsigned int));
598
599 static int do_attach PARAMS ((int pid));
600
601 static void do_detach PARAMS ((int siggnal));
602
603 static void procfs_create_inferior PARAMS ((char *, char *, char **));
604
605 static void procfs_notice_signals PARAMS ((int pid));
606
607 static void notice_signals PARAMS ((struct procinfo *, struct sig_ctl *));
608
609 static struct procinfo *find_procinfo PARAMS ((pid_t pid, int okfail));
610
611 static int procfs_write_pcwstop PARAMS ((struct procinfo *));
612 static int procfs_read_status PARAMS ((struct procinfo *));
613 static void procfs_write_pckill PARAMS ((struct procinfo *));
614
615 typedef int syscall_func_t PARAMS ((struct procinfo *pi, int syscall_num,
616                                     int why, int *rtnval, int *statval));
617
618 static void procfs_set_syscall_trap PARAMS ((struct procinfo *pi,
619                                              int syscall_num, int flags,
620                                              syscall_func_t *func));
621
622 static void procfs_clear_syscall_trap PARAMS ((struct procinfo *pi,
623                                                int syscall_num, int errok));
624
625 #define PROCFS_SYSCALL_ENTRY 0x1 /* Trap on entry to sys call */
626 #define PROCFS_SYSCALL_EXIT 0x2 /* Trap on exit from sys call */
627
628 static syscall_func_t procfs_exit_handler;
629
630 static syscall_func_t procfs_exec_handler;
631
632 #ifdef SYS_sproc
633 static syscall_func_t procfs_sproc_handler;
634 static syscall_func_t procfs_fork_handler;
635 #endif
636
637 #ifdef SYS_lwp_create
638 static syscall_func_t procfs_lwp_creation_handler;
639 #endif
640
641 static void modify_inherit_on_fork_flag PARAMS ((int fd, int flag));
642 static void modify_run_on_last_close_flag PARAMS ((int fd, int flag));
643
644 /* */
645
646 struct procfs_syscall_handler
647 {
648   int syscall_num;              /* The number of the system call being handled */
649                                 /* The function to be called */
650   syscall_func_t *func;
651 };
652
653 static void procfs_resume PARAMS ((int pid, int step,
654                                    enum target_signal signo));
655
656 static void init_procfs_ops PARAMS ((void));
657
658 /* External function prototypes that can't be easily included in any
659    header file because the args are typedefs in system include files. */
660
661 extern void supply_gregset PARAMS ((gdb_gregset_t *));
662
663 extern void fill_gregset PARAMS ((gdb_gregset_t *, int));
664
665 #ifdef FP0_REGNUM
666 extern void supply_fpregset PARAMS ((gdb_fpregset_t *));
667
668 extern void fill_fpregset PARAMS ((gdb_fpregset_t *, int));
669 #endif
670
671 /*
672
673 LOCAL FUNCTION
674
675         find_procinfo -- convert a process id to a struct procinfo
676
677 SYNOPSIS
678
679         static struct procinfo * find_procinfo (pid_t pid, int okfail);
680
681 DESCRIPTION
682         
683         Given a process id, look it up in the procinfo chain.  Returns
684         a struct procinfo *.  If can't find pid, then call error(),
685         unless okfail is set, in which case, return NULL;
686  */
687
688 static struct procinfo *
689 find_procinfo (pid, okfail)
690      pid_t pid;
691      int okfail;
692 {
693   struct procinfo *procinfo;
694
695   for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
696     if (procinfo->pid == pid)
697       return procinfo;
698
699   if (okfail)
700     return NULL;
701
702   error ("procfs (find_procinfo):  Couldn't locate pid %d", pid);
703 }
704
705 /*
706
707 LOCAL MACRO
708
709         current_procinfo -- convert inferior_pid to a struct procinfo
710
711 SYNOPSIS
712
713         static struct procinfo * current_procinfo;
714
715 DESCRIPTION
716         
717         Looks up inferior_pid in the procinfo chain.  Always returns a
718         struct procinfo *.  If process can't be found, we error() out.
719  */
720
721 #define current_procinfo find_procinfo (inferior_pid, 0)
722
723 /*
724
725 LOCAL FUNCTION
726
727         add_fd -- Add the fd to the poll/select list
728
729 SYNOPSIS
730
731         static void add_fd (struct procinfo *);
732
733 DESCRIPTION
734         
735         Add the fd of the supplied procinfo to the list of fds used for
736         poll/select operations.
737  */
738
739 static void
740 add_fd (pi)
741      struct procinfo *pi;
742 {
743   if (num_poll_list <= 0)
744     poll_list = (struct pollfd *) xmalloc (sizeof (struct pollfd));
745   else
746     poll_list = (struct pollfd *) xrealloc (poll_list,
747                                             (num_poll_list + 1)
748                                             * sizeof (struct pollfd));
749   poll_list[num_poll_list].fd = pi->ctl_fd;
750 #ifdef UNIXWARE
751   poll_list[num_poll_list].events = POLLWRNORM;
752 #else
753   poll_list[num_poll_list].events = POLLPRI;
754 #endif
755
756   num_poll_list++;
757 }
758
759 /*
760
761 LOCAL FUNCTION
762
763         remove_fd -- Remove the fd from the poll/select list
764
765 SYNOPSIS
766
767         static void remove_fd (struct procinfo *);
768
769 DESCRIPTION
770         
771         Remove the fd of the supplied procinfo from the list of fds used 
772         for poll/select operations.
773  */
774
775 static void
776 remove_fd (pi)
777      struct procinfo *pi;
778 {
779   int i;
780
781   for (i = 0; i < num_poll_list; i++)
782     {
783       if (poll_list[i].fd == pi->ctl_fd)
784         {
785           if (i != num_poll_list - 1)
786             memcpy (poll_list + i, poll_list + i + 1,
787                     (num_poll_list - i - 1) * sizeof (struct pollfd));
788
789           num_poll_list--;
790
791           if (num_poll_list == 0)
792             free (poll_list);
793           else
794             poll_list = (struct pollfd *) xrealloc (poll_list,
795                                                     num_poll_list
796                                                     * sizeof (struct pollfd));
797           return;
798         }
799     }
800 }
801
802 /*
803
804 LOCAL FUNCTION
805
806         procfs_read_status - get procfs fd status
807
808 SYNOPSIS
809
810         static int procfs_read_status (pi) struct procinfo *pi;
811
812 DESCRIPTION
813         
814         Given a pointer to a procinfo struct, get the status of
815         the status_fd in the appropriate way.  Returns 0 on failure,
816         1 on success.
817  */
818
819 static int
820 procfs_read_status (pi)
821   struct procinfo *pi;
822 {
823 #ifdef PROCFS_USE_READ_WRITE
824    if ((lseek (pi->status_fd, 0, SEEK_SET) < 0) ||
825            (read (pi->status_fd, (char *) &pi->prstatus, 
826              sizeof (gdb_prstatus_t)) != sizeof (gdb_prstatus_t)))
827 #else
828   if (ioctl (pi->status_fd, PIOCSTATUS, &pi->prstatus) < 0)
829 #endif
830     return 0;
831   else
832     return 1;
833 }
834
835 /*
836
837 LOCAL FUNCTION
838
839         procfs_write_pcwstop - send a PCWSTOP to procfs fd
840
841 SYNOPSIS
842
843         static int procfs_write_pcwstop (pi) struct procinfo *pi;
844
845 DESCRIPTION
846         
847         Given a pointer to a procinfo struct, send a PCWSTOP to
848         the ctl_fd in the appropriate way.  Returns 0 on failure,
849         1 on success.
850  */
851
852 static int
853 procfs_write_pcwstop (pi)
854   struct procinfo *pi;
855 {
856 #ifdef PROCFS_USE_READ_WRITE
857   long cmd = PCWSTOP;
858   if (write (pi->ctl_fd, (char *) &cmd, sizeof (long)) < 0)
859 #else
860   if (ioctl (pi->ctl_fd, PIOCWSTOP, &pi->prstatus) < 0)
861 #endif
862     return 0;
863   else
864     return 1;
865 }
866
867 /*
868
869 LOCAL FUNCTION
870
871         procfs_write_pckill - send a kill to procfs fd
872
873 SYNOPSIS
874
875         static void procfs_write_pckill (pi) struct procinfo *pi;
876
877 DESCRIPTION
878         
879         Given a pointer to a procinfo struct, send a kill to
880         the ctl_fd in the appropriate way.  Returns 0 on failure,
881         1 on success.
882  */
883
884 static void
885 procfs_write_pckill (pi)
886   struct procinfo *pi;
887 {
888 #ifdef PROCFS_USE_READ_WRITE
889   struct proc_ctl pctl;
890   pctl.cmd = PCKILL;
891   pctl.data = SIGKILL;
892   write (pi->ctl_fd, &pctl, sizeof (struct proc_ctl));
893 #else
894   int signo = SIGKILL;
895   ioctl (pi->ctl_fd, PIOCKILL, &signo);
896 #endif
897 }
898
899 static struct procinfo *
900 wait_fd ()
901 {
902   struct procinfo *pi, *next_pi;
903 #ifndef LOSING_POLL
904   int num_fds;
905   int i;
906 #endif
907
908   set_sigint_trap ();   /* Causes SIGINT to be passed on to the
909                            attached process. */
910   set_sigio_trap ();
911
912  wait_again:
913 #ifndef LOSING_POLL
914   while (1)
915     {
916       num_fds = poll (poll_list, num_poll_list, -1);
917       if (num_fds > 0)
918         break;
919       if (num_fds < 0 && errno == EINTR)
920         continue;
921       print_sys_errmsg ("poll failed", errno);
922       error ("Poll failed, returned %d", num_fds);
923     }
924 #else /* LOSING_POLL */
925   pi = current_procinfo;
926
927   while (!procfs_write_pcwstop (pi))
928     {
929       if (errno == ENOENT)
930         {
931           /* Process exited.  */
932           pi->prstatus.pr_flags = 0;
933           break;
934         }
935       else if (errno != EINTR)
936         {
937           print_sys_errmsg (pi->pathname, errno);
938           error ("procfs_write_pcwstop failed");
939         }
940     }
941   pi->had_event = 1;
942 #endif /* LOSING_POLL */
943   
944   clear_sigint_trap ();
945   clear_sigio_trap ();
946
947 #ifndef LOSING_POLL
948
949   for (i = 0; i < num_poll_list && num_fds > 0; i++)
950     {
951       if (0 == (poll_list[i].revents & 
952                 (POLLWRNORM | POLLPRI | POLLERR | POLLHUP | POLLNVAL)))
953         continue;
954       for (pi = procinfo_list; pi; pi = next_pi)
955         {
956           next_pi = pi->next;
957           if (poll_list[i].fd == pi->ctl_fd)
958             {
959               num_fds--;
960               if ((poll_list[i].revents & POLLHUP) != 0 ||
961                   !procfs_read_status(pi))
962                 { /* The LWP has apparently terminated.  */
963                   if (num_poll_list <= 1)
964                     {
965                       pi->prstatus.pr_flags = 0;
966                       pi->had_event = 1;
967                       break;
968                     }
969                   if (info_verbose)
970                     printf_filtered ("LWP %d exited.\n", 
971                                      (pi->pid >> 16) & 0xffff);
972                   close_proc_file (pi);
973                   i--;                  /* don't skip deleted entry */
974                   if (num_fds != 0)
975                     break;              /* already another event to process */
976                   else
977                     goto wait_again;    /* wait for another event */
978                 }
979               pi->had_event = 1;
980               break;
981             }
982         }
983       if (!pi)
984         error ("wait_fd: Couldn't find procinfo for fd %d\n",
985                poll_list[i].fd);
986     }
987 #endif /* LOSING_POLL */
988
989   return pi;
990 }
991
992 /*
993
994 LOCAL FUNCTION
995
996         lookupdesc -- translate a value to a summary desc string
997
998 SYNOPSIS
999
1000         static char *lookupdesc (struct trans *transp, unsigned int val);
1001
1002 DESCRIPTION
1003         
1004         Given a pointer to a translation table and a value to be translated,
1005         lookup the desc string and return it.
1006  */
1007
1008 static char *
1009 lookupdesc (transp, val)
1010      struct trans *transp;
1011      unsigned int val;
1012 {
1013   char *desc;
1014   
1015   for (desc = NULL; transp -> name != NULL; transp++)
1016     {
1017       if (transp -> value == val)
1018         {
1019           desc = transp -> desc;
1020           break;
1021         }
1022     }
1023
1024   /* Didn't find a translation for the specified value, set a default one. */
1025
1026   if (desc == NULL)
1027     {
1028       desc = "Unknown";
1029     }
1030   return (desc);
1031 }
1032
1033 /*
1034
1035 LOCAL FUNCTION
1036
1037         lookupname -- translate a value to symbolic name
1038
1039 SYNOPSIS
1040
1041         static char *lookupname (struct trans *transp, unsigned int val,
1042                                  char *prefix);
1043
1044 DESCRIPTION
1045         
1046         Given a pointer to a translation table, a value to be translated,
1047         and a default prefix to return if the value can't be translated,
1048         match the value with one of the translation table entries and
1049         return a pointer to the symbolic name.
1050
1051         If no match is found it just returns the value as a printable string,
1052         with the given prefix.  The previous such value, if any, is freed
1053         at this time.
1054  */
1055
1056 static char *
1057 lookupname (transp, val, prefix)
1058      struct trans *transp;
1059      unsigned int val;
1060      char *prefix;
1061 {
1062   static char *locbuf;
1063   char *name;
1064   
1065   for (name = NULL; transp -> name != NULL; transp++)
1066     {
1067       if (transp -> value == val)
1068         {
1069           name = transp -> name;
1070           break;
1071         }
1072     }
1073
1074   /* Didn't find a translation for the specified value, build a default
1075      one using the specified prefix and return it.  The lifetime of
1076      the value is only until the next one is needed. */
1077
1078   if (name == NULL)
1079     {
1080       if (locbuf != NULL)
1081         {
1082           free (locbuf);
1083         }
1084       locbuf = xmalloc (strlen (prefix) + 16);
1085       sprintf (locbuf, "%s %u", prefix, val);
1086       name = locbuf;
1087     }
1088   return (name);
1089 }
1090
1091 static char *
1092 sigcodename (sip)
1093      siginfo_t *sip;
1094 {
1095   struct sigcode *scp;
1096   char *name = NULL;
1097   static char locbuf[32];
1098   
1099   for (scp = siginfo_table; scp -> codename != NULL; scp++)
1100     {
1101       if ((scp -> signo == sip -> si_signo) &&
1102           (scp -> code == sip -> si_code))
1103         {
1104           name = scp -> codename;
1105           break;
1106         }
1107     }
1108   if (name == NULL)
1109     {
1110       sprintf (locbuf, "sigcode %u", sip -> si_signo);
1111       name = locbuf;
1112     }
1113   return (name);
1114 }
1115
1116 static char *
1117 sigcodedesc (sip)
1118      siginfo_t *sip;
1119 {
1120   struct sigcode *scp;
1121   char *desc = NULL;
1122   
1123   for (scp = siginfo_table; scp -> codename != NULL; scp++)
1124     {
1125       if ((scp -> signo == sip -> si_signo) &&
1126           (scp -> code == sip -> si_code))
1127         {
1128           desc = scp -> desc;
1129           break;
1130         }
1131     }
1132   if (desc == NULL)
1133     {
1134       desc = "Unrecognized signal or trap use";
1135     }
1136   return (desc);
1137 }
1138
1139 /*
1140
1141 LOCAL FUNCTION
1142
1143         syscallname - translate a system call number into a system call name
1144
1145 SYNOPSIS
1146
1147         char *syscallname (int syscallnum)
1148
1149 DESCRIPTION
1150
1151         Given a system call number, translate it into the printable name
1152         of a system call, or into "syscall <num>" if it is an unknown
1153         number.
1154  */
1155
1156 static char *
1157 syscallname (syscallnum)
1158      int syscallnum;
1159 {
1160   static char locbuf[32];
1161   
1162   if (syscallnum >= 0 && syscallnum < MAX_SYSCALLS
1163       && syscall_table[syscallnum] != NULL)
1164     return syscall_table[syscallnum];
1165   else
1166     {
1167       sprintf (locbuf, "syscall %u", syscallnum);
1168       return locbuf;
1169     }
1170 }
1171
1172 /*
1173
1174 LOCAL FUNCTION
1175
1176         init_syscall_table - initialize syscall translation table
1177
1178 SYNOPSIS
1179
1180         void init_syscall_table (void)
1181
1182 DESCRIPTION
1183
1184         Dynamically initialize the translation table to convert system
1185         call numbers into printable system call names.  Done once per
1186         gdb run, on initialization.
1187
1188 NOTES
1189
1190         This is awfully ugly, but preprocessor tricks to make it prettier
1191         tend to be nonportable.
1192  */
1193
1194 static void
1195 init_syscall_table ()
1196 {
1197 #if defined (SYS_exit)
1198   syscall_table[SYS_exit] = "exit";
1199 #endif
1200 #if defined (SYS_fork)
1201   syscall_table[SYS_fork] = "fork";
1202 #endif
1203 #if defined (SYS_read)
1204   syscall_table[SYS_read] = "read";
1205 #endif
1206 #if defined (SYS_write)
1207   syscall_table[SYS_write] = "write";
1208 #endif
1209 #if defined (SYS_open)
1210   syscall_table[SYS_open] = "open";
1211 #endif
1212 #if defined (SYS_close)
1213   syscall_table[SYS_close] = "close";
1214 #endif
1215 #if defined (SYS_wait)
1216   syscall_table[SYS_wait] = "wait";
1217 #endif
1218 #if defined (SYS_creat)
1219   syscall_table[SYS_creat] = "creat";
1220 #endif
1221 #if defined (SYS_link)
1222   syscall_table[SYS_link] = "link";
1223 #endif
1224 #if defined (SYS_unlink)
1225   syscall_table[SYS_unlink] = "unlink";
1226 #endif
1227 #if defined (SYS_exec)
1228   syscall_table[SYS_exec] = "exec";
1229 #endif
1230 #if defined (SYS_execv)
1231   syscall_table[SYS_execv] = "execv";
1232 #endif
1233 #if defined (SYS_execve)
1234   syscall_table[SYS_execve] = "execve";
1235 #endif
1236 #if defined (SYS_chdir)
1237   syscall_table[SYS_chdir] = "chdir";
1238 #endif
1239 #if defined (SYS_time)
1240   syscall_table[SYS_time] = "time";
1241 #endif
1242 #if defined (SYS_mknod)
1243   syscall_table[SYS_mknod] = "mknod";
1244 #endif
1245 #if defined (SYS_chmod)
1246   syscall_table[SYS_chmod] = "chmod";
1247 #endif
1248 #if defined (SYS_chown)
1249   syscall_table[SYS_chown] = "chown";
1250 #endif
1251 #if defined (SYS_brk)
1252   syscall_table[SYS_brk] = "brk";
1253 #endif
1254 #if defined (SYS_stat)
1255   syscall_table[SYS_stat] = "stat";
1256 #endif
1257 #if defined (SYS_lseek)
1258   syscall_table[SYS_lseek] = "lseek";
1259 #endif
1260 #if defined (SYS_getpid)
1261   syscall_table[SYS_getpid] = "getpid";
1262 #endif
1263 #if defined (SYS_mount)
1264   syscall_table[SYS_mount] = "mount";
1265 #endif
1266 #if defined (SYS_umount)
1267   syscall_table[SYS_umount] = "umount";
1268 #endif
1269 #if defined (SYS_setuid)
1270   syscall_table[SYS_setuid] = "setuid";
1271 #endif
1272 #if defined (SYS_getuid)
1273   syscall_table[SYS_getuid] = "getuid";
1274 #endif
1275 #if defined (SYS_stime)
1276   syscall_table[SYS_stime] = "stime";
1277 #endif
1278 #if defined (SYS_ptrace)
1279   syscall_table[SYS_ptrace] = "ptrace";
1280 #endif
1281 #if defined (SYS_alarm)
1282   syscall_table[SYS_alarm] = "alarm";
1283 #endif
1284 #if defined (SYS_fstat)
1285   syscall_table[SYS_fstat] = "fstat";
1286 #endif
1287 #if defined (SYS_pause)
1288   syscall_table[SYS_pause] = "pause";
1289 #endif
1290 #if defined (SYS_utime)
1291   syscall_table[SYS_utime] = "utime";
1292 #endif
1293 #if defined (SYS_stty)
1294   syscall_table[SYS_stty] = "stty";
1295 #endif
1296 #if defined (SYS_gtty)
1297   syscall_table[SYS_gtty] = "gtty";
1298 #endif
1299 #if defined (SYS_access)
1300   syscall_table[SYS_access] = "access";
1301 #endif
1302 #if defined (SYS_nice)
1303   syscall_table[SYS_nice] = "nice";
1304 #endif
1305 #if defined (SYS_statfs)
1306   syscall_table[SYS_statfs] = "statfs";
1307 #endif
1308 #if defined (SYS_sync)
1309   syscall_table[SYS_sync] = "sync";
1310 #endif
1311 #if defined (SYS_kill)
1312   syscall_table[SYS_kill] = "kill";
1313 #endif
1314 #if defined (SYS_fstatfs)
1315   syscall_table[SYS_fstatfs] = "fstatfs";
1316 #endif
1317 #if defined (SYS_pgrpsys)
1318   syscall_table[SYS_pgrpsys] = "pgrpsys";
1319 #endif
1320 #if defined (SYS_xenix)
1321   syscall_table[SYS_xenix] = "xenix";
1322 #endif
1323 #if defined (SYS_dup)
1324   syscall_table[SYS_dup] = "dup";
1325 #endif
1326 #if defined (SYS_pipe)
1327   syscall_table[SYS_pipe] = "pipe";
1328 #endif
1329 #if defined (SYS_times)
1330   syscall_table[SYS_times] = "times";
1331 #endif
1332 #if defined (SYS_profil)
1333   syscall_table[SYS_profil] = "profil";
1334 #endif
1335 #if defined (SYS_plock)
1336   syscall_table[SYS_plock] = "plock";
1337 #endif
1338 #if defined (SYS_setgid)
1339   syscall_table[SYS_setgid] = "setgid";
1340 #endif
1341 #if defined (SYS_getgid)
1342   syscall_table[SYS_getgid] = "getgid";
1343 #endif
1344 #if defined (SYS_signal)
1345   syscall_table[SYS_signal] = "signal";
1346 #endif
1347 #if defined (SYS_msgsys)
1348   syscall_table[SYS_msgsys] = "msgsys";
1349 #endif
1350 #if defined (SYS_sys3b)
1351   syscall_table[SYS_sys3b] = "sys3b";
1352 #endif
1353 #if defined (SYS_sysi86)
1354   syscall_table[SYS_sysi86] = "sysi86";
1355 #endif
1356 #if defined (SYS_acct)
1357   syscall_table[SYS_acct] = "acct";
1358 #endif
1359 #if defined (SYS_shmsys)
1360   syscall_table[SYS_shmsys] = "shmsys";
1361 #endif
1362 #if defined (SYS_semsys)
1363   syscall_table[SYS_semsys] = "semsys";
1364 #endif
1365 #if defined (SYS_ioctl)
1366   syscall_table[SYS_ioctl] = "ioctl";
1367 #endif
1368 #if defined (SYS_uadmin)
1369   syscall_table[SYS_uadmin] = "uadmin";
1370 #endif
1371 #if defined (SYS_utssys)
1372   syscall_table[SYS_utssys] = "utssys";
1373 #endif
1374 #if defined (SYS_fsync)
1375   syscall_table[SYS_fsync] = "fsync";
1376 #endif
1377 #if defined (SYS_umask)
1378   syscall_table[SYS_umask] = "umask";
1379 #endif
1380 #if defined (SYS_chroot)
1381   syscall_table[SYS_chroot] = "chroot";
1382 #endif
1383 #if defined (SYS_fcntl)
1384   syscall_table[SYS_fcntl] = "fcntl";
1385 #endif
1386 #if defined (SYS_ulimit)
1387   syscall_table[SYS_ulimit] = "ulimit";
1388 #endif
1389 #if defined (SYS_rfsys)
1390   syscall_table[SYS_rfsys] = "rfsys";
1391 #endif
1392 #if defined (SYS_rmdir)
1393   syscall_table[SYS_rmdir] = "rmdir";
1394 #endif
1395 #if defined (SYS_mkdir)
1396   syscall_table[SYS_mkdir] = "mkdir";
1397 #endif
1398 #if defined (SYS_getdents)
1399   syscall_table[SYS_getdents] = "getdents";
1400 #endif
1401 #if defined (SYS_sysfs)
1402   syscall_table[SYS_sysfs] = "sysfs";
1403 #endif
1404 #if defined (SYS_getmsg)
1405   syscall_table[SYS_getmsg] = "getmsg";
1406 #endif
1407 #if defined (SYS_putmsg)
1408   syscall_table[SYS_putmsg] = "putmsg";
1409 #endif
1410 #if defined (SYS_poll)
1411   syscall_table[SYS_poll] = "poll";
1412 #endif
1413 #if defined (SYS_lstat)
1414   syscall_table[SYS_lstat] = "lstat";
1415 #endif
1416 #if defined (SYS_symlink)
1417   syscall_table[SYS_symlink] = "symlink";
1418 #endif
1419 #if defined (SYS_readlink)
1420   syscall_table[SYS_readlink] = "readlink";
1421 #endif
1422 #if defined (SYS_setgroups)
1423   syscall_table[SYS_setgroups] = "setgroups";
1424 #endif
1425 #if defined (SYS_getgroups)
1426   syscall_table[SYS_getgroups] = "getgroups";
1427 #endif
1428 #if defined (SYS_fchmod)
1429   syscall_table[SYS_fchmod] = "fchmod";
1430 #endif
1431 #if defined (SYS_fchown)
1432   syscall_table[SYS_fchown] = "fchown";
1433 #endif
1434 #if defined (SYS_sigprocmask)
1435   syscall_table[SYS_sigprocmask] = "sigprocmask";
1436 #endif
1437 #if defined (SYS_sigsuspend)
1438   syscall_table[SYS_sigsuspend] = "sigsuspend";
1439 #endif
1440 #if defined (SYS_sigaltstack)
1441   syscall_table[SYS_sigaltstack] = "sigaltstack";
1442 #endif
1443 #if defined (SYS_sigaction)
1444   syscall_table[SYS_sigaction] = "sigaction";
1445 #endif
1446 #if defined (SYS_sigpending)
1447   syscall_table[SYS_sigpending] = "sigpending";
1448 #endif
1449 #if defined (SYS_context)
1450   syscall_table[SYS_context] = "context";
1451 #endif
1452 #if defined (SYS_evsys)
1453   syscall_table[SYS_evsys] = "evsys";
1454 #endif
1455 #if defined (SYS_evtrapret)
1456   syscall_table[SYS_evtrapret] = "evtrapret";
1457 #endif
1458 #if defined (SYS_statvfs)
1459   syscall_table[SYS_statvfs] = "statvfs";
1460 #endif
1461 #if defined (SYS_fstatvfs)
1462   syscall_table[SYS_fstatvfs] = "fstatvfs";
1463 #endif
1464 #if defined (SYS_nfssys)
1465   syscall_table[SYS_nfssys] = "nfssys";
1466 #endif
1467 #if defined (SYS_waitsys)
1468   syscall_table[SYS_waitsys] = "waitsys";
1469 #endif
1470 #if defined (SYS_sigsendsys)
1471   syscall_table[SYS_sigsendsys] = "sigsendsys";
1472 #endif
1473 #if defined (SYS_hrtsys)
1474   syscall_table[SYS_hrtsys] = "hrtsys";
1475 #endif
1476 #if defined (SYS_acancel)
1477   syscall_table[SYS_acancel] = "acancel";
1478 #endif
1479 #if defined (SYS_async)
1480   syscall_table[SYS_async] = "async";
1481 #endif
1482 #if defined (SYS_priocntlsys)
1483   syscall_table[SYS_priocntlsys] = "priocntlsys";
1484 #endif
1485 #if defined (SYS_pathconf)
1486   syscall_table[SYS_pathconf] = "pathconf";
1487 #endif
1488 #if defined (SYS_mincore)
1489   syscall_table[SYS_mincore] = "mincore";
1490 #endif
1491 #if defined (SYS_mmap)
1492   syscall_table[SYS_mmap] = "mmap";
1493 #endif
1494 #if defined (SYS_mprotect)
1495   syscall_table[SYS_mprotect] = "mprotect";
1496 #endif
1497 #if defined (SYS_munmap)
1498   syscall_table[SYS_munmap] = "munmap";
1499 #endif
1500 #if defined (SYS_fpathconf)
1501   syscall_table[SYS_fpathconf] = "fpathconf";
1502 #endif
1503 #if defined (SYS_vfork)
1504   syscall_table[SYS_vfork] = "vfork";
1505 #endif
1506 #if defined (SYS_fchdir)
1507   syscall_table[SYS_fchdir] = "fchdir";
1508 #endif
1509 #if defined (SYS_readv)
1510   syscall_table[SYS_readv] = "readv";
1511 #endif
1512 #if defined (SYS_writev)
1513   syscall_table[SYS_writev] = "writev";
1514 #endif
1515 #if defined (SYS_xstat)
1516   syscall_table[SYS_xstat] = "xstat";
1517 #endif
1518 #if defined (SYS_lxstat)
1519   syscall_table[SYS_lxstat] = "lxstat";
1520 #endif
1521 #if defined (SYS_fxstat)
1522   syscall_table[SYS_fxstat] = "fxstat";
1523 #endif
1524 #if defined (SYS_xmknod)
1525   syscall_table[SYS_xmknod] = "xmknod";
1526 #endif
1527 #if defined (SYS_clocal)
1528   syscall_table[SYS_clocal] = "clocal";
1529 #endif
1530 #if defined (SYS_setrlimit)
1531   syscall_table[SYS_setrlimit] = "setrlimit";
1532 #endif
1533 #if defined (SYS_getrlimit)
1534   syscall_table[SYS_getrlimit] = "getrlimit";
1535 #endif
1536 #if defined (SYS_lchown)
1537   syscall_table[SYS_lchown] = "lchown";
1538 #endif
1539 #if defined (SYS_memcntl)
1540   syscall_table[SYS_memcntl] = "memcntl";
1541 #endif
1542 #if defined (SYS_getpmsg)
1543   syscall_table[SYS_getpmsg] = "getpmsg";
1544 #endif
1545 #if defined (SYS_putpmsg)
1546   syscall_table[SYS_putpmsg] = "putpmsg";
1547 #endif
1548 #if defined (SYS_rename)
1549   syscall_table[SYS_rename] = "rename";
1550 #endif
1551 #if defined (SYS_uname)
1552   syscall_table[SYS_uname] = "uname";
1553 #endif
1554 #if defined (SYS_setegid)
1555   syscall_table[SYS_setegid] = "setegid";
1556 #endif
1557 #if defined (SYS_sysconfig)
1558   syscall_table[SYS_sysconfig] = "sysconfig";
1559 #endif
1560 #if defined (SYS_adjtime)
1561   syscall_table[SYS_adjtime] = "adjtime";
1562 #endif
1563 #if defined (SYS_systeminfo)
1564   syscall_table[SYS_systeminfo] = "systeminfo";
1565 #endif
1566 #if defined (SYS_seteuid)
1567   syscall_table[SYS_seteuid] = "seteuid";
1568 #endif
1569 #if defined (SYS_sproc)
1570   syscall_table[SYS_sproc] = "sproc";
1571 #endif
1572 #if defined (SYS_keyctl)
1573   syscall_table[SYS_keyctl] = "keyctl";
1574 #endif
1575 #if defined (SYS_secsys)
1576   syscall_table[SYS_secsys] = "secsys";
1577 #endif
1578 #if defined (SYS_filepriv)
1579   syscall_table[SYS_filepriv] = "filepriv";
1580 #endif
1581 #if defined (SYS_procpriv)
1582   syscall_table[SYS_procpriv] = "procpriv";
1583 #endif
1584 #if defined (SYS_devstat)
1585   syscall_table[SYS_devstat] = "devstat";
1586 #endif
1587 #if defined (SYS_aclipc)
1588   syscall_table[SYS_aclipc] = "aclipc";
1589 #endif
1590 #if defined (SYS_fdevstat)
1591   syscall_table[SYS_fdevstat] = "fdevstat";
1592 #endif
1593 #if defined (SYS_flvlfile)
1594   syscall_table[SYS_flvlfile] = "flvlfile";
1595 #endif
1596 #if defined (SYS_lvlfile)
1597   syscall_table[SYS_lvlfile] = "lvlfile";
1598 #endif
1599 #if defined (SYS_lvlequal)
1600   syscall_table[SYS_lvlequal] = "lvlequal";
1601 #endif
1602 #if defined (SYS_lvlproc)
1603   syscall_table[SYS_lvlproc] = "lvlproc";
1604 #endif
1605 #if defined (SYS_lvlipc)
1606   syscall_table[SYS_lvlipc] = "lvlipc";
1607 #endif
1608 #if defined (SYS_acl)
1609   syscall_table[SYS_acl] = "acl";
1610 #endif
1611 #if defined (SYS_auditevt)
1612   syscall_table[SYS_auditevt] = "auditevt";
1613 #endif
1614 #if defined (SYS_auditctl)
1615   syscall_table[SYS_auditctl] = "auditctl";
1616 #endif
1617 #if defined (SYS_auditdmp)
1618   syscall_table[SYS_auditdmp] = "auditdmp";
1619 #endif
1620 #if defined (SYS_auditlog)
1621   syscall_table[SYS_auditlog] = "auditlog";
1622 #endif
1623 #if defined (SYS_auditbuf)
1624   syscall_table[SYS_auditbuf] = "auditbuf";
1625 #endif
1626 #if defined (SYS_lvldom)
1627   syscall_table[SYS_lvldom] = "lvldom";
1628 #endif
1629 #if defined (SYS_lvlvfs)
1630   syscall_table[SYS_lvlvfs] = "lvlvfs";
1631 #endif
1632 #if defined (SYS_mkmld)
1633   syscall_table[SYS_mkmld] = "mkmld";
1634 #endif
1635 #if defined (SYS_mldmode)
1636   syscall_table[SYS_mldmode] = "mldmode";
1637 #endif
1638 #if defined (SYS_secadvise)
1639   syscall_table[SYS_secadvise] = "secadvise";
1640 #endif
1641 #if defined (SYS_online)
1642   syscall_table[SYS_online] = "online";
1643 #endif
1644 #if defined (SYS_setitimer)
1645   syscall_table[SYS_setitimer] = "setitimer";
1646 #endif
1647 #if defined (SYS_getitimer)
1648   syscall_table[SYS_getitimer] = "getitimer";
1649 #endif
1650 #if defined (SYS_gettimeofday)
1651   syscall_table[SYS_gettimeofday] = "gettimeofday";
1652 #endif
1653 #if defined (SYS_settimeofday)
1654   syscall_table[SYS_settimeofday] = "settimeofday";
1655 #endif
1656 #if defined (SYS_lwp_create)
1657   syscall_table[SYS_lwp_create] = "_lwp_create";
1658 #endif
1659 #if defined (SYS_lwp_exit)
1660   syscall_table[SYS_lwp_exit] = "_lwp_exit";
1661 #endif
1662 #if defined (SYS_lwp_wait)
1663   syscall_table[SYS_lwp_wait] = "_lwp_wait";
1664 #endif
1665 #if defined (SYS_lwp_self)
1666   syscall_table[SYS_lwp_self] = "_lwp_self";
1667 #endif
1668 #if defined (SYS_lwp_info)
1669   syscall_table[SYS_lwp_info] = "_lwp_info";
1670 #endif
1671 #if defined (SYS_lwp_private)
1672   syscall_table[SYS_lwp_private] = "_lwp_private";
1673 #endif
1674 #if defined (SYS_processor_bind)
1675   syscall_table[SYS_processor_bind] = "processor_bind";
1676 #endif
1677 #if defined (SYS_processor_exbind)
1678   syscall_table[SYS_processor_exbind] = "processor_exbind";
1679 #endif
1680 #if defined (SYS_prepblock)
1681   syscall_table[SYS_prepblock] = "prepblock";
1682 #endif
1683 #if defined (SYS_block)
1684   syscall_table[SYS_block] = "block";
1685 #endif
1686 #if defined (SYS_rdblock)
1687   syscall_table[SYS_rdblock] = "rdblock";
1688 #endif
1689 #if defined (SYS_unblock)
1690   syscall_table[SYS_unblock] = "unblock";
1691 #endif
1692 #if defined (SYS_cancelblock)
1693   syscall_table[SYS_cancelblock] = "cancelblock";
1694 #endif
1695 #if defined (SYS_pread)
1696   syscall_table[SYS_pread] = "pread";
1697 #endif
1698 #if defined (SYS_pwrite)
1699   syscall_table[SYS_pwrite] = "pwrite";
1700 #endif
1701 #if defined (SYS_truncate)
1702   syscall_table[SYS_truncate] = "truncate";
1703 #endif
1704 #if defined (SYS_ftruncate)
1705   syscall_table[SYS_ftruncate] = "ftruncate";
1706 #endif
1707 #if defined (SYS_lwp_kill)
1708   syscall_table[SYS_lwp_kill] = "_lwp_kill";
1709 #endif
1710 #if defined (SYS_sigwait)
1711   syscall_table[SYS_sigwait] = "sigwait";
1712 #endif
1713 #if defined (SYS_fork1)
1714   syscall_table[SYS_fork1] = "fork1";
1715 #endif
1716 #if defined (SYS_forkall)
1717   syscall_table[SYS_forkall] = "forkall";
1718 #endif
1719 #if defined (SYS_modload)
1720   syscall_table[SYS_modload] = "modload";
1721 #endif
1722 #if defined (SYS_moduload)
1723   syscall_table[SYS_moduload] = "moduload";
1724 #endif
1725 #if defined (SYS_modpath)
1726   syscall_table[SYS_modpath] = "modpath";
1727 #endif
1728 #if defined (SYS_modstat)
1729   syscall_table[SYS_modstat] = "modstat";
1730 #endif
1731 #if defined (SYS_modadm)
1732   syscall_table[SYS_modadm] = "modadm";
1733 #endif
1734 #if defined (SYS_getksym)
1735   syscall_table[SYS_getksym] = "getksym";
1736 #endif
1737 #if defined (SYS_lwp_suspend)
1738   syscall_table[SYS_lwp_suspend] = "_lwp_suspend";
1739 #endif
1740 #if defined (SYS_lwp_continue)
1741   syscall_table[SYS_lwp_continue] = "_lwp_continue";
1742 #endif
1743 #if defined (SYS_priocntllst)
1744   syscall_table[SYS_priocntllst] = "priocntllst";
1745 #endif
1746 #if defined (SYS_sleep)
1747   syscall_table[SYS_sleep] = "sleep";
1748 #endif
1749 #if defined (SYS_lwp_sema_wait)
1750   syscall_table[SYS_lwp_sema_wait] = "_lwp_sema_wait";
1751 #endif
1752 #if defined (SYS_lwp_sema_post)
1753   syscall_table[SYS_lwp_sema_post] = "_lwp_sema_post";
1754 #endif
1755 #if defined (SYS_lwp_sema_trywait)
1756   syscall_table[SYS_lwp_sema_trywait] = "lwp_sema_trywait";
1757 #endif
1758 #if defined(SYS_fstatvfs64)
1759   syscall_table[SYS_fstatvfs64] = "fstatvfs64";
1760 #endif
1761 #if defined(SYS_statvfs64)
1762   syscall_table[SYS_statvfs64] = "statvfs64";
1763 #endif
1764 #if defined(SYS_ftruncate64)
1765   syscall_table[SYS_ftruncate64] = "ftruncate64";
1766 #endif
1767 #if defined(SYS_truncate64)
1768   syscall_table[SYS_truncate64] = "truncate64";
1769 #endif
1770 #if defined(SYS_getrlimit64)
1771   syscall_table[SYS_getrlimit64] = "getrlimit64";
1772 #endif
1773 #if defined(SYS_setrlimit64)
1774   syscall_table[SYS_setrlimit64] = "setrlimit64";
1775 #endif
1776 #if defined(SYS_lseek64)
1777   syscall_table[SYS_lseek64] = "lseek64";
1778 #endif
1779 #if defined(SYS_mmap64)
1780   syscall_table[SYS_mmap64] = "mmap64";
1781 #endif
1782 #if defined(SYS_pread64)
1783   syscall_table[SYS_pread64] = "pread64";
1784 #endif
1785 #if defined(SYS_creat64)
1786   syscall_table[SYS_creat64] = "creat64";
1787 #endif
1788 #if defined(SYS_dshmsys)
1789   syscall_table[SYS_dshmsys] = "dshmsys";
1790 #endif
1791 #if defined(SYS_invlpg)
1792   syscall_table[SYS_invlpg] = "invlpg";
1793 #endif
1794 #if defined(SYS_cg_ids)
1795   syscall_table[SYS_cg_ids] = "cg_ids";
1796 #endif
1797 #if defined(SYS_cg_processors)
1798   syscall_table[SYS_cg_processors] = "cg_processors";
1799 #endif
1800 #if defined(SYS_cg_info)
1801   syscall_table[SYS_cg_info] = "cg_info";
1802 #endif
1803 #if defined(SYS_cg_bind)
1804   syscall_table[SYS_cg_bind] = "cg_bind";
1805 #endif
1806 #if defined(SYS_cg_current)
1807   syscall_table[SYS_cg_current] = "cg_current";
1808 #endif
1809 #if defined(SYS_cg_memloc)
1810   syscall_table[SYS_cg_memloc] = "cg_memloc";
1811 #endif
1812 }
1813
1814 /*
1815
1816 LOCAL FUNCTION
1817
1818         procfs_kill_inferior - kill any currently inferior
1819
1820 SYNOPSIS
1821
1822         void procfs_kill_inferior (void)
1823
1824 DESCRIPTION
1825
1826         Kill any current inferior.
1827
1828 NOTES
1829
1830         Kills even attached inferiors.  Presumably the user has already
1831         been prompted that the inferior is an attached one rather than
1832         one started by gdb.  (FIXME?)
1833
1834 */
1835
1836 static void
1837 procfs_kill_inferior ()
1838 {
1839   target_mourn_inferior ();
1840 }
1841
1842 /*
1843
1844 LOCAL FUNCTION
1845
1846         unconditionally_kill_inferior - terminate the inferior
1847
1848 SYNOPSIS
1849
1850         static void unconditionally_kill_inferior (struct procinfo *)
1851
1852 DESCRIPTION
1853
1854         Kill the specified inferior.
1855
1856 NOTE
1857
1858         A possibly useful enhancement would be to first try sending
1859         the inferior a terminate signal, politely asking it to commit
1860         suicide, before we murder it (we could call that
1861         politely_kill_inferior()).
1862
1863 */
1864
1865 static void
1866 unconditionally_kill_inferior (pi)
1867      struct procinfo *pi;
1868 {
1869   int ppid;
1870   struct proc_ctl pctl;
1871   
1872   ppid = pi->prstatus.pr_ppid;
1873
1874 #ifdef PROCFS_NEED_CLEAR_CURSIG_FOR_KILL
1875   /* Alpha OSF/1-3.x procfs needs a clear of the current signal
1876      before the PIOCKILL, otherwise it might generate a corrupted core
1877      file for the inferior.  */
1878   ioctl (pi->ctl_fd, PIOCSSIG, NULL);
1879 #endif
1880 #ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
1881   /* Alpha OSF/1-2.x procfs needs a PIOCSSIG call with a SIGKILL signal
1882      to kill the inferior, otherwise it might remain stopped with a
1883      pending SIGKILL.
1884      We do not check the result of the PIOCSSIG, the inferior might have
1885      died already.  */
1886   {
1887     struct siginfo newsiginfo;
1888
1889     memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
1890     newsiginfo.si_signo = SIGKILL;
1891     newsiginfo.si_code = 0;
1892     newsiginfo.si_errno = 0;
1893     newsiginfo.si_pid = getpid ();
1894     newsiginfo.si_uid = getuid ();
1895     ioctl (pi->ctl_fd, PIOCSSIG, &newsiginfo);
1896   }
1897 #else /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
1898   procfs_write_pckill (pi);
1899 #endif /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
1900
1901   close_proc_file (pi);
1902
1903 /* Only wait() for our direct children.  Our grandchildren zombies are killed
1904    by the death of their parents.  */
1905
1906   if (ppid == getpid())
1907     wait ((int *) 0);
1908 }
1909
1910 /*
1911
1912 LOCAL FUNCTION
1913
1914         procfs_xfer_memory -- copy data to or from inferior memory space
1915
1916 SYNOPSIS
1917
1918         int procfs_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
1919                 int dowrite, struct target_ops target)
1920
1921 DESCRIPTION
1922
1923         Copy LEN bytes to/from inferior's memory starting at MEMADDR
1924         from/to debugger memory starting at MYADDR.  Copy from inferior
1925         if DOWRITE is zero or to inferior if DOWRITE is nonzero.
1926   
1927         Returns the length copied, which is either the LEN argument or
1928         zero.  This xfer function does not do partial moves, since procfs_ops
1929         doesn't allow memory operations to cross below us in the target stack
1930         anyway.
1931
1932 NOTES
1933
1934         The /proc interface makes this an almost trivial task.
1935  */
1936
1937 static int
1938 procfs_xfer_memory (memaddr, myaddr, len, dowrite, target)
1939      CORE_ADDR memaddr;
1940      char *myaddr;
1941      int len;
1942      int dowrite;
1943      struct target_ops *target; /* ignored */
1944 {
1945   int nbytes = 0;
1946   struct procinfo *pi;
1947
1948   pi = current_procinfo;
1949
1950   if (lseek(pi->as_fd, (off_t) memaddr, SEEK_SET) == (off_t) memaddr)
1951     {
1952       if (dowrite)
1953         {
1954           nbytes = write (pi->as_fd, myaddr, len);
1955         }
1956       else
1957         {
1958           nbytes = read (pi->as_fd, myaddr, len);
1959         }
1960       if (nbytes < 0)
1961         {
1962           nbytes = 0;
1963         }
1964     }
1965   return (nbytes);
1966 }
1967
1968 /*
1969
1970 LOCAL FUNCTION
1971
1972         procfs_store_registers -- copy register values back to inferior
1973
1974 SYNOPSIS
1975
1976         void procfs_store_registers (int regno)
1977
1978 DESCRIPTION
1979
1980         Store our current register values back into the inferior.  If
1981         REGNO is -1 then store all the register, otherwise store just
1982         the value specified by REGNO.
1983
1984 NOTES
1985
1986         If we are storing only a single register, we first have to get all
1987         the current values from the process, overwrite the desired register
1988         in the gregset with the one we want from gdb's registers, and then
1989         send the whole set back to the process.  For writing all the
1990         registers, all we have to do is generate the gregset and send it to
1991         the process.
1992
1993         Also note that the process has to be stopped on an event of interest
1994         for this to work, which basically means that it has to have been
1995         run under the control of one of the other /proc ioctl calls and not
1996         ptrace.  Since we don't use ptrace anyway, we don't worry about this
1997         fine point, but it is worth noting for future reference.
1998
1999         Gdb is confused about what this function is supposed to return.
2000         Some versions return a value, others return nothing.  Some are
2001         declared to return a value and actually return nothing.  Gdb ignores
2002         anything returned.  (FIXME)
2003
2004  */
2005
2006 static void
2007 procfs_store_registers (regno)
2008      int regno;
2009 {
2010   struct procinfo *pi;
2011 #ifdef PROCFS_USE_READ_WRITE
2012   struct greg_ctl greg;
2013   struct fpreg_ctl fpreg;
2014 #endif
2015
2016   pi = current_procinfo;
2017
2018 #ifdef PROCFS_USE_READ_WRITE
2019   if (regno != -1)
2020     {
2021       procfs_read_status (pi);
2022       memcpy ((char *) &greg.gregset,
2023          (char *) &pi->prstatus.pr_lwp.pr_context.uc_mcontext.gregs,
2024          sizeof (gdb_gregset_t));
2025     }
2026   fill_gregset (&greg.gregset, regno);
2027   greg.cmd = PCSREG;
2028   write (pi->ctl_fd, &greg, sizeof (greg));
2029 #else /* PROCFS_USE_READ_WRITE */
2030   if (regno != -1)
2031     {
2032       ioctl (pi->ctl_fd, PIOCGREG, &pi->gregset.gregset);
2033     }
2034   fill_gregset (&pi->gregset.gregset, regno);
2035   ioctl (pi->ctl_fd, PIOCSREG, &pi->gregset.gregset);
2036 #endif /* PROCFS_USE_READ_WRITE */
2037
2038 #if defined (FP0_REGNUM)
2039
2040   /* Now repeat everything using the floating point register set, if the
2041      target has floating point hardware. Since we ignore the returned value,
2042      we'll never know whether it worked or not anyway. */
2043
2044 #ifdef PROCFS_USE_READ_WRITE
2045   if (regno != -1)
2046     {
2047       procfs_read_status (pi);
2048       memcpy ((char *) &fpreg.fpregset,
2049           (char *) &pi->prstatus.pr_lwp.pr_context.uc_mcontext.fpregs,
2050           sizeof (gdb_fpregset_t));
2051     }
2052   fill_fpregset (&fpreg.fpregset, regno);
2053   fpreg.cmd = PCSFPREG;
2054   write (pi->ctl_fd, &fpreg, sizeof (fpreg));
2055 #else /* PROCFS_USE_READ_WRITE */
2056   if (regno != -1)
2057     {
2058       ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset.fpregset);
2059     }
2060   fill_fpregset (&pi->fpregset.fpregset, regno);
2061   ioctl (pi->ctl_fd, PIOCSFPREG, &pi->fpregset.fpregset);
2062 #endif /* PROCFS_USE_READ_WRITE */
2063
2064 #endif  /* FP0_REGNUM */
2065
2066 }
2067
2068 /*
2069
2070 LOCAL FUNCTION
2071
2072         init_procinfo - setup a procinfo struct and connect it to a process
2073
2074 SYNOPSIS
2075
2076         struct procinfo * init_procinfo (int pid)
2077
2078 DESCRIPTION
2079
2080         Allocate a procinfo structure, open the /proc file and then set up the
2081         set of signals and faults that are to be traced.  Returns a pointer to
2082         the new procinfo structure.  
2083
2084 NOTES
2085
2086         If proc_init_failed ever gets called, control returns to the command
2087         processing loop via the standard error handling code.
2088
2089  */
2090
2091 static struct procinfo *
2092 init_procinfo (pid, kill)
2093      int pid;
2094      int kill;
2095 {
2096   struct procinfo *pi = (struct procinfo *) 
2097     xmalloc (sizeof (struct procinfo));
2098   struct sig_ctl  sctl;
2099   struct flt_ctl  fctl;
2100
2101   memset ((char *) pi, 0, sizeof (*pi));
2102   if (!open_proc_file (pid, pi, O_RDWR, 1))
2103     proc_init_failed (pi, "can't open process file", kill);
2104
2105   /* open_proc_file may modify pid.  */
2106
2107   pid = pi -> pid;
2108
2109   /* Add new process to process info list */
2110
2111   pi->next = procinfo_list;
2112   procinfo_list = pi;
2113
2114   add_fd (pi);                  /* Add to list for poll/select */
2115
2116   /*  Remember some things about the inferior that we will, or might, change
2117       so that we can restore them when we detach. */
2118 #ifdef UNIXWARE
2119   memcpy ((char *) &pi->saved_trace.sigset,
2120           (char *) &pi->prstatus.pr_sigtrace, sizeof (sigset_t));
2121   memcpy ((char *) &pi->saved_fltset.fltset,
2122           (char *) &pi->prstatus.pr_flttrace, sizeof (fltset_t));
2123   memcpy ((char *) &pi->saved_entryset.sysset,
2124           (char *) &pi->prstatus.pr_sysentry, sizeof (sysset_t));
2125   memcpy ((char *) &pi->saved_exitset.sysset,
2126           (char *) &pi->prstatus.pr_sysexit, sizeof (sysset_t));
2127
2128   /* Set up trace and fault sets, as gdb expects them. */
2129
2130   prfillset (&sctl.sigset);
2131   notice_signals (pi, &sctl);
2132   prfillset (&fctl.fltset);
2133   prdelset (&fctl.fltset, FLTPAGE);
2134
2135 #else /* ! UNIXWARE */
2136   ioctl (pi->ctl_fd, PIOCGTRACE, &pi->saved_trace.sigset);
2137   ioctl (pi->ctl_fd, PIOCGHOLD, &pi->saved_sighold.sigset);
2138   ioctl (pi->ctl_fd, PIOCGFAULT, &pi->saved_fltset.fltset);
2139   ioctl (pi->ctl_fd, PIOCGENTRY, &pi->saved_entryset.sysset);
2140   ioctl (pi->ctl_fd, PIOCGEXIT, &pi->saved_exitset.sysset);
2141   
2142   /* Set up trace and fault sets, as gdb expects them. */
2143   
2144   memset ((char *) &pi->prrun, 0, sizeof (pi->prrun));
2145   prfillset (&pi->prrun.pr_trace);
2146   procfs_notice_signals (pid);
2147   prfillset (&pi->prrun.pr_fault);
2148   prdelset (&pi->prrun.pr_fault, FLTPAGE);
2149 #ifdef PROCFS_DONT_TRACE_FAULTS
2150   premptyset (&pi->prrun.pr_fault);
2151 #endif
2152 #endif /* UNIXWARE */
2153
2154   if (!procfs_read_status (pi))
2155     proc_init_failed (pi, "procfs_read_status failed", kill);
2156
2157   return pi;
2158 }
2159
2160 /*
2161
2162 LOCAL FUNCTION
2163
2164         create_procinfo - initialize access to a /proc entry
2165
2166 SYNOPSIS
2167
2168         struct procinfo * create_procinfo (int pid)
2169
2170 DESCRIPTION
2171
2172         Allocate a procinfo structure, open the /proc file and then set up the
2173         set of signals and faults that are to be traced.  Returns a pointer to
2174         the new procinfo structure.
2175
2176 NOTES
2177
2178         If proc_init_failed ever gets called, control returns to the command
2179         processing loop via the standard error handling code.
2180
2181  */
2182
2183 static struct procinfo *
2184 create_procinfo (pid)
2185      int pid;
2186 {
2187   struct procinfo *pi;
2188   struct sig_ctl  sctl;
2189   struct flt_ctl  fctl;
2190
2191   pi = find_procinfo (pid, 1);
2192   if (pi != NULL)
2193     return pi;                  /* All done!  It already exists */
2194
2195   pi = init_procinfo (pid, 1);
2196
2197 #ifndef UNIXWARE
2198 /* A bug in Solaris (2.5 at least) causes PIOCWSTOP to hang on LWPs that are
2199    already stopped, even if they all have PR_ASYNC set.  */
2200   if (!(pi->prstatus.pr_flags & PR_STOPPED))
2201 #endif
2202     if (!procfs_write_pcwstop (pi))
2203       proc_init_failed (pi, "procfs_write_pcwstop failed", 1);
2204
2205 #ifdef PROCFS_USE_READ_WRITE
2206   fctl.cmd = PCSFAULT;
2207   if (write (pi->ctl_fd, (char *) &fctl, sizeof (struct flt_ctl)) < 0)
2208     proc_init_failed (pi, "PCSFAULT failed", 1);
2209 #else
2210   if (ioctl (pi->ctl_fd, PIOCSFAULT, &pi->prrun.pr_fault) < 0)
2211     proc_init_failed (pi, "PIOCSFAULT failed", 1);
2212 #endif
2213
2214   return pi;
2215 }
2216
2217 /*
2218
2219 LOCAL FUNCTION
2220
2221         procfs_exit_handler - handle entry into the _exit syscall
2222
2223 SYNOPSIS
2224
2225         int procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
2226
2227 DESCRIPTION
2228
2229         This routine is called when an inferior process enters the _exit()
2230         system call.  It continues the process, and then collects the exit
2231         status and pid which are returned in *statvalp and *rtnvalp.  After
2232         that it returns non-zero to indicate that procfs_wait should wake up.
2233
2234 NOTES
2235         There is probably a better way to do this.
2236
2237  */
2238
2239 static int
2240 procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
2241      struct procinfo *pi;
2242      int syscall_num;
2243      int why;
2244      int *rtnvalp;
2245      int *statvalp;
2246 {
2247   struct procinfo *temp_pi, *next_pi;
2248   struct proc_ctl pctl;
2249
2250 #ifdef UNIXWARE
2251   pctl.cmd = PCRUN;
2252   pctl.data = PRCFAULT;
2253 #else
2254   pi->prrun.pr_flags = PRCFAULT;
2255 #endif
2256
2257 #ifdef PROCFS_USE_READ_WRITE
2258   if (write (pi->ctl_fd, (char *)&pctl, sizeof (struct proc_ctl)) < 0)
2259 #else
2260   if (ioctl (pi->ctl_fd, PIOCRUN, &pi->prrun) != 0)
2261 #endif
2262     perror_with_name (pi->pathname);
2263
2264   if (attach_flag)
2265     {
2266       /* Claim it exited (don't call wait). */
2267       if (info_verbose)
2268         printf_filtered ("(attached process has exited)\n");
2269       *statvalp = 0;
2270       *rtnvalp  = inferior_pid;
2271     }
2272   else
2273     {
2274       *rtnvalp = wait (statvalp);
2275       if (*rtnvalp >= 0)
2276         *rtnvalp = pi->pid;
2277     }
2278
2279   /* Close ALL open proc file handles,
2280      except the one that called SYS_exit. */
2281   for (temp_pi = procinfo_list; temp_pi; temp_pi = next_pi)
2282     {
2283       next_pi = temp_pi->next;
2284       if (temp_pi == pi)
2285         continue;               /* Handled below */
2286       close_proc_file (temp_pi);
2287     }
2288   return 1;
2289 }
2290
2291 /*
2292
2293 LOCAL FUNCTION
2294
2295         procfs_exec_handler - handle exit from the exec family of syscalls
2296
2297 SYNOPSIS
2298
2299         int procfs_exec_handler (pi, syscall_num, why, rtnvalp, statvalp)
2300
2301 DESCRIPTION
2302
2303         This routine is called when an inferior process is about to finish any
2304         of the exec() family of system calls.  It pretends that we got a
2305         SIGTRAP (for compatibility with ptrace behavior), and returns non-zero
2306         to tell procfs_wait to wake up.
2307
2308 NOTES
2309         This need for compatibility with ptrace is questionable.  In the
2310         future, it shouldn't be necessary.
2311
2312  */
2313
2314 static int
2315 procfs_exec_handler (pi, syscall_num, why, rtnvalp, statvalp)
2316      struct procinfo *pi;
2317      int syscall_num;
2318      int why;
2319      int *rtnvalp;
2320      int *statvalp;
2321 {
2322   *statvalp = (SIGTRAP << 8) | 0177;
2323
2324   return 1;
2325 }
2326
2327 #if defined(SYS_sproc) && !defined(UNIXWARE)
2328 /* IRIX lwp creation system call */
2329
2330 /*
2331
2332 LOCAL FUNCTION
2333
2334         procfs_sproc_handler - handle exit from the sproc syscall
2335
2336 SYNOPSIS
2337
2338         int procfs_sproc_handler (pi, syscall_num, why, rtnvalp, statvalp)
2339
2340 DESCRIPTION
2341
2342         This routine is called when an inferior process is about to finish an
2343         sproc() system call.  This is the system call that IRIX uses to create
2344         a lightweight process.  When the target process gets this event, we can
2345         look at rval1 to find the new child processes ID, and create a new
2346         procinfo struct from that.
2347
2348         After that, it pretends that we got a SIGTRAP, and returns non-zero
2349         to tell procfs_wait to wake up.  Subsequently, wait_for_inferior gets
2350         woken up, sees the new process and continues it.
2351
2352 NOTES
2353         We actually never see the child exiting from sproc because we will
2354         shortly stop the child with PIOCSTOP, which is then registered as the
2355         event of interest.
2356  */
2357
2358 static int
2359 procfs_sproc_handler (pi, syscall_num, why, rtnvalp, statvalp)
2360      struct procinfo *pi;
2361      int syscall_num;
2362      int why;
2363      int *rtnvalp;
2364      int *statvalp;
2365 {
2366 /* We've just detected the completion of an sproc system call.  Now we need to
2367    setup a procinfo struct for this thread, and notify the thread system of the
2368    new arrival.  */
2369
2370 /* If sproc failed, then nothing interesting happened.  Continue the process
2371    and go back to sleep. */
2372
2373   if (pi->prstatus.pr_errno != 0)
2374     {
2375       pi->prrun.pr_flags &= PRSTEP;
2376       pi->prrun.pr_flags |= PRCFAULT;
2377
2378       if (ioctl (pi->ctl_fd, PIOCRUN, &pi->prrun) != 0)
2379         perror_with_name (pi->pathname);
2380
2381       return 0;
2382     }
2383
2384   /* At this point, the new thread is stopped at it's first instruction, and
2385      the parent is stopped at the exit from sproc.  */
2386
2387   /* Notify the caller of the arrival of a new thread. */
2388   create_procinfo (pi->prstatus.pr_rval1);
2389
2390   *rtnvalp = pi->prstatus.pr_rval1;
2391   *statvalp = (SIGTRAP << 8) | 0177;
2392
2393   return 1;
2394 }
2395
2396 /*
2397
2398 LOCAL FUNCTION
2399
2400         procfs_fork_handler - handle exit from the fork syscall
2401
2402 SYNOPSIS
2403
2404         int procfs_fork_handler (pi, syscall_num, why, rtnvalp, statvalp)
2405
2406 DESCRIPTION
2407
2408         This routine is called when an inferior process is about to finish a
2409         fork() system call.  We will open up the new process, and then close
2410         it, which releases it from the clutches of the debugger.
2411
2412         After that, we continue the target process as though nothing had
2413         happened.
2414
2415 NOTES
2416         This is necessary for IRIX because we have to set PR_FORK in order
2417         to catch the creation of lwps (via sproc()).  When an actual fork
2418         occurs, it becomes necessary to reset the forks debugger flags and
2419         continue it because we can't hack multiple processes yet.
2420  */
2421
2422 static int
2423 procfs_fork_handler (pi, syscall_num, why, rtnvalp, statvalp)
2424      struct procinfo *pi;
2425      int syscall_num;
2426      int why;
2427      int *rtnvalp;
2428      int *statvalp;
2429 {
2430   struct procinfo *pitemp;
2431
2432 /* At this point, we've detected the completion of a fork (or vfork) call in
2433    our child.  The grandchild is also stopped because we set inherit-on-fork
2434    earlier.  (Note that nobody has the grandchilds' /proc file open at this
2435    point.)  We will release the grandchild from the debugger by opening it's
2436    /proc file and then closing it.  Since run-on-last-close is set, the
2437    grandchild continues on its' merry way.  */
2438
2439
2440   pitemp = create_procinfo (pi->prstatus.pr_rval1);
2441   if (pitemp)
2442     close_proc_file (pitemp);
2443
2444   if (ioctl (pi->ctl_fd, PIOCRUN, &pi->prrun) != 0)
2445     perror_with_name (pi->pathname);
2446
2447   return 0;
2448 }
2449 #endif /* SYS_sproc && !UNIXWARE */
2450
2451 /*
2452
2453 LOCAL FUNCTION
2454
2455         procfs_set_inferior_syscall_traps - setup the syscall traps 
2456
2457 SYNOPSIS
2458
2459         void procfs_set_inferior_syscall_traps (struct procinfo *pip)
2460
2461 DESCRIPTION
2462
2463         Called for each "procinfo" (process, thread, or LWP) in the
2464         inferior, to register for notification of and handlers for
2465         syscall traps in the inferior.
2466
2467  */
2468
2469 static void
2470 procfs_set_inferior_syscall_traps (pip)
2471      struct procinfo *pip;
2472 {
2473   procfs_set_syscall_trap (pip, SYS_exit, PROCFS_SYSCALL_ENTRY,
2474                            procfs_exit_handler);
2475
2476 #ifndef PRFS_STOPEXEC
2477 #ifdef SYS_exec
2478   procfs_set_syscall_trap (pip, SYS_exec, PROCFS_SYSCALL_EXIT,
2479                            procfs_exec_handler);
2480 #endif
2481 #ifdef SYS_execv
2482   procfs_set_syscall_trap (pip, SYS_execv, PROCFS_SYSCALL_EXIT,
2483                            procfs_exec_handler);
2484 #endif
2485 #ifdef SYS_execve
2486   procfs_set_syscall_trap (pip, SYS_execve, PROCFS_SYSCALL_EXIT,
2487                            procfs_exec_handler);
2488 #endif
2489 #endif  /* PRFS_STOPEXEC */
2490
2491   /* Setup traps on exit from sproc() */
2492
2493 #ifdef SYS_sproc
2494   procfs_set_syscall_trap (pip, SYS_sproc, PROCFS_SYSCALL_EXIT,
2495                            procfs_sproc_handler);
2496   procfs_set_syscall_trap (pip, SYS_fork, PROCFS_SYSCALL_EXIT,
2497                            procfs_fork_handler);
2498 #ifdef SYS_vfork
2499   procfs_set_syscall_trap (pip, SYS_vfork, PROCFS_SYSCALL_EXIT,
2500                            procfs_fork_handler);
2501 #endif
2502 /* Turn on inherit-on-fork flag so that all children of the target process
2503    start with tracing flags set.  This allows us to trap lwp creation.  Note
2504    that we also have to trap on fork and vfork in order to disable all tracing
2505    in the targets child processes.  */
2506
2507   modify_inherit_on_fork_flag (pip->ctl_fd, 1);
2508 #endif
2509
2510 #ifdef SYS_lwp_create
2511   procfs_set_syscall_trap (pip, SYS_lwp_create, PROCFS_SYSCALL_EXIT,
2512                            procfs_lwp_creation_handler);
2513 #endif
2514 }
2515
2516 /*
2517
2518 LOCAL FUNCTION
2519
2520         procfs_init_inferior - initialize target vector and access to a
2521         /proc entry
2522
2523 SYNOPSIS
2524
2525         void procfs_init_inferior (int pid)
2526
2527 DESCRIPTION
2528
2529         When gdb starts an inferior, this function is called in the parent
2530         process immediately after the fork.  It waits for the child to stop
2531         on the return from the exec system call (the child itself takes care
2532         of ensuring that this is set up), then sets up the set of signals
2533         and faults that are to be traced.  Returns the pid, which may have had
2534         the thread-id added to it.
2535
2536 NOTES
2537
2538         If proc_init_failed ever gets called, control returns to the command
2539         processing loop via the standard error handling code.
2540
2541  */
2542
2543 static void 
2544 procfs_init_inferior (pid)
2545      int pid;
2546 {
2547   struct procinfo *pip;
2548
2549   push_target (&procfs_ops);
2550
2551   pip = create_procinfo (pid);
2552
2553   procfs_set_inferior_syscall_traps (pip);
2554
2555   /* create_procinfo may change the pid, so we have to update inferior_pid
2556      here before calling other gdb routines that need the right pid.  */
2557
2558   pid = pip -> pid;
2559   inferior_pid = pid;
2560
2561   add_thread (pip -> pid);      /* Setup initial thread */
2562
2563 #ifdef START_INFERIOR_TRAPS_EXPECTED
2564   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
2565 #else
2566   /* One trap to exec the shell, one to exec the program being debugged.  */
2567   startup_inferior (2);
2568 #endif
2569 }
2570
2571 /*
2572
2573 GLOBAL FUNCTION
2574
2575         procfs_notice_signals
2576
2577 SYNOPSIS
2578
2579         static void procfs_notice_signals (int pid);
2580
2581 DESCRIPTION
2582
2583         When the user changes the state of gdb's signal handling via the
2584         "handle" command, this function gets called to see if any change
2585         in the /proc interface is required.  It is also called internally
2586         by other /proc interface functions to initialize the state of
2587         the traced signal set.
2588
2589         One thing it does is that signals for which the state is "nostop",
2590         "noprint", and "pass", have their trace bits reset in the pr_trace
2591         field, so that they are no longer traced.  This allows them to be
2592         delivered directly to the inferior without the debugger ever being
2593         involved.
2594  */
2595
2596 static void
2597 procfs_notice_signals (pid)
2598      int pid;
2599 {
2600   struct procinfo *pi;
2601   struct sig_ctl  sctl;
2602
2603   pi = find_procinfo (pid, 0);
2604
2605 #ifdef UNIXWARE
2606   premptyset (&sctl.sigset);
2607 #else
2608   sctl.sigset = pi->prrun.pr_trace;
2609 #endif
2610
2611   notice_signals (pi, &sctl);
2612
2613 #ifndef UNIXWARE
2614   pi->prrun.pr_trace = sctl.sigset;
2615 #endif
2616 }
2617
2618 static void
2619 notice_signals (pi, sctl)
2620         struct procinfo *pi;
2621         struct sig_ctl *sctl;
2622 {
2623   int signo;
2624
2625   for (signo = 0; signo < NSIG; signo++)
2626     {
2627       if (signal_stop_state (target_signal_from_host (signo)) == 0 &&
2628           signal_print_state (target_signal_from_host (signo)) == 0 &&
2629           signal_pass_state (target_signal_from_host (signo)) == 1)
2630         {
2631           prdelset (&sctl->sigset, signo);
2632         }
2633       else
2634         {
2635           praddset (&sctl->sigset, signo);
2636         }
2637     }
2638 #ifdef PROCFS_USE_READ_WRITE
2639   sctl->cmd = PCSTRACE;
2640   if (write (pi->ctl_fd, (char *) sctl, sizeof (struct sig_ctl)) < 0)
2641 #else
2642   if (ioctl (pi->ctl_fd, PIOCSTRACE, &sctl->sigset))
2643 #endif
2644     {
2645       print_sys_errmsg ("PIOCSTRACE failed", errno);
2646     }
2647 }
2648
2649 /*
2650
2651 LOCAL FUNCTION
2652
2653         proc_set_exec_trap -- arrange for exec'd child to halt at startup
2654
2655 SYNOPSIS
2656
2657         void proc_set_exec_trap (void)
2658
2659 DESCRIPTION
2660
2661         This function is called in the child process when starting up
2662         an inferior, prior to doing the exec of the actual inferior.
2663         It sets the child process's exitset to make exit from the exec
2664         system call an event of interest to stop on, and then simply
2665         returns.  The child does the exec, the system call returns, and
2666         the child stops at the first instruction, ready for the gdb
2667         parent process to take control of it.
2668
2669 NOTE
2670
2671         We need to use all local variables since the child may be sharing
2672         it's data space with the parent, if vfork was used rather than
2673         fork.
2674
2675         Also note that we want to turn off the inherit-on-fork flag in
2676         the child process so that any grand-children start with all
2677         tracing flags cleared.
2678  */
2679
2680 static void
2681 proc_set_exec_trap ()
2682 {
2683   struct sys_ctl exitset;
2684   struct sys_ctl entryset;
2685   char procname[MAX_PROC_NAME_SIZE];
2686   int fd;
2687   
2688   sprintf (procname, CTL_PROC_NAME_FMT, getpid ());
2689 #ifdef UNIXWARE
2690   if ((fd = open (procname, O_WRONLY)) < 0)
2691 #else
2692   if ((fd = open (procname, O_RDWR)) < 0)
2693 #endif
2694     {
2695       perror (procname);
2696       gdb_flush (gdb_stderr);
2697       _exit (127);
2698     }
2699   premptyset (&exitset.sysset);
2700   premptyset (&entryset.sysset);
2701
2702 #ifdef PRFS_STOPEXEC
2703   /* Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
2704      exits from exec system calls because of the user level loader.  */
2705   {
2706     int prfs_flags;
2707
2708     if (ioctl (fd, PIOCGSPCACT, &prfs_flags) < 0)
2709       {
2710         perror (procname);
2711         gdb_flush (gdb_stderr);
2712         _exit (127);
2713       }
2714     prfs_flags |= PRFS_STOPEXEC;
2715     if (ioctl (fd, PIOCSSPCACT, &prfs_flags) < 0)
2716       {
2717         perror (procname);
2718         gdb_flush (gdb_stderr);
2719         _exit (127);
2720       }
2721   }
2722 #else /* PRFS_STOPEXEC */
2723   /* GW: Rationale...
2724      Not all systems with /proc have all the exec* syscalls with the same
2725      names.  On the SGI, for example, there is no SYS_exec, but there
2726      *is* a SYS_execv.  So, we try to account for that. */
2727
2728 #ifdef SYS_exec
2729   praddset (&exitset.sysset, SYS_exec);
2730 #endif
2731 #ifdef SYS_execve
2732   praddset (&exitset.sysset, SYS_execve);
2733 #endif
2734 #ifdef SYS_execv
2735   praddset (&exitset.sysset, SYS_execv);
2736 #endif
2737
2738 #ifdef PROCFS_USE_READ_WRITE
2739   exitset.cmd = PCSEXIT;
2740   if (write (fd, (char *) &exitset, sizeof (struct sys_ctl)) < 0)
2741 #else
2742   if (ioctl (fd, PIOCSEXIT, &exitset.sysset) < 0)
2743 #endif
2744     {
2745       perror (procname);
2746       gdb_flush (gdb_stderr);
2747       _exit (127);
2748     }
2749 #endif /* PRFS_STOPEXEC */
2750
2751   praddset (&entryset.sysset, SYS_exit);
2752
2753 #ifdef PROCFS_USE_READ_WRITE
2754   entryset.cmd = PCSENTRY;
2755   if (write (fd, (char *) &entryset, sizeof (struct sys_ctl)) < 0)
2756 #else
2757   if (ioctl (fd, PIOCSENTRY, &entryset.sysset) < 0)
2758 #endif
2759     {
2760       perror (procname);
2761       gdb_flush (gdb_stderr);
2762       _exit (126);
2763     }
2764
2765   /* Turn off inherit-on-fork flag so that all grand-children of gdb
2766      start with tracing flags cleared. */
2767
2768   modify_inherit_on_fork_flag (fd, 0);
2769
2770   /* Turn on run-on-last-close flag so that this process will not hang
2771      if GDB goes away for some reason.  */
2772
2773   modify_run_on_last_close_flag (fd, 1);
2774
2775 #ifndef UNIXWARE        /* since this is a solaris-ism, we don't want it */
2776                         /* NOTE: revisit when doing thread support for UW */
2777 #ifdef PR_ASYNC
2778   {
2779     long pr_flags;
2780     struct proc_ctl pctl;
2781
2782 /* Solaris needs this to make procfs treat all threads seperately.  Without
2783    this, all threads halt whenever something happens to any thread.  Since
2784    GDB wants to control all this itself, it needs to set PR_ASYNC.  */
2785
2786     pr_flags = PR_ASYNC;
2787 #ifdef PROCFS_USE_READ_WRITE
2788     pctl.cmd = PCSET;
2789     pctl.data = PR_FORK|PR_ASYNC;
2790     write (fd, (char *) &pctl, sizeof (struct proc_ctl));
2791 #else
2792     ioctl (fd, PIOCSET, &pr_flags);
2793 #endif
2794   }
2795 #endif  /* PR_ASYNC */
2796 #endif  /* !UNIXWARE */
2797 }
2798
2799 /*
2800
2801 GLOBAL FUNCTION
2802
2803         proc_iterate_over_mappings -- call function for every mapped space
2804
2805 SYNOPSIS
2806
2807         int proc_iterate_over_mappings (int (*func)())
2808
2809 DESCRIPTION
2810
2811         Given a pointer to a function, call that function for every
2812         mapped address space, passing it an open file descriptor for
2813         the file corresponding to that mapped address space (if any)
2814         and the base address of the mapped space.  Quit when we hit
2815         the end of the mappings or the function returns nonzero.
2816  */
2817
2818 #ifdef UNIXWARE
2819 int
2820 proc_iterate_over_mappings (func)
2821      int (*func) PARAMS ((int, CORE_ADDR));
2822 {
2823   int nmap;
2824   int fd;
2825   int funcstat = 0;
2826   prmap_t *prmaps;
2827   prmap_t *prmap;
2828   struct procinfo *pi;
2829   struct stat sbuf;
2830
2831   pi = current_procinfo;
2832
2833   if (fstat (pi->map_fd, &sbuf) < 0)
2834     return 0;
2835
2836   nmap = sbuf.st_size / sizeof (prmap_t);
2837   prmaps = (prmap_t *) alloca (nmap * sizeof(prmap_t));
2838   if ((lseek (pi->map_fd, 0, SEEK_SET) == 0) &&
2839         (read (pi->map_fd, (char *) prmaps, nmap * sizeof (prmap_t)) ==
2840         (nmap * sizeof (prmap_t))))
2841     {
2842       int i = 0;
2843       for (prmap = prmaps; i < nmap && funcstat == 0; ++prmap, ++i)
2844         {
2845           char name[sizeof ("/proc/1234567890/object") +
2846                 sizeof (prmap->pr_mapname)];
2847           sprintf (name, "/proc/%d/object/%s", pi->pid, prmap->pr_mapname);
2848           if ((fd = open (name, O_RDONLY)) == -1)
2849             {
2850               funcstat = 1;
2851               break;
2852             }
2853           funcstat = (*func) (fd, (CORE_ADDR) prmap->pr_vaddr);
2854           close (fd);
2855         }
2856     }
2857   return (funcstat);
2858 }
2859 #else /* UNIXWARE */
2860 int
2861 proc_iterate_over_mappings (func)
2862      int (*func) PARAMS ((int, CORE_ADDR));
2863 {
2864   int nmap;
2865   int fd;
2866   int funcstat = 0;
2867   struct prmap *prmaps;
2868   struct prmap *prmap;
2869   struct procinfo *pi;
2870
2871   pi = current_procinfo;
2872
2873   if (ioctl (pi->map_fd, PIOCNMAP, &nmap) == 0)
2874     {
2875       prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
2876       if (ioctl (pi->map_fd, PIOCMAP, prmaps) == 0)
2877         {
2878           for (prmap = prmaps; prmap -> pr_size && funcstat == 0; ++prmap)
2879             {
2880               fd = proc_address_to_fd (pi, (CORE_ADDR) prmap -> pr_vaddr, 0);
2881               funcstat = (*func) (fd, (CORE_ADDR) prmap -> pr_vaddr);
2882               close (fd);
2883             }
2884         }
2885     }
2886   return (funcstat);
2887 }
2888 #endif /* UNIXWARE */
2889
2890 #if 0   /* Currently unused */
2891 /*
2892
2893 GLOBAL FUNCTION
2894
2895         proc_base_address -- find base address for segment containing address
2896
2897 SYNOPSIS
2898
2899         CORE_ADDR proc_base_address (CORE_ADDR addr)
2900
2901 DESCRIPTION
2902
2903         Given an address of a location in the inferior, find and return
2904         the base address of the mapped segment containing that address.
2905
2906         This is used for example, by the shared library support code,
2907         where we have the pc value for some location in the shared library
2908         where we are stopped, and need to know the base address of the
2909         segment containing that address.
2910 */
2911
2912 CORE_ADDR
2913 proc_base_address (addr)
2914      CORE_ADDR addr;
2915 {
2916   int nmap;
2917   struct prmap *prmaps;
2918   struct prmap *prmap;
2919   CORE_ADDR baseaddr = 0;
2920   struct procinfo *pi;
2921
2922   pi = current_procinfo;
2923
2924   if (ioctl (pi->map_fd, PIOCNMAP, &nmap) == 0)
2925     {
2926       prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
2927       if (ioctl (pi->map_fd, PIOCMAP, prmaps) == 0)
2928         {
2929           for (prmap = prmaps; prmap -> pr_size; ++prmap)
2930             {
2931               if ((prmap -> pr_vaddr <= (caddr_t) addr) &&
2932                   (prmap -> pr_vaddr + prmap -> pr_size > (caddr_t) addr))
2933                 {
2934                   baseaddr = (CORE_ADDR) prmap -> pr_vaddr;
2935                   break;
2936                 }
2937             }
2938         }
2939     }
2940   return (baseaddr);
2941 }
2942
2943 #endif  /* 0 */
2944
2945 #ifndef UNIXWARE
2946 /*
2947
2948 LOCAL FUNCTION
2949
2950         proc_address_to_fd -- return open fd for file mapped to address
2951
2952 SYNOPSIS
2953
2954         int proc_address_to_fd (struct procinfo *pi, CORE_ADDR addr, complain)
2955
2956 DESCRIPTION
2957
2958         Given an address in the current inferior's address space, use the
2959         /proc interface to find an open file descriptor for the file that
2960         this address was mapped in from.  Return -1 if there is no current
2961         inferior.  Print a warning message if there is an inferior but
2962         the address corresponds to no file (IE a bogus address).
2963
2964 */
2965
2966 static int
2967 proc_address_to_fd (pi, addr, complain)
2968      struct procinfo *pi;
2969      CORE_ADDR addr;
2970      int complain;
2971 {
2972   int fd = -1;
2973
2974   if ((fd = ioctl (pi->ctl_fd, PIOCOPENM, (caddr_t *) &addr)) < 0)
2975     {
2976       if (complain)
2977         {
2978           print_sys_errmsg (pi->pathname, errno);
2979           warning ("can't find mapped file for address 0x%x", addr);
2980         }
2981     }
2982   return (fd);
2983 }
2984 #endif /* !UNIXWARE */
2985
2986 /* Attach to process PID, then initialize for debugging it
2987    and wait for the trace-trap that results from attaching.  */
2988
2989 static void
2990 procfs_attach (args, from_tty)
2991      char *args;
2992      int from_tty;
2993 {
2994   char *exec_file;
2995   int pid;
2996
2997   if (!args)
2998     error_no_arg ("process-id to attach");
2999
3000   pid = atoi (args);
3001
3002   if (pid == getpid())          /* Trying to masturbate? */
3003     error ("I refuse to debug myself!");
3004
3005   if (from_tty)
3006     {
3007       exec_file = (char *) get_exec_file (0);
3008
3009       if (exec_file)
3010         printf_unfiltered ("Attaching to program `%s', %s\n", exec_file, target_pid_to_str (pid));
3011       else
3012         printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid));
3013
3014       gdb_flush (gdb_stdout);
3015     }
3016
3017   inferior_pid = pid = do_attach (pid);
3018   push_target (&procfs_ops);
3019 }
3020
3021
3022 /* Take a program previously attached to and detaches it.
3023    The program resumes execution and will no longer stop
3024    on signals, etc.  We'd better not have left any breakpoints
3025    in the program or it'll die when it hits one.  For this
3026    to work, it may be necessary for the process to have been
3027    previously attached.  It *might* work if the program was
3028    started via the normal ptrace (PTRACE_TRACEME).  */
3029
3030 static void
3031 procfs_detach (args, from_tty)
3032      char *args;
3033      int from_tty;
3034 {
3035   int siggnal = 0;
3036
3037   if (from_tty)
3038     {
3039       char *exec_file = get_exec_file (0);
3040       if (exec_file == 0)
3041         exec_file = "";
3042       printf_unfiltered ("Detaching from program: %s %s\n",
3043               exec_file, target_pid_to_str (inferior_pid));
3044       gdb_flush (gdb_stdout);
3045     }
3046   if (args)
3047     siggnal = atoi (args);
3048   
3049   do_detach (siggnal);
3050   inferior_pid = 0;
3051   unpush_target (&procfs_ops);          /* Pop out of handling an inferior */
3052 }
3053
3054 /* Get ready to modify the registers array.  On machines which store
3055    individual registers, this doesn't need to do anything.  On machines
3056    which store all the registers in one fell swoop, this makes sure
3057    that registers contains all the registers from the program being
3058    debugged.  */
3059
3060 static void
3061 procfs_prepare_to_store ()
3062 {
3063 #ifdef CHILD_PREPARE_TO_STORE
3064   CHILD_PREPARE_TO_STORE ();
3065 #endif
3066 }
3067
3068 /* Print status information about what we're accessing.  */
3069
3070 static void
3071 procfs_files_info (ignore)
3072      struct target_ops *ignore;
3073 {
3074   printf_unfiltered ("\tUsing the running image of %s %s via /proc.\n",
3075           attach_flag? "attached": "child", target_pid_to_str (inferior_pid));
3076 }
3077
3078 /* ARGSUSED */
3079 static void
3080 procfs_open (arg, from_tty)
3081      char *arg;
3082      int from_tty;
3083 {
3084   error ("Use the \"run\" command to start a Unix child process.");
3085 }
3086
3087 /*
3088
3089 LOCAL FUNCTION
3090
3091         do_attach -- attach to an already existing process
3092
3093 SYNOPSIS
3094
3095         int do_attach (int pid)
3096
3097 DESCRIPTION
3098
3099         Attach to an already existing process with the specified process
3100         id.  If the process is not already stopped, query whether to
3101         stop it or not.
3102
3103 NOTES
3104
3105         The option of stopping at attach time is specific to the /proc
3106         versions of gdb.  Versions using ptrace force the attachee
3107         to stop.  (I have changed this version to do so, too.  All you
3108         have to do is "continue" to make it go on. -- [email protected])
3109
3110 */
3111
3112 static int
3113 do_attach (pid)
3114      int pid;
3115 {
3116   struct procinfo *pi;
3117   struct sig_ctl sctl;
3118   struct flt_ctl fctl;
3119   int nlwp, *lwps;
3120
3121   pi  = init_procinfo (pid, 0);
3122
3123 #ifdef PIOCLWPIDS
3124   nlwp = pi->prstatus.pr_nlwp;
3125   lwps = alloca ((2 * nlwp + 2) * sizeof (id_t));
3126
3127   if (ioctl (pi->ctl_fd, PIOCLWPIDS, lwps))
3128     {
3129       print_sys_errmsg (pi -> pathname, errno);
3130       error ("PIOCLWPIDS failed");
3131     }
3132 #else /* PIOCLWPIDS */
3133   nlwp = 1;
3134   lwps = alloca ((2 * nlwp + 2) * sizeof *lwps);
3135   lwps[0] = 0;
3136 #endif
3137   for (; nlwp > 0; nlwp--, lwps++)
3138     {
3139       /* First one has already been created above.  */
3140       if ((pi = find_procinfo ((*lwps << 16) | pid, 1)) == 0)
3141         pi = init_procinfo ((*lwps << 16) | pid, 0);
3142
3143 #ifdef UNIXWARE
3144       if (pi->prstatus.pr_lwp.pr_flags & (PR_STOPPED | PR_ISTOP))
3145 #else
3146       if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
3147 #endif
3148         {
3149           pi->was_stopped = 1;
3150         }
3151       else
3152         {
3153           pi->was_stopped = 0;
3154           if (1 || query ("Process is currently running, stop it? "))
3155             {
3156               long cmd;
3157               /* Make it run again when we close it.  */
3158               modify_run_on_last_close_flag (pi->ctl_fd, 1);
3159 #ifdef PROCFS_USE_READ_WRITE
3160               cmd = PCSTOP;
3161               if (write (pi->ctl_fd, (char *) &cmd, sizeof (long)) < 0)
3162 #else
3163               if (ioctl (pi->ctl_fd, PIOCSTOP, &pi->prstatus) < 0)
3164 #endif
3165                 {
3166                   print_sys_errmsg (pi->pathname, errno);
3167                   close_proc_file (pi);
3168                   error ("PIOCSTOP failed");
3169                 }
3170 #ifdef UNIXWARE
3171               if (!procfs_read_status (pi))
3172                 {
3173                   print_sys_errmsg (pi->pathname, errno);
3174                   close_proc_file (pi);
3175                   error ("procfs_read_status failed");
3176                 } 
3177 #endif
3178               pi->nopass_next_sigstop = 1;
3179             }
3180           else
3181             {
3182               printf_unfiltered ("Ok, gdb will wait for %s to stop.\n", 
3183                                  target_pid_to_str (pi->pid));
3184             }
3185         }
3186
3187 #ifdef PROCFS_USE_READ_WRITE
3188       fctl.cmd = PCSFAULT;
3189       if (write (pi->ctl_fd, (char *) &fctl, sizeof (struct flt_ctl)) < 0)
3190         print_sys_errmsg ("PCSFAULT failed", errno);
3191 #else /* PROCFS_USE_READ_WRITE */
3192       if (ioctl (pi->ctl_fd, PIOCSFAULT, &pi->prrun.pr_fault))
3193         {
3194           print_sys_errmsg ("PIOCSFAULT failed", errno);
3195         }
3196       if (ioctl (pi->ctl_fd, PIOCSTRACE, &pi->prrun.pr_trace))
3197         {
3198           print_sys_errmsg ("PIOCSTRACE failed", errno);
3199         }
3200       add_thread (pi->pid);
3201       procfs_set_inferior_syscall_traps (pi);
3202 #endif /* PROCFS_USE_READ_WRITE */
3203     }
3204   attach_flag = 1;
3205   return (pi->pid);
3206 }
3207
3208 /*
3209
3210 LOCAL FUNCTION
3211
3212         do_detach -- detach from an attached-to process
3213
3214 SYNOPSIS
3215
3216         void do_detach (int signal)
3217
3218 DESCRIPTION
3219
3220         Detach from the current attachee.
3221
3222         If signal is non-zero, the attachee is started running again and sent
3223         the specified signal.
3224
3225         If signal is zero and the attachee was not already stopped when we
3226         attached to it, then we make it runnable again when we detach.
3227
3228         Otherwise, we query whether or not to make the attachee runnable
3229         again, since we may simply want to leave it in the state it was in
3230         when we attached.
3231
3232         We report any problems, but do not consider them errors, since we
3233         MUST detach even if some things don't seem to go right.  This may not
3234         be the ideal situation.  (FIXME).
3235  */
3236
3237 static void
3238 do_detach (signal)
3239      int signal;
3240 {
3241   struct procinfo *pi;
3242
3243   for (pi = procinfo_list; pi; pi = pi->next)
3244     {
3245       if (signal)
3246         {
3247           set_proc_siginfo (pi, signal);
3248         }
3249 #ifdef PROCFS_USE_READ_WRITE
3250       pi->saved_exitset.cmd = PCSEXIT;
3251       if (write (pi->ctl_fd, (char *) &pi->saved_exitset,
3252                  sizeof (struct sys_ctl)) < 0)
3253 #else
3254         if (ioctl (pi->ctl_fd, PIOCSEXIT, &pi->saved_exitset.sysset) < 0)
3255 #endif
3256           {
3257             print_sys_errmsg (pi->pathname, errno);
3258             printf_unfiltered ("PIOCSEXIT failed.\n");
3259           }
3260 #ifdef PROCFS_USE_READ_WRITE
3261       pi->saved_entryset.cmd = PCSENTRY;
3262       if (write (pi->ctl_fd, (char *) &pi->saved_entryset,
3263                  sizeof (struct sys_ctl)) < 0)
3264 #else
3265         if (ioctl (pi->ctl_fd, PIOCSENTRY, &pi->saved_entryset.sysset) < 0)
3266 #endif
3267           {
3268             print_sys_errmsg (pi->pathname, errno);
3269             printf_unfiltered ("PIOCSENTRY failed.\n");
3270           }
3271 #ifdef PROCFS_USE_READ_WRITE
3272       pi->saved_trace.cmd = PCSTRACE;
3273       if (write (pi->ctl_fd, (char *) &pi->saved_trace,
3274                  sizeof (struct sig_ctl)) < 0)
3275 #else
3276         if (ioctl (pi->ctl_fd, PIOCSTRACE, &pi->saved_trace.sigset) < 0)
3277 #endif
3278           {
3279             print_sys_errmsg (pi->pathname, errno);
3280             printf_unfiltered ("PIOCSTRACE failed.\n");
3281           }
3282 #ifndef UNIXWARE
3283       if (ioctl (pi->ctl_fd, PIOCSHOLD, &pi->saved_sighold.sigset) < 0)
3284         {
3285           print_sys_errmsg (pi->pathname, errno);
3286           printf_unfiltered ("PIOSCHOLD failed.\n");
3287         }
3288 #endif
3289 #ifdef PROCFS_USE_READ_WRITE
3290       pi->saved_fltset.cmd = PCSFAULT;
3291       if (write (pi->ctl_fd, (char *) &pi->saved_fltset,
3292                  sizeof (struct flt_ctl)) < 0)
3293 #else
3294       if (ioctl (pi->ctl_fd, PIOCSFAULT, &pi->saved_fltset.fltset) < 0)
3295 #endif
3296         {
3297           print_sys_errmsg (pi->pathname, errno);
3298           printf_unfiltered ("PIOCSFAULT failed.\n");
3299         }
3300       if (!procfs_read_status (pi))
3301         {
3302           print_sys_errmsg (pi->pathname, errno);
3303           printf_unfiltered ("procfs_read_status failed.\n");
3304         }
3305       else
3306         {
3307 #ifdef UNIXWARE
3308           if (signal || (pi->prstatus.pr_lwp.pr_flags & (PR_STOPPED | PR_ISTOP)))
3309 #else
3310           if (signal || (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
3311 #endif
3312             {
3313               long cmd;
3314               struct proc_ctl pctl;
3315
3316               if (signal || !pi->was_stopped ||
3317                   query ("Was stopped when attached, make it runnable again? "))
3318                 {
3319                   /* Clear any pending signal if we want to detach without
3320                      a signal.  */
3321                   if (signal == 0)
3322                     set_proc_siginfo (pi, signal);
3323
3324                   /* Clear any fault that might have stopped it.  */
3325 #ifdef PROCFS_USE_READ_WRITE
3326                   cmd = PCCFAULT;
3327                   if (write (pi->ctl_fd, (char *) &cmd, sizeof (long)) < 0)
3328 #else
3329                   if (ioctl (pi->ctl_fd, PIOCCFAULT, 0))
3330 #endif
3331                     {
3332                       print_sys_errmsg (pi->pathname, errno);
3333                       printf_unfiltered ("PIOCCFAULT failed.\n");
3334                     }
3335
3336                   /* Make it run again when we close it.  */
3337
3338                   modify_run_on_last_close_flag (pi->ctl_fd, 1);
3339                 }
3340             }
3341         }
3342       close_proc_file (pi);
3343     }
3344   attach_flag = 0;
3345 }
3346
3347 /*  emulate wait() as much as possible.
3348     Wait for child to do something.  Return pid of child, or -1 in case
3349     of error; store status in *OURSTATUS.
3350
3351     Not sure why we can't
3352     just use wait(), but it seems to have problems when applied to a
3353     process being controlled with the /proc interface.
3354
3355     We have a race problem here with no obvious solution.  We need to let
3356     the inferior run until it stops on an event of interest, which means
3357     that we need to use the PIOCWSTOP ioctl.  However, we cannot use this
3358     ioctl if the process is already stopped on something that is not an
3359     event of interest, or the call will hang indefinitely.  Thus we first
3360     use PIOCSTATUS to see if the process is not stopped.  If not, then we
3361     use PIOCWSTOP.  But during the window between the two, if the process
3362     stops for any reason that is not an event of interest (such as a job
3363     control signal) then gdb will hang.  One possible workaround is to set
3364     an alarm to wake up every minute of so and check to see if the process
3365     is still running, and if so, then reissue the PIOCWSTOP.  But this is
3366     a real kludge, so has not been implemented.  FIXME: investigate
3367     alternatives.
3368
3369     FIXME:  Investigate why wait() seems to have problems with programs
3370     being control by /proc routines.  */
3371 static int
3372 procfs_wait (pid, ourstatus)
3373      int pid;
3374      struct target_waitstatus *ourstatus;
3375 {
3376   short what;
3377   short why;
3378   int statval = 0;
3379   int checkerr = 0;
3380   int rtnval = -1;
3381   struct procinfo *pi;
3382   struct proc_ctl pctl;
3383
3384 scan_again:
3385
3386   /* handle all syscall events first, otherwise we might not
3387      notice a thread was created until too late. */
3388
3389   for (pi = procinfo_list; pi; pi = pi->next)
3390     {
3391       if (!pi->had_event)
3392         continue;
3393
3394 #ifdef UNIXWARE
3395       if (! (pi->prstatus.pr_lwp.pr_flags & (PR_STOPPED | PR_ISTOP)) )
3396         continue;
3397
3398       why = pi->prstatus.pr_lwp.pr_why;
3399       what = pi->prstatus.pr_lwp.pr_what;
3400 #else
3401       if (! (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)) )
3402         continue;
3403
3404       why = pi->prstatus.pr_why;
3405       what = pi->prstatus.pr_what;
3406 #endif
3407       if (why == PR_SYSENTRY || why == PR_SYSEXIT)
3408         {
3409           int i;
3410           int found_handler = 0;
3411
3412           for (i = 0; i < pi->num_syscall_handlers; i++)
3413             if (pi->syscall_handlers[i].syscall_num == what)
3414               {
3415                 found_handler = 1;
3416                 pi->saved_rtnval = pi->pid;
3417                 pi->saved_statval = 0;
3418                 if (!pi->syscall_handlers[i].func
3419                     (pi, what, why, &pi->saved_rtnval, &pi->saved_statval))
3420                   pi->had_event = 0;
3421                 break;
3422               }
3423
3424           if (!found_handler)
3425             {
3426               if (why == PR_SYSENTRY)
3427                 error ("PR_SYSENTRY, unhandled system call %d", what);
3428               else
3429                 error ("PR_SYSEXIT, unhandled system call %d", what);
3430             }
3431         }
3432     }
3433
3434   /* find a relevant process with an event */
3435
3436   for (pi = procinfo_list; pi; pi = pi->next)
3437     if (pi->had_event && (pid == -1 || pi->pid == pid))
3438       break;
3439
3440   if (!pi)
3441     {
3442       wait_fd ();
3443       goto scan_again;
3444     }
3445
3446 #ifdef UNIXWARE
3447   if (!checkerr && !(pi->prstatus.pr_lwp.pr_flags & (PR_STOPPED | PR_ISTOP)))
3448 #else
3449   if (!checkerr && !(pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
3450 #endif
3451     {
3452       if (!procfs_write_pcwstop (pi))
3453         {
3454           checkerr++;
3455         }
3456     }
3457   if (checkerr)
3458     {
3459       if (errno == ENOENT)
3460         {
3461           /* XXX Fixme -- what to do if attached?  Can't call wait... */
3462           rtnval = wait (&statval);
3463           if ((rtnval) != (PIDGET (inferior_pid)))
3464             {
3465               print_sys_errmsg (pi->pathname, errno);
3466               error ("procfs_wait: wait failed, returned %d", rtnval);
3467               /* NOTREACHED */
3468             }
3469         }
3470       else
3471         {
3472           print_sys_errmsg (pi->pathname, errno);
3473           error ("PIOCSTATUS or PIOCWSTOP failed.");
3474           /* NOTREACHED */
3475         }
3476     }
3477 #ifdef UNIXWARE
3478   else if (pi->prstatus.pr_lwp.pr_flags & (PR_STOPPED | PR_ISTOP))
3479 #else
3480   else if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
3481 #endif
3482     {
3483 #ifdef UNIXWARE
3484       rtnval = pi->prstatus.pr_pid;
3485       why = pi->prstatus.pr_lwp.pr_why;
3486       what = pi->prstatus.pr_lwp.pr_what;
3487 #else
3488       rtnval = pi->pid;
3489       why = pi->prstatus.pr_why;
3490       what = pi->prstatus.pr_what;
3491 #endif
3492
3493       switch (why)
3494         {
3495         case PR_SIGNALLED:
3496           statval = (what << 8) | 0177;
3497           break;
3498         case PR_SYSENTRY:
3499         case PR_SYSEXIT:
3500           rtnval = pi->saved_rtnval;
3501           statval = pi->saved_statval;
3502           break;
3503         case PR_REQUESTED:
3504           statval = (SIGSTOP << 8) | 0177;
3505           break;
3506         case PR_JOBCONTROL:
3507           statval = (what << 8) | 0177;
3508           break;
3509         case PR_FAULTED:
3510           switch (what)
3511             {
3512 #ifdef FLTWATCH
3513             case FLTWATCH:
3514               statval = (SIGTRAP << 8) | 0177;
3515               break;
3516 #endif
3517 #ifdef FLTKWATCH
3518             case FLTKWATCH:
3519               statval = (SIGTRAP << 8) | 0177;
3520               break;
3521 #endif
3522 #ifndef FAULTED_USE_SIGINFO
3523               /* Irix, contrary to the documentation, fills in 0 for si_signo.
3524                  Solaris fills in si_signo.  I'm not sure about others.  */
3525             case FLTPRIV:
3526             case FLTILL:
3527               statval = (SIGILL << 8) | 0177;
3528               break;
3529             case FLTBPT:
3530             case FLTTRACE:
3531               statval = (SIGTRAP << 8) | 0177;
3532               break;
3533             case FLTSTACK:
3534             case FLTACCESS:
3535             case FLTBOUNDS:
3536               statval = (SIGSEGV << 8) | 0177;
3537               break;
3538             case FLTIOVF:
3539             case FLTIZDIV:
3540             case FLTFPE:
3541               statval = (SIGFPE << 8) | 0177;
3542               break;
3543             case FLTPAGE:               /* Recoverable page fault */
3544 #endif /* not FAULTED_USE_SIGINFO */
3545             default:
3546               /* Use the signal which the kernel assigns.  This is better than
3547                  trying to second-guess it from the fault.  In fact, I suspect
3548                  that FLTACCESS can be either SIGSEGV or SIGBUS.  */
3549 #ifdef UNIXWARE
3550               statval = ((pi->prstatus.pr_lwp.pr_info.si_signo) << 8) | 0177;
3551 #else
3552               statval = ((pi->prstatus.pr_info.si_signo) << 8) | 0177;
3553 #endif
3554               break;
3555             }
3556           break;
3557         default:
3558           error ("PIOCWSTOP, unknown why %d, what %d", why, what);
3559         }
3560       /* Stop all the other threads when any of them stops.  */
3561
3562       {
3563         struct procinfo *procinfo, *next_pi;
3564
3565         for (procinfo = procinfo_list; procinfo; procinfo = next_pi)
3566           {
3567             next_pi = procinfo->next;
3568             if (!procinfo->had_event)
3569               {
3570 #ifdef PROCFS_USE_READ_WRITE
3571                 long cmd = PCSTOP;
3572                 if (write (pi->ctl_fd, (char *) &cmd, sizeof (long)) < 0)
3573                   {
3574                     print_sys_errmsg (procinfo->pathname, errno);
3575                     error ("PCSTOP failed");
3576                   }
3577 #else
3578                 /* A bug in Solaris (2.5) causes us to hang when trying to
3579                    stop a stopped process.  So, we have to check first in
3580                    order to avoid the hang. */
3581                 if (!procfs_read_status (procinfo))
3582                   {
3583                     /* The LWP has apparently terminated.  */
3584                     if (info_verbose)
3585                       printf_filtered ("LWP %d doesn't respond.\n", 
3586                                        (procinfo->pid >> 16) & 0xffff);
3587                     close_proc_file (procinfo);
3588                     continue;
3589                   }
3590
3591                 if (!(procinfo->prstatus.pr_flags & PR_STOPPED))
3592                   if (ioctl (procinfo->ctl_fd, PIOCSTOP, &procinfo->prstatus)
3593                       < 0)
3594                     {
3595                       print_sys_errmsg (procinfo->pathname, errno);
3596                       warning ("PIOCSTOP failed");
3597                     }
3598 #endif
3599               }
3600           }
3601       }
3602     }
3603   else
3604     {
3605       error ("PIOCWSTOP, stopped for unknown/unhandled reason, flags %#x",
3606 #ifdef UNIXWARE
3607              pi->prstatus.pr_lwp.pr_flags);
3608 #else
3609              pi->prstatus.pr_flags);
3610 #endif
3611     }
3612
3613   store_waitstatus (ourstatus, statval);
3614
3615   if (rtnval == -1)             /* No more children to wait for */
3616     {
3617       warning ("Child process unexpectedly missing");
3618       /* Claim it exited with unknown signal.  */
3619       ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
3620       ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
3621       return rtnval;
3622     }
3623
3624   pi->had_event = 0;            /* Indicate that we've seen this one */
3625   return (rtnval);
3626 }
3627
3628 /*
3629
3630 LOCAL FUNCTION
3631
3632         set_proc_siginfo - set a process's current signal info
3633
3634 SYNOPSIS
3635
3636         void set_proc_siginfo (struct procinfo *pip, int signo);
3637
3638 DESCRIPTION
3639
3640         Given a pointer to a process info struct in PIP and a signal number
3641         in SIGNO, set the process's current signal and its associated signal
3642         information.  The signal will be delivered to the process immediately
3643         after execution is resumed, even if it is being held.  In addition,
3644         this particular delivery will not cause another PR_SIGNALLED stop
3645         even if the signal is being traced.
3646
3647         If we are not delivering the same signal that the prstatus siginfo
3648         struct contains information about, then synthesize a siginfo struct
3649         to match the signal we are doing to deliver, make it of the type
3650         "generated by a user process", and send this synthesized copy.  When
3651         used to set the inferior's signal state, this will be required if we
3652         are not currently stopped because of a traced signal, or if we decide
3653         to continue with a different signal.
3654
3655         Note that when continuing the inferior from a stop due to receipt
3656         of a traced signal, we either have set PRCSIG to clear the existing
3657         signal, or we have to call this function to do a PIOCSSIG with either
3658         the existing siginfo struct from pr_info, or one we have synthesized
3659         appropriately for the signal we want to deliver.  Otherwise if the
3660         signal is still being traced, the inferior will immediately stop
3661         again.
3662
3663         See siginfo(5) for more details.
3664 */
3665
3666 static void
3667 set_proc_siginfo (pip, signo)
3668      struct procinfo *pip;
3669      int signo;
3670 {
3671   struct siginfo newsiginfo;
3672   struct siginfo *sip;
3673   struct sigi_ctl sictl;
3674
3675 #ifdef PROCFS_DONT_PIOCSSIG_CURSIG
3676   /* With Alpha OSF/1 procfs, the kernel gets really confused if it
3677      receives a PIOCSSIG with a signal identical to the current signal,
3678      it messes up the current signal. Work around the kernel bug.  */
3679 #ifdef UNIXWARE
3680   if (signo == pip -> prstatus.pr_lwp.pr_cursig)
3681 #else
3682   if (signo == pip -> prstatus.pr_cursig)
3683 #endif
3684     return;
3685 #endif
3686
3687 #ifdef UNIXWARE
3688   if (signo == pip->prstatus.pr_lwp.pr_info.si_signo)
3689     {
3690       memcpy ((char *) &sictl.siginfo, (char *) &pip->prstatus.pr_lwp.pr_info,
3691                 sizeof (siginfo_t));
3692     }
3693 #else
3694   if (signo == pip -> prstatus.pr_info.si_signo)
3695     {
3696       sip = &pip -> prstatus.pr_info;
3697     }
3698 #endif
3699   else
3700     {
3701 #ifdef UNIXWARE
3702       siginfo_t *sip = &sictl.siginfo;
3703       memset ((char *) sip, 0, sizeof (siginfo_t));
3704 #else
3705       memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
3706       sip = &newsiginfo;
3707 #endif
3708       sip -> si_signo = signo;
3709       sip -> si_code = 0;
3710       sip -> si_errno = 0;
3711       sip -> si_pid = getpid ();
3712       sip -> si_uid = getuid ();
3713     }
3714 #ifdef PROCFS_USE_READ_WRITE
3715   sictl.cmd = PCSSIG;
3716   if (write (pip->ctl_fd, (char *) &sictl, sizeof (struct sigi_ctl)) < 0)
3717 #else
3718   if (ioctl (pip->ctl_fd, PIOCSSIG, sip) < 0)
3719 #endif
3720     {
3721       print_sys_errmsg (pip -> pathname, errno);
3722       warning ("PIOCSSIG failed");
3723     }
3724 }
3725
3726 /* Resume execution of process PID.  If STEP is nozero, then
3727    just single step it.  If SIGNAL is nonzero, restart it with that
3728    signal activated.  */
3729
3730 static void
3731 procfs_resume (pid, step, signo)
3732      int pid;
3733      int step;
3734      enum target_signal signo;
3735 {
3736   int signal_to_pass;
3737   struct procinfo *pi, *procinfo, *next_pi;
3738   struct proc_ctl pctl;
3739
3740   pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
3741
3742   errno = 0;
3743 #ifdef UNIXWARE
3744   pctl.cmd = PCRUN;
3745   pctl.data = PRCFAULT;
3746 #else
3747   pi->prrun.pr_flags = PRSTRACE | PRSFAULT | PRCFAULT;
3748 #endif
3749
3750 #if 0
3751   /* It should not be necessary.  If the user explicitly changes the value,
3752      value_assign calls write_register_bytes, which writes it.  */
3753 /*      It may not be absolutely necessary to specify the PC value for
3754         restarting, but to be safe we use the value that gdb considers
3755         to be current.  One case where this might be necessary is if the
3756         user explicitly changes the PC value that gdb considers to be
3757         current.  FIXME:  Investigate if this is necessary or not.  */
3758
3759 #ifdef PRSVADDR_BROKEN
3760 /* Can't do this under Solaris running on a Sparc, as there seems to be no
3761    place to put nPC.  In fact, if you use this, nPC seems to be set to some
3762    random garbage.  We have to rely on the fact that PC and nPC have been
3763    written previously via PIOCSREG during a register flush. */
3764
3765   pi->prrun.pr_vaddr = (caddr_t) *(int *) &registers[REGISTER_BYTE (PC_REGNUM)];
3766   pi->prrun.pr_flags != PRSVADDR;
3767 #endif
3768 #endif
3769
3770   if (signo == TARGET_SIGNAL_STOP && pi->nopass_next_sigstop)
3771     /* When attaching to a child process, if we forced it to stop with
3772        a PIOCSTOP, then we will have set the nopass_next_sigstop flag.
3773        Upon resuming the first time after such a stop, we explicitly
3774        inhibit sending it another SIGSTOP, which would be the normal
3775        result of default signal handling.  One potential drawback to
3776        this is that we will also ignore any attempt to by the user
3777        to explicitly continue after the attach with a SIGSTOP.  Ultimately
3778        this problem should be dealt with by making the routines that
3779        deal with the inferior a little smarter, and possibly even allow
3780        an inferior to continue running at the same time as gdb.  (FIXME?)  */
3781     signal_to_pass = 0;
3782   else if (signo == TARGET_SIGNAL_TSTP
3783 #ifdef UNIXWARE
3784            && pi->prstatus.pr_lwp.pr_cursig == SIGTSTP
3785            && pi->prstatus.pr_lwp.pr_action.sa_handler == SIG_DFL
3786 #else
3787            && pi->prstatus.pr_cursig == SIGTSTP
3788            && pi->prstatus.pr_action.sa_handler == SIG_DFL
3789 #endif
3790            )
3791
3792     /* We are about to pass the inferior a SIGTSTP whose action is
3793        SIG_DFL.  The SIG_DFL action for a SIGTSTP is to stop
3794        (notifying the parent via wait()), and then keep going from the
3795        same place when the parent is ready for you to keep going.  So
3796        under the debugger, it should do nothing (as if the program had
3797        been stopped and then later resumed.  Under ptrace, this
3798        happens for us, but under /proc, the system obligingly stops
3799        the process, and wait_for_inferior would have no way of
3800        distinguishing that type of stop (which indicates that we
3801        should just start it again), with a stop due to the pr_trace
3802        field of the prrun_t struct.
3803
3804        Note that if the SIGTSTP is being caught, we *do* need to pass it,
3805        because the handler needs to get executed.  */
3806     signal_to_pass = 0;
3807   else
3808     signal_to_pass = target_signal_to_host (signo);
3809
3810   if (signal_to_pass)
3811     {
3812       set_proc_siginfo (pi, signal_to_pass);
3813     }
3814   else
3815     {
3816 #ifdef UNIXWARE
3817       pctl.data |= PRCSIG;
3818 #else
3819       pi->prrun.pr_flags |= PRCSIG;
3820 #endif
3821     }
3822   pi->nopass_next_sigstop = 0;
3823   if (step)
3824     {
3825 #ifdef UNIXWARE
3826       pctl.data |= PRSTEP;
3827 #else
3828       pi->prrun.pr_flags |= PRSTEP;
3829 #endif
3830     }
3831   pi->had_event = 0;
3832   /* Don't try to start a process unless it's stopped on an
3833      `event of interest'.  Doing so will cause errors.  */
3834
3835   if (!procfs_read_status (pi))
3836     {
3837       /* The LWP has apparently terminated.  */
3838       if (info_verbose)
3839         printf_filtered ("LWP %d doesn't respond.\n", 
3840                          (pi->pid >> 16) & 0xffff);
3841       close_proc_file (pi);
3842     }
3843   else
3844     {
3845 #ifdef PROCFS_USE_READ_WRITE
3846       if (write (pi->ctl_fd, (char *) &pctl, sizeof (struct proc_ctl)) < 0)
3847 #else
3848       if ((pi->prstatus.pr_flags & PR_ISTOP)
3849           && ioctl (pi->ctl_fd, PIOCRUN, &pi->prrun) != 0)
3850 #endif
3851         {
3852           /* The LWP has apparently terminated.  */
3853           if (info_verbose)
3854             printf_filtered ("LWP %d doesn't respond.\n", 
3855                              (pi->pid >> 16) & 0xffff);
3856           close_proc_file (pi);
3857         }
3858     }
3859
3860   /* Continue all the other threads that haven't had an event of interest.
3861      Also continue them if they have NOPASS_NEXT_SIGSTOP set; this is only
3862      set by do_attach, and means this is the first resume after an attach.  
3863      All threads were CSTOP'd by do_attach, and should be resumed now.  */
3864
3865   if (pid == -1)
3866     for (procinfo = procinfo_list; procinfo; procinfo = next_pi)
3867       {
3868         next_pi = procinfo->next;
3869         if (pi != procinfo)
3870           if (!procinfo->had_event || 
3871               (procinfo->nopass_next_sigstop && signo == TARGET_SIGNAL_STOP))
3872             {
3873               procinfo->had_event = procinfo->nopass_next_sigstop = 0;
3874 #ifdef PROCFS_USE_READ_WRITE
3875               pctl.data = PRCFAULT | PRCSIG;
3876               if (write (procinfo->ctl_fd, (char *) &pctl,
3877                          sizeof (struct proc_ctl)) < 0)
3878                 {
3879                   if (!procfs_read_status (procinfo))
3880                     fprintf_unfiltered(gdb_stderr, 
3881                                        "procfs_read_status failed, errno=%d\n",
3882                                        errno);
3883                   print_sys_errmsg (procinfo->pathname, errno);
3884                   error ("PCRUN failed");
3885                 }
3886 #else
3887               procinfo->prrun.pr_flags &= PRSTEP;
3888               procinfo->prrun.pr_flags |= PRCFAULT | PRCSIG;
3889               if (!procfs_read_status (procinfo))
3890                 {
3891                   /* The LWP has apparently terminated.  */
3892                   if (info_verbose)
3893                     printf_filtered ("LWP %d doesn't respond.\n", 
3894                                      (procinfo->pid >> 16) & 0xffff);
3895                   close_proc_file (procinfo);
3896                   continue;
3897                 }
3898
3899               /* Don't try to start a process unless it's stopped on an
3900                  `event of interest'.  Doing so will cause errors.  */
3901
3902               if ((procinfo->prstatus.pr_flags & PR_ISTOP)
3903                   && ioctl (procinfo->ctl_fd, PIOCRUN, &procinfo->prrun) < 0)
3904                 {
3905                   if (!procfs_read_status (procinfo))
3906                     fprintf_unfiltered(gdb_stderr, 
3907                                        "procfs_read_status failed, errno=%d\n",
3908                                        errno);
3909                   print_sys_errmsg (procinfo->pathname, errno);
3910                   warning ("PIOCRUN failed");
3911                 }
3912 #endif
3913             }
3914         procfs_read_status (procinfo);
3915       }
3916 }
3917
3918 /*
3919
3920 LOCAL FUNCTION
3921
3922         procfs_fetch_registers -- fetch current registers from inferior
3923
3924 SYNOPSIS
3925
3926         void procfs_fetch_registers (int regno)
3927
3928 DESCRIPTION
3929
3930         Read the current values of the inferior's registers, both the
3931         general register set and floating point registers (if supported)
3932         and update gdb's idea of their current values.
3933
3934 */
3935
3936 static void
3937 procfs_fetch_registers (regno)
3938      int regno;
3939 {
3940   struct procinfo *pi;
3941
3942   pi = current_procinfo;
3943
3944 #ifdef UNIXWARE
3945   if (procfs_read_status (pi))
3946     {
3947       supply_gregset (&pi->prstatus.pr_lwp.pr_context.uc_mcontext.gregs);
3948 #if defined (FP0_REGNUM)
3949       supply_fpregset (&pi->prstatus.pr_lwp.pr_context.uc_mcontext.fpregs); 
3950 #endif
3951     }
3952 #else /* UNIXWARE */
3953   if (ioctl (pi->ctl_fd, PIOCGREG, &pi->gregset.gregset) != -1)
3954     {
3955       supply_gregset (&pi->gregset.gregset);
3956     }
3957 #if defined (FP0_REGNUM)
3958   if (ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset.fpregset) != -1)
3959     {
3960       supply_fpregset (&pi->fpregset.fpregset);
3961     }
3962 #endif
3963 #endif /* UNIXWARE */
3964 }
3965
3966 /*
3967
3968 LOCAL FUNCTION
3969
3970         proc_init_failed - called when /proc access initialization fails
3971 fails
3972
3973 SYNOPSIS
3974
3975         static void proc_init_failed (struct procinfo *pi, 
3976                                       char *why, int kill_p)
3977
3978 DESCRIPTION
3979
3980         This function is called whenever initialization of access to a /proc
3981         entry fails.  It prints a suitable error message, does some cleanup,
3982         and then invokes the standard error processing routine which dumps
3983         us back into the command loop.  If KILL_P is true, sends SIGKILL.
3984  */
3985
3986 static void
3987 proc_init_failed (pi, why, kill_p)
3988      struct procinfo *pi;
3989      char *why;
3990      int  kill_p;
3991 {
3992   print_sys_errmsg (pi->pathname, errno);
3993   if (kill_p)
3994     kill (pi->pid, SIGKILL);
3995   close_proc_file (pi);
3996   error (why);
3997   /* NOTREACHED */
3998 }
3999
4000 /*
4001
4002 LOCAL FUNCTION
4003
4004         close_proc_file - close any currently open /proc entry
4005
4006 SYNOPSIS
4007
4008         static void close_proc_file (struct procinfo *pip)
4009
4010 DESCRIPTION
4011
4012         Close any currently open /proc entry and mark the process information
4013         entry as invalid.  In order to ensure that we don't try to reuse any
4014         stale information, the pid, fd, and pathnames are explicitly
4015         invalidated, which may be overkill.
4016
4017  */
4018
4019 static void
4020 close_proc_file (pip)
4021      struct procinfo *pip;
4022 {
4023   struct procinfo *procinfo;
4024
4025   delete_thread (pip->pid);     /* remove thread from GDB's thread list */
4026   remove_fd (pip);              /* Remove fd from poll/select list */
4027
4028   close (pip->ctl_fd);
4029 #ifdef HAVE_MULTIPLE_PROC_FDS
4030   close (pip->as_fd);
4031   close (pip->status_fd);
4032   close (pip->map_fd);
4033 #endif
4034
4035   free (pip -> pathname);
4036
4037   /* Unlink pip from the procinfo chain.  Note pip might not be on the list. */
4038
4039   if (procinfo_list == pip)
4040     procinfo_list = pip->next;
4041   else
4042     {
4043       for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
4044         {
4045           if (procinfo->next == pip)
4046             {
4047               procinfo->next = pip->next;
4048               break;
4049             }
4050         }
4051       free (pip);
4052     }
4053 }
4054
4055 /*
4056
4057 LOCAL FUNCTION
4058
4059         open_proc_file - open a /proc entry for a given process id
4060
4061 SYNOPSIS
4062
4063         static int open_proc_file (int pid, struct procinfo *pip, int mode)
4064
4065 DESCRIPTION
4066
4067         Given a process id and a mode, close the existing open /proc
4068         entry (if any) and open one for the new process id, in the
4069         specified mode.  Once it is open, then mark the local process
4070         information structure as valid, which guarantees that the pid,
4071         fd, and pathname fields match an open /proc entry.  Returns
4072         zero if the open fails, nonzero otherwise.
4073
4074         Note that the pathname is left intact, even when the open fails,
4075         so that callers can use it to construct meaningful error messages
4076         rather than just "file open failed".
4077
4078         Note that for Solaris, the process-id also includes an LWP-id, so we
4079         actually attempt to open that.  If we are handed a pid with a 0 LWP-id,
4080         then we will ask the kernel what it is and add it to the pid.  Hence,
4081         the pid can be changed by us.
4082  */
4083
4084 static int
4085 open_proc_file (pid, pip, mode, control)
4086      int pid;
4087      struct procinfo *pip;
4088      int mode;
4089      int control;
4090 {
4091   int tmp, tmpfd;
4092
4093   pip -> next = NULL;
4094   pip -> had_event = 0;
4095   pip -> pathname = xmalloc (MAX_PROC_NAME_SIZE);
4096   pip -> pid = pid;
4097
4098 #ifndef PIOCOPENLWP
4099   tmp = pid;
4100 #else
4101   tmp = pid & 0xffff;
4102 #endif
4103
4104 #ifdef HAVE_MULTIPLE_PROC_FDS
4105   sprintf (pip->pathname, STATUS_PROC_NAME_FMT, tmp);
4106   if ((pip->status_fd = open (pip->pathname, O_RDONLY)) < 0)
4107     {
4108       return 0;
4109     }
4110
4111   sprintf (pip->pathname, AS_PROC_NAME_FMT, tmp);
4112   if ((pip->as_fd = open (pip->pathname, O_RDWR)) < 0)
4113     {
4114       close (pip->status_fd);
4115       return 0;
4116     }
4117
4118   sprintf (pip->pathname, MAP_PROC_NAME_FMT, tmp);
4119   if ((pip->map_fd = open (pip->pathname, O_RDONLY)) < 0)
4120     {
4121       close (pip->status_fd);
4122       close (pip->as_fd);
4123       return 0;
4124     }
4125
4126   sprintf (pip->pathname, MAP_PROC_NAME_FMT, tmp);
4127   if ((pip->map_fd = open (pip->pathname, O_RDONLY)) < 0)
4128     {
4129       close (pip->status_fd);
4130       close (pip->as_fd);
4131       return 0;
4132     }
4133
4134   if (control)
4135     {
4136       sprintf (pip->pathname, CTL_PROC_NAME_FMT, tmp);
4137       if ((pip->ctl_fd = open (pip->pathname, O_WRONLY)) < 0)
4138         {
4139           close (pip->status_fd);
4140           close (pip->as_fd);
4141           close (pip->map_fd);
4142           return 0;
4143         }
4144     }
4145
4146 #else /* HAVE_MULTIPLE_PROC_FDS */
4147   sprintf (pip -> pathname, CTL_PROC_NAME_FMT, tmp);
4148
4149   if ((tmpfd = open (pip -> pathname, mode)) < 0)
4150     return 0;
4151
4152 #ifndef PIOCOPENLWP
4153     pip -> ctl_fd = tmpfd;
4154     pip -> as_fd = tmpfd;
4155     pip -> map_fd = tmpfd;
4156     pip -> status_fd = tmpfd;
4157 #else
4158   tmp = (pid >> 16) & 0xffff;   /* Extract thread id */
4159
4160   if (tmp == 0)
4161     {                           /* Don't know thread id yet */
4162       if (ioctl (tmpfd, PIOCSTATUS, &pip -> prstatus) < 0)
4163         {
4164           print_sys_errmsg (pip -> pathname, errno);
4165           close (tmpfd);
4166           error ("open_proc_file: PIOCSTATUS failed");
4167         }
4168
4169       tmp = pip -> prstatus.pr_who; /* Get thread id from prstatus_t */
4170       pip -> pid = (tmp << 16) | pid; /* Update pip */
4171     }
4172
4173   if ((pip -> ctl_fd = ioctl (tmpfd, PIOCOPENLWP, &tmp)) < 0)
4174     {
4175       close (tmpfd);
4176       return 0;
4177     }
4178
4179 #ifdef PIOCSET                  /* New method */
4180   {
4181       long pr_flags;
4182       pr_flags = PR_ASYNC;
4183       ioctl (pip -> ctl_fd, PIOCSET, &pr_flags);
4184   }
4185 #endif
4186
4187   /* keep extra fds in sync */
4188   pip->as_fd = pip->ctl_fd;
4189   pip->map_fd = pip->ctl_fd;
4190   pip->status_fd = pip->ctl_fd;
4191
4192   close (tmpfd);                /* All done with main pid */
4193 #endif  /* PIOCOPENLWP */
4194
4195 #endif /* HAVE_MULTIPLE_PROC_FDS */
4196
4197   return 1;
4198 }
4199
4200 static char *
4201 mappingflags (flags)
4202      long flags;
4203 {
4204   static char asciiflags[8];
4205   
4206   strcpy (asciiflags, "-------");
4207 #if defined (MA_PHYS)
4208   if (flags & MA_PHYS)   asciiflags[0] = 'd';
4209 #endif
4210   if (flags & MA_STACK)  asciiflags[1] = 's';
4211   if (flags & MA_BREAK)  asciiflags[2] = 'b';
4212   if (flags & MA_SHARED) asciiflags[3] = 's';
4213   if (flags & MA_READ)   asciiflags[4] = 'r';
4214   if (flags & MA_WRITE)  asciiflags[5] = 'w';
4215   if (flags & MA_EXEC)   asciiflags[6] = 'x';
4216   return (asciiflags);
4217 }
4218
4219 static void
4220 info_proc_flags (pip, summary)
4221      struct procinfo *pip;
4222      int summary;
4223 {
4224   struct trans *transp;
4225 #ifdef UNIXWARE
4226   long flags = pip->prstatus.pr_flags | pip->prstatus.pr_lwp.pr_flags;
4227 #else
4228   long flags = pip->prstatus.pr_flags;
4229 #endif
4230
4231   printf_filtered ("%-32s", "Process status flags:");
4232   if (!summary)
4233     {
4234       printf_filtered ("\n\n");
4235     }
4236   for (transp = pr_flag_table; transp -> name != NULL; transp++)
4237     {
4238       if (flags & transp -> value)
4239         {
4240           if (summary)
4241             {
4242               printf_filtered ("%s ", transp -> name);
4243             }
4244           else
4245             {
4246               printf_filtered ("\t%-16s %s.\n", transp -> name, transp -> desc);
4247             }
4248         }
4249     }
4250   printf_filtered ("\n");
4251 }
4252
4253 static void
4254 info_proc_stop (pip, summary)
4255      struct procinfo *pip;
4256      int summary;
4257 {
4258   struct trans *transp;
4259   int why;
4260   int what;
4261
4262 #ifdef UNIXWARE
4263   why = pip -> prstatus.pr_lwp.pr_why;
4264   what = pip -> prstatus.pr_lwp.pr_what;
4265 #else
4266   why = pip -> prstatus.pr_why;
4267   what = pip -> prstatus.pr_what;
4268 #endif
4269
4270 #ifdef UNIXWARE
4271   if (pip -> prstatus.pr_lwp.pr_flags & PR_STOPPED)
4272 #else
4273   if (pip -> prstatus.pr_flags & PR_STOPPED)
4274 #endif
4275     {
4276       printf_filtered ("%-32s", "Reason for stopping:");
4277       if (!summary)
4278         {
4279           printf_filtered ("\n\n");
4280         }
4281       for (transp = pr_why_table; transp -> name != NULL; transp++)
4282         {
4283           if (why == transp -> value)
4284             {
4285               if (summary)
4286                 {
4287                   printf_filtered ("%s ", transp -> name);
4288                 }
4289               else
4290                 {
4291                   printf_filtered ("\t%-16s %s.\n",
4292                                    transp -> name, transp -> desc);
4293                 }
4294               break;
4295             }
4296         }
4297       
4298       /* Use the pr_why field to determine what the pr_what field means, and
4299          print more information. */
4300       
4301       switch (why)
4302         {
4303           case PR_REQUESTED:
4304             /* pr_what is unused for this case */
4305             break;
4306           case PR_JOBCONTROL:
4307           case PR_SIGNALLED:
4308             if (summary)
4309               {
4310                 printf_filtered ("%s ", signalname (what));
4311               }
4312             else
4313               {
4314                 printf_filtered ("\t%-16s %s.\n", signalname (what),
4315                                  safe_strsignal (what));
4316               }
4317             break;
4318           case PR_SYSENTRY:
4319             if (summary)
4320               {
4321                 printf_filtered ("%s ", syscallname (what));
4322               }
4323             else
4324               {
4325                 printf_filtered ("\t%-16s %s.\n", syscallname (what),
4326                                  "Entered this system call");
4327               }
4328             break;
4329           case PR_SYSEXIT:
4330             if (summary)
4331               {
4332                 printf_filtered ("%s ", syscallname (what));
4333               }
4334             else
4335               {
4336                 printf_filtered ("\t%-16s %s.\n", syscallname (what),
4337                                  "Returned from this system call");
4338               }
4339             break;
4340           case PR_FAULTED:
4341             if (summary)
4342               {
4343                 printf_filtered ("%s ",
4344                                  lookupname (faults_table, what, "fault"));
4345               }
4346             else
4347               {
4348                 printf_filtered ("\t%-16s %s.\n",
4349                                  lookupname (faults_table, what, "fault"),
4350                                  lookupdesc (faults_table, what));
4351               }
4352             break;
4353           }
4354       printf_filtered ("\n");
4355     }
4356 }
4357
4358 static void
4359 info_proc_siginfo (pip, summary)
4360      struct procinfo *pip;
4361      int summary;
4362 {
4363   struct siginfo *sip;
4364
4365 #ifdef UNIXWARE
4366   if ((pip -> prstatus.pr_lwp.pr_flags & PR_STOPPED) &&
4367       (pip -> prstatus.pr_lwp.pr_why == PR_SIGNALLED ||
4368        pip -> prstatus.pr_lwp.pr_why == PR_FAULTED))
4369 #else
4370   if ((pip -> prstatus.pr_flags & PR_STOPPED) &&
4371       (pip -> prstatus.pr_why == PR_SIGNALLED ||
4372        pip -> prstatus.pr_why == PR_FAULTED))
4373 #endif
4374     {
4375       printf_filtered ("%-32s", "Additional signal/fault info:");
4376 #ifdef UNIXWARE
4377       sip = &pip -> prstatus.pr_lwp.pr_info;
4378 #else
4379       sip = &pip -> prstatus.pr_info;
4380 #endif
4381       if (summary)
4382         {
4383           printf_filtered ("%s ", signalname (sip -> si_signo));
4384           if (sip -> si_errno > 0)
4385             {
4386               printf_filtered ("%s ", errnoname (sip -> si_errno));
4387             }
4388           if (sip -> si_code <= 0)
4389             {
4390               printf_filtered ("sent by %s, uid %d ",
4391                                target_pid_to_str (sip -> si_pid),
4392                                sip -> si_uid);
4393             }
4394           else
4395             {
4396               printf_filtered ("%s ", sigcodename (sip));
4397               if ((sip -> si_signo == SIGILL) ||
4398                   (sip -> si_signo == SIGFPE) ||
4399                   (sip -> si_signo == SIGSEGV) ||
4400                   (sip -> si_signo == SIGBUS))
4401                 {
4402                   printf_filtered ("addr=%#lx ",
4403                                    (unsigned long) sip -> si_addr);
4404                 }
4405               else if ((sip -> si_signo == SIGCHLD))
4406                 {
4407                   printf_filtered ("child %s, status %u ",
4408                                    target_pid_to_str (sip -> si_pid),
4409                                    sip -> si_status);
4410                 }
4411               else if ((sip -> si_signo == SIGPOLL))
4412                 {
4413                   printf_filtered ("band %u ", sip -> si_band);
4414                 }
4415             }
4416         }
4417       else
4418         {
4419           printf_filtered ("\n\n");
4420           printf_filtered ("\t%-16s %s.\n", signalname (sip -> si_signo),
4421                            safe_strsignal (sip -> si_signo));
4422           if (sip -> si_errno > 0)
4423             {
4424               printf_filtered ("\t%-16s %s.\n",
4425                                errnoname (sip -> si_errno),
4426                                safe_strerror (sip -> si_errno));
4427             }
4428           if (sip -> si_code <= 0)
4429             {
4430               printf_filtered ("\t%-16u %s\n", sip -> si_pid, /* XXX need target_pid_to_str() */
4431                                "PID of process sending signal");
4432               printf_filtered ("\t%-16u %s\n", sip -> si_uid,
4433                                "UID of process sending signal");
4434             }
4435           else
4436             {
4437               printf_filtered ("\t%-16s %s.\n", sigcodename (sip),
4438                                sigcodedesc (sip));
4439               if ((sip -> si_signo == SIGILL) ||
4440                   (sip -> si_signo == SIGFPE))
4441                 {
4442                   printf_filtered ("\t%#-16lx %s.\n",
4443                                    (unsigned long) sip -> si_addr,
4444                                    "Address of faulting instruction");
4445                 }
4446               else if ((sip -> si_signo == SIGSEGV) ||
4447                        (sip -> si_signo == SIGBUS))
4448                 {
4449                   printf_filtered ("\t%#-16lx %s.\n",
4450                                    (unsigned long) sip -> si_addr,
4451                                    "Address of faulting memory reference");
4452                 }
4453               else if ((sip -> si_signo == SIGCHLD))
4454                 {
4455                   printf_filtered ("\t%-16u %s.\n", sip -> si_pid, /* XXX need target_pid_to_str() */
4456                                    "Child process ID");
4457                   printf_filtered ("\t%-16u %s.\n", sip -> si_status,
4458                                    "Child process exit value or signal");
4459                 }
4460               else if ((sip -> si_signo == SIGPOLL))
4461                 {
4462                   printf_filtered ("\t%-16u %s.\n", sip -> si_band,
4463                                    "Band event for POLL_{IN,OUT,MSG}");
4464                 }
4465             }
4466         }
4467       printf_filtered ("\n");
4468     }
4469 }
4470
4471 static void
4472 info_proc_syscalls (pip, summary)
4473      struct procinfo *pip;
4474      int summary;
4475 {
4476   int syscallnum;
4477
4478   if (!summary)
4479     {
4480
4481 #if 0   /* FIXME:  Needs to use gdb-wide configured info about system calls. */
4482       if (pip -> prstatus.pr_flags & PR_ASLEEP)
4483         {
4484           int syscallnum = pip -> prstatus.pr_reg[R_D0];
4485           if (summary)
4486             {
4487               printf_filtered ("%-32s", "Sleeping in system call:");
4488               printf_filtered ("%s", syscallname (syscallnum));
4489             }
4490           else
4491             {
4492               printf_filtered ("Sleeping in system call '%s'.\n",
4493                                syscallname (syscallnum));
4494             }
4495         }
4496 #endif
4497
4498 #ifndef UNIXWARE
4499       if (ioctl (pip -> ctl_fd, PIOCGENTRY, &pip -> entryset) < 0)
4500         {
4501           print_sys_errmsg (pip -> pathname, errno);
4502           error ("PIOCGENTRY failed");
4503         }
4504       
4505       if (ioctl (pip -> ctl_fd, PIOCGEXIT, &pip -> exitset) < 0)
4506         {
4507           print_sys_errmsg (pip -> pathname, errno);
4508           error ("PIOCGEXIT failed");
4509         }
4510 #endif
4511       
4512       printf_filtered ("System call tracing information:\n\n");
4513       
4514       printf_filtered ("\t%-12s %-8s %-8s\n",
4515                        "System call",
4516                        "Entry",
4517                        "Exit");
4518       for (syscallnum = 0; syscallnum < MAX_SYSCALLS; syscallnum++)
4519         {
4520           QUIT;
4521           if (syscall_table[syscallnum] != NULL)
4522             printf_filtered ("\t%-12s ", syscall_table[syscallnum]);
4523           else
4524             printf_filtered ("\t%-12d ", syscallnum);
4525
4526 #ifdef UNIXWARE
4527           printf_filtered ("%-8s ",
4528                            prismember (&pip->prstatus.pr_sysentry, syscallnum)
4529                            ? "on" : "off");
4530           printf_filtered ("%-8s ",
4531                            prismember (&pip->prstatus.pr_sysexit, syscallnum)
4532                            ? "on" : "off");
4533 #else
4534           printf_filtered ("%-8s ",
4535                            prismember (&pip -> entryset, syscallnum)
4536                            ? "on" : "off");
4537           printf_filtered ("%-8s ",
4538                            prismember (&pip -> exitset, syscallnum)
4539                            ? "on" : "off");
4540 #endif
4541           printf_filtered ("\n");
4542         }
4543       printf_filtered ("\n");
4544     }
4545 }
4546
4547 static char *
4548 signalname (signo)
4549      int signo;
4550 {
4551   const char *name;
4552   static char locbuf[32];
4553
4554   name = strsigno (signo);
4555   if (name == NULL)
4556     {
4557       sprintf (locbuf, "Signal %d", signo);
4558     }
4559   else
4560     {
4561       sprintf (locbuf, "%s (%d)", name, signo);
4562     }
4563   return (locbuf);
4564 }
4565
4566 static char *
4567 errnoname (errnum)
4568      int errnum;
4569 {
4570   const char *name;
4571   static char locbuf[32];
4572
4573   name = strerrno (errnum);
4574   if (name == NULL)
4575     {
4576       sprintf (locbuf, "Errno %d", errnum);
4577     }
4578   else
4579     {
4580       sprintf (locbuf, "%s (%d)", name, errnum);
4581     }
4582   return (locbuf);
4583 }
4584
4585 static void
4586 info_proc_signals (pip, summary)
4587      struct procinfo *pip;
4588      int summary;
4589 {
4590   int signo;
4591
4592   if (!summary)
4593     {
4594 #ifndef PROCFS_USE_READ_WRITE
4595       if (ioctl (pip -> ctl_fd, PIOCGTRACE, &pip -> trace) < 0)
4596         {
4597           print_sys_errmsg (pip -> pathname, errno);
4598           error ("PIOCGTRACE failed");
4599         }
4600 #endif
4601       
4602       printf_filtered ("Disposition of signals:\n\n");
4603       printf_filtered ("\t%-15s %-8s %-8s %-8s  %s\n\n",
4604                        "Signal", "Trace", "Hold", "Pending", "Description");
4605       for (signo = 0; signo < NSIG; signo++)
4606         {
4607           QUIT;
4608           printf_filtered ("\t%-15s ", signalname (signo));
4609 #ifdef UNIXWARE
4610           printf_filtered ("%-8s ",
4611                            prismember (&pip -> prstatus.pr_sigtrace, signo)
4612                            ? "on" : "off");
4613           printf_filtered ("%-8s ",
4614                            prismember (&pip -> prstatus.pr_lwp.pr_context.uc_sigmask, signo)
4615                            ? "on" : "off");
4616 #else
4617           printf_filtered ("%-8s ",
4618                            prismember (&pip -> trace, signo)
4619                            ? "on" : "off");
4620           printf_filtered ("%-8s ",
4621                            prismember (&pip -> prstatus.pr_sighold, signo)
4622                            ? "on" : "off");
4623 #endif
4624
4625 #ifdef UNIXWARE
4626           if (prismember (&pip->prstatus.pr_sigpend, signo) ||
4627                 prismember (&pip->prstatus.pr_lwp.pr_lwppend, signo))
4628             printf_filtered("%-8s ", "yes");
4629           else
4630             printf_filtered("%-8s ", "no");
4631 #else /* UNIXWARE */
4632 #ifdef PROCFS_SIGPEND_OFFSET
4633           /* Alpha OSF/1 numbers the pending signals from 1.  */
4634           printf_filtered ("%-8s ",
4635                            (signo ? prismember (&pip -> prstatus.pr_sigpend,
4636                                                 signo - 1)
4637                                   : 0)
4638                            ? "yes" : "no");
4639 #else
4640           printf_filtered ("%-8s ",
4641                            prismember (&pip -> prstatus.pr_sigpend, signo)
4642                            ? "yes" : "no");
4643 #endif
4644 #endif /* UNIXWARE */
4645           printf_filtered (" %s\n", safe_strsignal (signo));
4646         }
4647       printf_filtered ("\n");
4648     }
4649 }
4650
4651 static void
4652 info_proc_faults (pip, summary)
4653      struct procinfo *pip;
4654      int summary;
4655 {
4656   struct trans *transp;
4657
4658   if (!summary)
4659     {
4660 #ifndef UNIXWARE
4661       if (ioctl (pip -> ctl_fd, PIOCGFAULT, &pip->fltset.fltset) < 0)
4662         {
4663           print_sys_errmsg (pip -> pathname, errno);
4664           error ("PIOCGFAULT failed");
4665         }
4666 #endif
4667       
4668       printf_filtered ("Current traced hardware fault set:\n\n");
4669       printf_filtered ("\t%-12s %-8s\n", "Fault", "Trace");
4670
4671       for (transp = faults_table; transp -> name != NULL; transp++)
4672         {
4673           QUIT;
4674           printf_filtered ("\t%-12s ", transp -> name);
4675 #ifdef UNIXWARE
4676           printf_filtered ("%-8s", prismember (&pip->prstatus.pr_flttrace, transp -> value)
4677                            ? "on" : "off");
4678 #else
4679           printf_filtered ("%-8s", prismember (&pip->fltset.fltset, transp -> value)
4680                            ? "on" : "off");
4681 #endif
4682           printf_filtered ("\n");
4683         }
4684       printf_filtered ("\n");
4685     }
4686 }
4687
4688 static void
4689 info_proc_mappings (pip, summary)
4690      struct procinfo *pip;
4691      int summary;
4692 {
4693   int nmap;
4694   struct prmap *prmaps;
4695   struct prmap *prmap;
4696   struct stat sbuf;
4697
4698   if (!summary)
4699     {
4700       printf_filtered ("Mapped address spaces:\n\n");
4701 #ifdef BFD_HOST_64_BIT
4702       printf_filtered ("  %18s %18s %10s %10s %7s\n",
4703 #else
4704       printf_filtered ("\t%10s %10s %10s %10s %7s\n",
4705 #endif
4706                        "Start Addr",
4707                        "  End Addr",
4708                        "      Size",
4709                        "    Offset",
4710                        "Flags");
4711 #ifdef PROCFS_USE_READ_WRITE
4712       if (fstat (pip->map_fd, &sbuf) == 0)
4713         {
4714           nmap = sbuf.st_size / sizeof (prmap_t);
4715           prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
4716           if ((lseek (pip->map_fd, 0, SEEK_SET) == 0) &&
4717                 (read (pip->map_fd, (char *) prmaps,
4718                 nmap * sizeof (*prmaps)) == (nmap * sizeof (*prmaps))))
4719             {
4720               int i = 0;
4721               for (prmap = prmaps; i < nmap; ++prmap, ++i)
4722 #else
4723       if (ioctl (pip -> ctl_fd, PIOCNMAP, &nmap) == 0)
4724         {
4725           prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
4726           if (ioctl (pip -> ctl_fd, PIOCMAP, prmaps) == 0)
4727             {
4728               for (prmap = prmaps; prmap -> pr_size; ++prmap)
4729 #endif /* PROCFS_USE_READ_WRITE */
4730                 {
4731 #ifdef BFD_HOST_64_BIT
4732                   printf_filtered ("  %#18lx %#18lx %#10x %#10x %7s\n",
4733 #else
4734                   printf_filtered ("\t%#10lx %#10lx %#10x %#10x %7s\n",
4735 #endif
4736                                    (unsigned long)prmap -> pr_vaddr,
4737                                    (unsigned long)prmap -> pr_vaddr
4738                                      + prmap -> pr_size - 1,
4739                                    prmap -> pr_size,
4740                                    prmap -> pr_off,
4741                                    mappingflags (prmap -> pr_mflags));
4742                 }
4743             }
4744         }
4745       printf_filtered ("\n");
4746     }
4747 }
4748
4749 /*
4750
4751 LOCAL FUNCTION
4752
4753         info_proc -- implement the "info proc" command
4754
4755 SYNOPSIS
4756
4757         void info_proc (char *args, int from_tty)
4758
4759 DESCRIPTION
4760
4761         Implement gdb's "info proc" command by using the /proc interface
4762         to print status information about any currently running process.
4763
4764         Examples of the use of "info proc" are:
4765
4766         info proc               (prints summary info for current inferior)
4767         info proc 123           (prints summary info for process with pid 123)
4768         info proc mappings      (prints address mappings)
4769         info proc times         (prints process/children times)
4770         info proc id            (prints pid, ppid, gid, sid, etc)
4771                 FIXME:  i proc id not implemented.
4772         info proc status        (prints general process state info)
4773                 FIXME:  i proc status not implemented.
4774         info proc signals       (prints info about signal handling)
4775         info proc all           (prints all info)
4776
4777  */
4778
4779 static void
4780 info_proc (args, from_tty)
4781      char *args;
4782      int from_tty;
4783 {
4784   int pid;
4785   struct procinfo *pip;
4786   struct cleanup *old_chain;
4787   char **argv;
4788   int argsize;
4789   int summary = 1;
4790   int flags = 0;
4791   int syscalls = 0;
4792   int signals = 0;
4793   int faults = 0;
4794   int mappings = 0;
4795   int times = 0;
4796   int id = 0;
4797   int status = 0;
4798   int all = 0;
4799   int nlwp;
4800   int *lwps;
4801
4802   old_chain = make_cleanup (null_cleanup, 0);
4803
4804   /* Default to using the current inferior if no pid specified.  Note
4805      that inferior_pid may be 0, hence we set okerr.  */
4806
4807   pid = inferior_pid & 0x7fffffff;              /* strip off sol-thread bit */
4808   if (!(pip = find_procinfo (pid, 1)))          /* inferior_pid no good?  */
4809     pip = procinfo_list;                        /* take first available */
4810   pid = pid & 0xffff;                           /* extract "real" pid */
4811
4812   if (args != NULL)
4813     {
4814       if ((argv = buildargv (args)) == NULL)
4815         {
4816           nomem (0);
4817         }
4818       make_cleanup (freeargv, (char *) argv);
4819
4820       while (*argv != NULL)
4821         {
4822           argsize = strlen (*argv);
4823           if (argsize >= 1 && strncmp (*argv, "all", argsize) == 0)
4824             {
4825               summary = 0;
4826               all = 1;
4827             }
4828           else if (argsize >= 2 && strncmp (*argv, "faults", argsize) == 0)
4829             {
4830               summary = 0;
4831               faults = 1;
4832             }
4833           else if (argsize >= 2 && strncmp (*argv, "flags", argsize) == 0)
4834             {
4835               summary = 0;
4836               flags = 1;
4837             }
4838           else if (argsize >= 1 && strncmp (*argv, "id", argsize) == 0)
4839             {
4840               summary = 0;
4841               id = 1;
4842             }
4843           else if (argsize >= 1 && strncmp (*argv, "mappings", argsize) == 0)
4844             {
4845               summary = 0;
4846               mappings = 1;
4847             }
4848           else if (argsize >= 2 && strncmp (*argv, "signals", argsize) == 0)
4849             {
4850               summary = 0;
4851               signals = 1;
4852             }
4853           else if (argsize >= 2 && strncmp (*argv, "status", argsize) == 0)
4854             {
4855               summary = 0;
4856               status = 1;
4857             }
4858           else if (argsize >= 2 && strncmp (*argv, "syscalls", argsize) == 0)
4859             {
4860               summary = 0;
4861               syscalls = 1;
4862             }
4863           else if (argsize >= 1 && strncmp (*argv, "times", argsize) == 0)
4864             {
4865               summary = 0;
4866               times = 1;
4867             }
4868           else if ((pid = atoi (*argv)) > 0)
4869             {
4870               pip = (struct procinfo *) xmalloc (sizeof (struct procinfo));
4871               memset (pip, 0, sizeof (*pip));
4872
4873               pip->pid = pid;
4874               if (!open_proc_file (pid, pip, O_RDONLY, 0))
4875                 {
4876                   perror_with_name (pip -> pathname);
4877                   /* NOTREACHED */
4878                 }
4879               pid = pip->pid;
4880               make_cleanup (close_proc_file, pip);
4881             }
4882           else if (**argv != '\000')
4883             {
4884               error ("Unrecognized or ambiguous keyword `%s'.", *argv);
4885             }
4886           argv++;
4887         }
4888     }
4889
4890   /* If we don't have a valid open process at this point, then we have no
4891      inferior or didn't specify a specific pid. */
4892
4893   if (!pip)
4894     {
4895       error ("\
4896 No process.  Start debugging a program or specify an explicit process ID.");
4897     }
4898
4899   if (!procfs_read_status (pip))
4900     {
4901       print_sys_errmsg (pip -> pathname, errno);
4902       error ("procfs_read_status failed");
4903     }
4904
4905 #ifndef PROCFS_USE_READ_WRITE
4906 #ifdef PIOCLWPIDS
4907   nlwp = pip->prstatus.pr_nlwp;
4908   lwps = alloca ((2 * nlwp + 2) * sizeof (*lwps));
4909
4910   if (ioctl (pip->ctl_fd, PIOCLWPIDS, lwps))
4911     {
4912       print_sys_errmsg (pip -> pathname, errno);
4913       error ("PIOCLWPIDS failed");
4914     }
4915 #else /* PIOCLWPIDS */
4916   nlwp = 1;
4917   lwps = alloca ((2 * nlwp + 2) * sizeof *lwps);
4918   lwps[0] = 0;
4919 #endif /* PIOCLWPIDS */
4920
4921   for (; nlwp > 0; nlwp--, lwps++)
4922     {
4923       pip = find_procinfo ((*lwps << 16) | pid, 1);
4924
4925       if (!pip)
4926         {
4927           pip = (struct procinfo *) xmalloc (sizeof (struct procinfo));
4928           memset (pip, 0, sizeof (*pip));
4929           if (!open_proc_file ((*lwps << 16) | pid, pip, O_RDONLY, 0))
4930             continue;
4931
4932           make_cleanup (close_proc_file, pip);
4933
4934           if (!procfs_read_status (pip))
4935             {
4936               print_sys_errmsg (pip -> pathname, errno);
4937               error ("procfs_read_status failed");
4938             }
4939         }
4940
4941 #endif /* PROCFS_USE_READ_WRITE */
4942
4943       /* Print verbose information of the requested type(s), or just a summary
4944          of the information for all types. */
4945
4946       printf_filtered ("\nInformation for %s.%d:\n\n", pip -> pathname, *lwps);
4947       if (summary || all || flags)
4948         {
4949           info_proc_flags (pip, summary);
4950         }
4951       if (summary || all)
4952         {
4953           info_proc_stop (pip, summary);
4954 #ifdef UNIXWARE
4955           supply_gregset (&pip->prstatus.pr_lwp.pr_context.uc_mcontext.gregs);
4956 #else
4957           supply_gregset (&pip->prstatus.pr_reg);
4958 #endif
4959           printf_filtered ("PC: ");
4960           print_address (read_pc (), gdb_stdout);
4961           printf_filtered ("\n");
4962         }
4963       if (summary || all || signals || faults)
4964         {
4965           info_proc_siginfo (pip, summary);
4966         }
4967       if (summary || all || syscalls)
4968         {
4969           info_proc_syscalls (pip, summary);
4970         }
4971       if (summary || all || mappings)
4972         {
4973           info_proc_mappings (pip, summary);
4974         }
4975       if (summary || all || signals)
4976         {
4977           info_proc_signals (pip, summary);
4978         }
4979       if (summary || all || faults)
4980         {
4981           info_proc_faults (pip, summary);
4982         }
4983       printf_filtered ("\n");
4984
4985       /* All done, deal with closing any temporary process info structure,
4986          freeing temporary memory , etc. */
4987
4988       do_cleanups (old_chain);
4989 #ifndef PROCFS_USE_READ_WRITE
4990     }
4991 #endif
4992 }
4993
4994 /*
4995
4996 LOCAL FUNCTION
4997
4998         modify_inherit_on_fork_flag - Change the inherit-on-fork flag
4999
5000 SYNOPSIS
5001
5002         void modify_inherit_on_fork_flag (fd, flag)
5003
5004 DESCRIPTION
5005
5006         Call this routine to modify the inherit-on-fork flag.  This routine is
5007         just a nice wrapper to hide the #ifdefs needed by various systems to
5008         control this flag.
5009
5010  */
5011
5012 static void
5013 modify_inherit_on_fork_flag (fd, flag)
5014      int fd;
5015      int flag;
5016 {
5017 #if defined (PIOCSET) || defined (PCSET)
5018   long pr_flags;
5019 #endif
5020   int retval = 0;
5021   struct proc_ctl pctl;
5022
5023 #if defined (PIOCSET) || defined (PCSET)        /* New method */
5024   pr_flags = PR_FORK;
5025   if (flag)
5026     {
5027 #ifdef PROCFS_USE_READ_WRITE
5028       pctl.cmd = PCSET;
5029       pctl.data = PR_FORK;
5030       if (write (fd, (char *) &pctl, sizeof (struct proc_ctl)) < 0)
5031         retval = -1;
5032 #else
5033       retval = ioctl (fd, PIOCSET, &pr_flags);
5034 #endif
5035     }
5036   else
5037     {
5038 #ifdef PROCFS_USE_READ_WRITE
5039       pctl.cmd = PCRESET;
5040       pctl.data = PR_FORK;
5041       if (write (fd, (char *) &pctl, sizeof (struct proc_ctl)) < 0)
5042         retval = -1;
5043 #else
5044       retval = ioctl (fd, PIOCRESET, &pr_flags);
5045 #endif
5046     }
5047
5048 #else
5049 #ifdef PIOCSFORK                /* Original method */
5050   if (flag)
5051     {
5052       retval = ioctl (fd, PIOCSFORK, NULL);
5053     }
5054   else
5055     {
5056       retval = ioctl (fd, PIOCRFORK, NULL);
5057     }
5058 #else
5059   Neither PR_FORK nor PIOCSFORK exist!!!
5060 #endif
5061 #endif
5062
5063   if (!retval)
5064     return;
5065
5066   print_sys_errmsg ("modify_inherit_on_fork_flag", errno);
5067   error ("PIOCSFORK or PR_FORK modification failed");
5068 }
5069
5070 /*
5071
5072 LOCAL FUNCTION
5073
5074         modify_run_on_last_close_flag - Change the run-on-last-close flag
5075
5076 SYNOPSIS
5077
5078         void modify_run_on_last_close_flag (fd, flag)
5079
5080 DESCRIPTION
5081
5082         Call this routine to modify the run-on-last-close flag.  This routine
5083         is just a nice wrapper to hide the #ifdefs needed by various systems to
5084         control this flag.
5085
5086  */
5087
5088 static void
5089 modify_run_on_last_close_flag (fd, flag)
5090      int fd;
5091      int flag;
5092 {
5093 #if defined (PIOCSET) || defined (PCSET)
5094   long pr_flags;
5095 #endif
5096   int retval = 0;
5097   struct proc_ctl pctl;
5098
5099 #if defined (PIOCSET) || defined (PCSET)        /* New method */
5100   pr_flags = PR_RLC;
5101   if (flag)
5102     {
5103 #ifdef PROCFS_USE_READ_WRITE
5104       pctl.cmd = PCSET;
5105       pctl.data = PR_RLC;
5106       if (write (fd, (char *) &pctl, sizeof (struct proc_ctl)) < 0)
5107         retval = -1;
5108 #else
5109       retval = ioctl (fd, PIOCSET, &pr_flags);
5110 #endif
5111     }
5112   else
5113     {
5114 #ifdef PROCFS_USE_READ_WRITE
5115       pctl.cmd = PCRESET;
5116       pctl.data = PR_RLC;
5117       if (write (fd, (char *) &pctl, sizeof (struct proc_ctl)) < 0)
5118         retval = -1;
5119 #else
5120       retval = ioctl (fd, PIOCRESET, &pr_flags);
5121 #endif
5122     }
5123
5124 #else
5125 #ifdef PIOCSRLC                 /* Original method */
5126   if (flag)
5127     retval = ioctl (fd, PIOCSRLC, NULL);
5128   else
5129     retval = ioctl (fd, PIOCRRLC, NULL);
5130 #else
5131   Neither PR_RLC nor PIOCSRLC exist!!!
5132 #endif
5133 #endif
5134
5135   if (!retval)
5136     return;
5137
5138   print_sys_errmsg ("modify_run_on_last_close_flag", errno);
5139   error ("PIOCSRLC or PR_RLC modification failed");
5140 }
5141
5142 /*
5143
5144 LOCAL FUNCTION
5145
5146         procfs_clear_syscall_trap -- Deletes the trap for the specified system call.
5147
5148 SYNOPSIS
5149
5150         void procfs_clear_syscall_trap (struct procinfo *, int syscall_num, int errok)
5151
5152 DESCRIPTION
5153
5154         This function function disables traps for the specified system call.
5155         errok is non-zero if errors should be ignored.
5156  */
5157
5158 static void
5159 procfs_clear_syscall_trap (pi, syscall_num, errok)
5160      struct procinfo *pi;
5161      int syscall_num;
5162      int errok;
5163 {
5164   sysset_t sysset;
5165   int goterr, i;
5166
5167 #ifndef UNIXWARE
5168   goterr = ioctl (pi->ctl_fd, PIOCGENTRY, &sysset) < 0;
5169
5170   if (goterr && !errok)
5171     {
5172       print_sys_errmsg (pi->pathname, errno);
5173       error ("PIOCGENTRY failed");
5174     }
5175
5176   if (!goterr)
5177     {
5178       prdelset (&sysset, syscall_num);
5179
5180       if ((ioctl (pi->ctl_fd, PIOCSENTRY, &sysset) < 0) && !errok)
5181         {
5182           print_sys_errmsg (pi->pathname, errno);
5183           error ("PIOCSENTRY failed");
5184         }
5185     }
5186
5187   goterr = ioctl (pi->ctl_fd, PIOCGEXIT, &sysset) < 0;
5188
5189   if (goterr && !errok)
5190     {
5191       procfs_clear_syscall_trap (pi, syscall_num, 1);
5192       print_sys_errmsg (pi->pathname, errno);
5193       error ("PIOCGEXIT failed");
5194     }
5195
5196   if (!goterr)
5197     {
5198       praddset (&sysset, syscall_num);
5199
5200       if ((ioctl (pi->ctl_fd, PIOCSEXIT, &sysset) < 0) && !errok)
5201         {
5202           procfs_clear_syscall_trap (pi, syscall_num, 1);
5203           print_sys_errmsg (pi->pathname, errno);
5204           error ("PIOCSEXIT failed");
5205         }
5206     }
5207 #endif
5208
5209   if (!pi->syscall_handlers)
5210     {
5211       if (!errok)
5212         error ("procfs_clear_syscall_trap:  syscall_handlers is empty");
5213       return;
5214     }
5215
5216   /* Remove handler func from the handler list */
5217
5218   for (i = 0; i < pi->num_syscall_handlers; i++)
5219     if (pi->syscall_handlers[i].syscall_num == syscall_num)
5220       {
5221         if (i + 1 != pi->num_syscall_handlers)
5222           {                     /* Not the last entry.
5223                                    Move subsequent entries fwd. */
5224             memcpy (&pi->syscall_handlers[i], &pi->syscall_handlers[i + 1],
5225                     (pi->num_syscall_handlers - i - 1)
5226                     * sizeof (struct procfs_syscall_handler));
5227           }
5228
5229         pi->syscall_handlers = xrealloc (pi->syscall_handlers,
5230                                          (pi->num_syscall_handlers - 1)
5231                                          * sizeof (struct procfs_syscall_handler));
5232         pi->num_syscall_handlers--;
5233         return;
5234       }
5235
5236   if (!errok)
5237     error ("procfs_clear_syscall_trap:  Couldn't find handler for sys call %d",
5238            syscall_num);
5239 }
5240
5241 /*
5242
5243 LOCAL FUNCTION
5244
5245         procfs_set_syscall_trap -- arrange for a function to be called when the
5246                                    child executes the specified system call.
5247
5248 SYNOPSIS
5249
5250         void procfs_set_syscall_trap (struct procinfo *, int syscall_num, int flags,
5251                                       syscall_func_t *function)
5252
5253 DESCRIPTION
5254
5255         This function sets up an entry and/or exit trap for the specified system
5256         call.  When the child executes the specified system call, your function
5257         will be called with the call #, a flag that indicates entry or exit, and
5258         pointers to rtnval and statval (which are used by procfs_wait).  The
5259         function should return non-zero if something interesting happened, zero
5260         otherwise.
5261  */
5262
5263 static void
5264 procfs_set_syscall_trap (pi, syscall_num, flags, func)
5265      struct procinfo *pi;
5266      int syscall_num;
5267      int flags;
5268      syscall_func_t *func;
5269 {
5270   sysset_t sysset;
5271
5272 #ifndef UNIXWARE
5273   if (flags & PROCFS_SYSCALL_ENTRY)
5274     {
5275       if (ioctl (pi->ctl_fd, PIOCGENTRY, &sysset) < 0)
5276         {
5277           print_sys_errmsg (pi->pathname, errno);
5278           error ("PIOCGENTRY failed");
5279         }
5280
5281       praddset (&sysset, syscall_num);
5282
5283       if (ioctl (pi->ctl_fd, PIOCSENTRY, &sysset) < 0)
5284         {
5285           print_sys_errmsg (pi->pathname, errno);
5286           error ("PIOCSENTRY failed");
5287         }
5288     }
5289
5290   if (flags & PROCFS_SYSCALL_EXIT)
5291     {
5292       if (ioctl (pi->ctl_fd, PIOCGEXIT, &sysset) < 0)
5293         {
5294           procfs_clear_syscall_trap (pi, syscall_num, 1);
5295           print_sys_errmsg (pi->pathname, errno);
5296           error ("PIOCGEXIT failed");
5297         }
5298
5299       praddset (&sysset, syscall_num);
5300
5301       if (ioctl (pi->ctl_fd, PIOCSEXIT, &sysset) < 0)
5302         {
5303           procfs_clear_syscall_trap (pi, syscall_num, 1);
5304           print_sys_errmsg (pi->pathname, errno);
5305           error ("PIOCSEXIT failed");
5306         }
5307     }
5308 #endif
5309
5310   if (!pi->syscall_handlers)
5311     {
5312       pi->syscall_handlers = xmalloc (sizeof (struct procfs_syscall_handler));
5313       pi->syscall_handlers[0].syscall_num = syscall_num;
5314       pi->syscall_handlers[0].func = func;
5315       pi->num_syscall_handlers = 1;
5316     }
5317   else
5318     {
5319       int i;
5320
5321       for (i = 0; i < pi->num_syscall_handlers; i++)
5322         if (pi->syscall_handlers[i].syscall_num == syscall_num)
5323           {
5324             pi->syscall_handlers[i].func = func;
5325             return;
5326           }
5327
5328       pi->syscall_handlers = xrealloc (pi->syscall_handlers, (i + 1)
5329                                        * sizeof (struct procfs_syscall_handler));
5330       pi->syscall_handlers[i].syscall_num = syscall_num;
5331       pi->syscall_handlers[i].func = func;
5332       pi->num_syscall_handlers++;
5333     }
5334 }
5335
5336 #ifdef SYS_lwp_create
5337
5338 /*
5339
5340 LOCAL FUNCTION
5341
5342         procfs_lwp_creation_handler - handle exit from the _lwp_create syscall
5343
5344 SYNOPSIS
5345
5346         int procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
5347
5348 DESCRIPTION
5349
5350         This routine is called both when an inferior process and it's new lwp
5351         are about to finish a _lwp_create() system call.  This is the system
5352         call that Solaris uses to create a lightweight process.  When the
5353         target process gets this event, we can look at sysarg[2] to find the
5354         new childs lwp ID, and create a procinfo struct from that.  After that,
5355         we pretend that we got a SIGTRAP, and return non-zero to tell
5356         procfs_wait to wake up.  Subsequently, wait_for_inferior gets woken up,
5357         sees the new process and continues it.
5358
5359         When we see the child exiting from lwp_create, we just contine it,
5360         since everything was handled when the parent trapped.
5361
5362 NOTES
5363         In effect, we are only paying attention to the parent's completion of
5364         the lwp_create syscall.  If we only paid attention to the child
5365         instead, then we wouldn't detect the creation of a suspended thread.
5366  */
5367
5368 static int
5369 procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
5370      struct procinfo *pi;
5371      int syscall_num;
5372      int why;
5373      int *rtnvalp;
5374      int *statvalp;
5375 {
5376   int lwp_id;
5377   struct procinfo *childpi;
5378   struct proc_ctl pctl;
5379
5380   /* We've just detected the completion of an lwp_create system call.  Now we
5381      need to setup a procinfo struct for this thread, and notify the thread
5382      system of the new arrival.  */
5383
5384   /* If lwp_create failed, then nothing interesting happened.  Continue the
5385      process and go back to sleep. */
5386
5387 #ifdef UNIXWARE
5388   /* Joel ... can you check this logic out please? JKJ */
5389   if (pi->prstatus.pr_lwp.pr_context.uc_mcontext.gregs[R_EFL] & 1)
5390     { /* _lwp_create failed */
5391       pctl.cmd = PCRUN;
5392       pctl.data = PRCFAULT;
5393
5394       if (write (pi->ctl_fd, (char *) &pctl, sizeof (struct proc_ctl)) < 0)
5395         perror_with_name (pi->pathname);
5396
5397       return 0;
5398     }
5399 #else /* UNIXWARE */
5400   if (PROCFS_GET_CARRY (pi->prstatus.pr_reg))
5401     {                           /* _lwp_create failed */
5402       pi->prrun.pr_flags &= PRSTEP;
5403       pi->prrun.pr_flags |= PRCFAULT;
5404
5405       if (ioctl (pi->ctl_fd, PIOCRUN, &pi->prrun) != 0)
5406         perror_with_name (pi->pathname);
5407
5408       return 0;
5409     }
5410 #endif
5411
5412   /* At this point, the new thread is stopped at it's first instruction, and
5413      the parent is stopped at the exit from lwp_create.  */
5414
5415   if (pi->new_child)            /* Child? */
5416     {                           /* Yes, just continue it */
5417 #ifdef UNIXWARE
5418       pctl.cmd = PCRUN;
5419       pctl.data = PRCFAULT;
5420
5421       if (write(pi->ctl_fd, (char *)&pctl, sizeof (struct proc_ctl)) < 0)
5422 #else /* !UNIXWARE */
5423       pi->prrun.pr_flags &= PRSTEP;
5424       pi->prrun.pr_flags |= PRCFAULT;
5425
5426       if ((pi->prstatus.pr_flags & PR_ISTOP)
5427           && ioctl (pi->ctl_fd, PIOCRUN, &pi->prrun) != 0)
5428 #endif /* !UNIXWARE */
5429         perror_with_name (pi->pathname);
5430
5431       pi->new_child = 0;        /* No longer new */
5432
5433       return 0;
5434     }
5435
5436   /* We're the proud parent of a new thread.  Setup an exit trap for lwp_create
5437      in the child and continue the parent.  */
5438
5439   /* Third arg is pointer to new thread id. */
5440 #ifdef UNIXWARE
5441   lwp_id = read_memory_integer (pi->prstatus.pr_lwp.pr_sysarg[2], sizeof (int));
5442 #else
5443   lwp_id = read_memory_integer (pi->prstatus.pr_sysarg[2], sizeof (int));
5444 #endif
5445
5446   lwp_id = (lwp_id << 16) | PIDGET (pi->pid);
5447
5448   childpi = create_procinfo (lwp_id);
5449
5450   /* The new process has actually inherited the lwp_create syscall trap from
5451      it's parent, but we still have to call this to register handlers for
5452      that child.  */
5453
5454   procfs_set_inferior_syscall_traps (childpi);
5455   add_thread (lwp_id);
5456   printf_filtered ("[New %s]\n", target_pid_to_str (lwp_id));
5457
5458   /* Continue the parent */
5459 #ifdef UNIXWARE
5460   pctl.cmd = PCRUN;
5461   pctl.data = PRCFAULT;
5462
5463   if (write(pi->ctl_fd, (char *)&pctl, sizeof (struct proc_ctl)) < 0)
5464 #else
5465   pi->prrun.pr_flags &= PRSTEP;
5466   pi->prrun.pr_flags |= PRCFAULT;
5467   if (ioctl (pi->ctl_fd, PIOCRUN, &pi->prrun) != 0)
5468 #endif
5469     perror_with_name (pi->pathname);
5470
5471   /* The new child may have been created in one of two states: 
5472      SUSPENDED or RUNNABLE.  If runnable, we will simply signal it to run.
5473      If suspended, we flag it to be continued later, when it has an event.  */
5474
5475 #ifdef UNIXWARE
5476   if (childpi->prstatus.pr_lwp.pr_why == PR_SUSPENDED)
5477 #else
5478   if (childpi->prstatus.pr_why == PR_SUSPENDED)
5479 #endif
5480     childpi->new_child = 1;     /* Flag this as an unseen child process */
5481   else
5482     {
5483       /* Continue the child */
5484 #ifdef UNIXWARE
5485       pctl.cmd = PCRUN;
5486       pctl.data = PRCFAULT;
5487
5488       if (write(pi->ctl_fd, (char *)&pctl, sizeof (struct proc_ctl)) < 0)
5489 #else
5490       childpi->prrun.pr_flags &= PRSTEP;
5491       childpi->prrun.pr_flags |= PRCFAULT;
5492
5493       if (ioctl (childpi->ctl_fd, PIOCRUN, &childpi->prrun) != 0)
5494 #endif
5495         perror_with_name (childpi->pathname);
5496     }
5497   return 0;
5498 }
5499 #endif /* SYS_lwp_create */
5500
5501 /* Fork an inferior process, and start debugging it with /proc.  */
5502
5503 static void
5504 procfs_create_inferior (exec_file, allargs, env)
5505      char *exec_file;
5506      char *allargs;
5507      char **env;
5508 {
5509   char *shell_file = getenv ("SHELL");
5510   char *tryname;
5511   if (shell_file != NULL && strchr (shell_file, '/') == NULL)
5512     {
5513
5514       /* We will be looking down the PATH to find shell_file.  If we
5515          just do this the normal way (via execlp, which operates by
5516          attempting an exec for each element of the PATH until it
5517          finds one which succeeds), then there will be an exec for
5518          each failed attempt, each of which will cause a PR_SYSEXIT
5519          stop, and we won't know how to distinguish the PR_SYSEXIT's
5520          for these failed execs with the ones for successful execs
5521          (whether the exec has succeeded is stored at that time in the
5522          carry bit or some such architecture-specific and
5523          non-ABI-specified place).
5524
5525          So I can't think of anything better than to search the PATH
5526          now.  This has several disadvantages: (1) There is a race
5527          condition; if we find a file now and it is deleted before we
5528          exec it, we lose, even if the deletion leaves a valid file
5529          further down in the PATH, (2) there is no way to know exactly
5530          what an executable (in the sense of "capable of being
5531          exec'd") file is.  Using access() loses because it may lose
5532          if the caller is the superuser; failing to use it loses if
5533          there are ACLs or some such.  */
5534
5535       char *p;
5536       char *p1;
5537       /* FIXME-maybe: might want "set path" command so user can change what
5538          path is used from within GDB.  */
5539       char *path = getenv ("PATH");
5540       int len;
5541       struct stat statbuf;
5542
5543       if (path == NULL)
5544         path = "/bin:/usr/bin";
5545
5546       tryname = alloca (strlen (path) + strlen (shell_file) + 2);
5547       for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
5548         {
5549           p1 = strchr (p, ':');
5550           if (p1 != NULL)
5551             len = p1 - p;
5552           else
5553             len = strlen (p);
5554           strncpy (tryname, p, len);
5555           tryname[len] = '\0';
5556           strcat (tryname, "/");
5557           strcat (tryname, shell_file);
5558           if (access (tryname, X_OK) < 0)
5559             continue;
5560           if (stat (tryname, &statbuf) < 0)
5561             continue;
5562           if (!S_ISREG (statbuf.st_mode))
5563             /* We certainly need to reject directories.  I'm not quite
5564                as sure about FIFOs, sockets, etc., but I kind of doubt
5565                that people want to exec() these things.  */
5566             continue;
5567           break;
5568         }
5569       if (p == NULL)
5570         /* Not found.  This must be an error rather than merely passing
5571            the file to execlp(), because execlp() would try all the
5572            exec()s, causing GDB to get confused.  */
5573         error ("Can't find shell %s in PATH", shell_file);
5574
5575       shell_file = tryname;
5576     }
5577
5578   fork_inferior (exec_file, allargs, env,
5579                  proc_set_exec_trap, procfs_init_inferior, NULL, shell_file);
5580
5581   /* We are at the first instruction we care about.  */
5582   /* Pedal to the metal... */
5583
5584   proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
5585 }
5586
5587 /* Clean up after the inferior dies.  */
5588
5589 static void
5590 procfs_mourn_inferior ()
5591 {
5592   struct procinfo *pi;
5593   struct procinfo *next_pi;
5594
5595   for (pi = procinfo_list; pi; pi = next_pi)
5596     {
5597       next_pi = pi->next;
5598       unconditionally_kill_inferior (pi);
5599     }
5600
5601   unpush_target (&procfs_ops);
5602   generic_mourn_inferior ();
5603 }
5604
5605
5606 /* Mark our target-struct as eligible for stray "run" and "attach" commands.  */
5607 static int
5608 procfs_can_run ()
5609 {
5610   /* This variable is controlled by modules that sit atop procfs that may layer
5611      their own process structure atop that provided here.  sol-thread.c does
5612      this because of the Solaris two-level thread model.  */
5613
5614   return !procfs_suppress_run;
5615 }
5616 #ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
5617 #ifndef UNIXWARE
5618 \f
5619 /* Insert a watchpoint */
5620 int
5621 procfs_set_watchpoint(pid, addr, len, rw)
5622      int                pid;
5623      CORE_ADDR          addr;
5624      int                len;
5625      int                rw;
5626 {
5627   struct procinfo       *pi;
5628   prwatch_t             wpt;
5629
5630   pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
5631   wpt.pr_vaddr = (caddr_t)addr;
5632   wpt.pr_size = len;
5633   wpt.pr_wflags = ((rw & 1) ? MA_READ : 0) | ((rw & 2) ? MA_WRITE : 0);
5634   if (ioctl (pi->ctl_fd, PIOCSWATCH, &wpt) < 0)
5635     {
5636       if (errno == E2BIG)
5637         return -1;
5638       /* Currently it sometimes happens that the same watchpoint gets
5639          deleted twice - don't die in this case (FIXME please) */
5640       if (errno == ESRCH && len == 0)
5641         return 0;
5642       print_sys_errmsg (pi->pathname, errno);
5643       error ("PIOCSWATCH failed");
5644     }
5645   return 0;
5646 }
5647
5648 int
5649 procfs_stopped_by_watchpoint(pid)
5650     int                 pid;
5651 {
5652   struct procinfo       *pi;
5653   short                 what;
5654   short                 why;
5655
5656   pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
5657   if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
5658     {
5659       why = pi->prstatus.pr_why;
5660       what = pi->prstatus.pr_what;
5661       if (why == PR_FAULTED 
5662 #if defined (FLTWATCH) && defined (FLTKWATCH)
5663           && (what == FLTWATCH || what == FLTKWATCH)
5664 #else
5665 #ifdef FLTWATCH
5666           && (what == FLTWATCH) 
5667 #endif
5668 #ifdef FLTKWATCH
5669           && (what == FLTKWATCH)
5670 #endif
5671 #endif
5672           )
5673         return what;
5674     }
5675   return 0;
5676 }
5677 #endif /* !UNIXWARE */
5678 #endif /* TARGET_HAS_HARDWARE_WATCHPOINTS */
5679
5680 /* Why is this necessary?  Shouldn't dead threads just be removed from the
5681    thread database?  */
5682
5683 static int
5684 procfs_thread_alive (pid)
5685      int pid;
5686 {
5687   struct procinfo *pi, *next_pi;
5688
5689   for (pi = procinfo_list; pi; pi = next_pi)
5690     {
5691       next_pi = pi->next;
5692       if (pi -> pid == pid)
5693         if (procfs_read_status (pi))    /* alive */
5694           return 1;
5695         else                            /* defunct (exited) */
5696           {
5697             close_proc_file (pi);
5698             return 0;
5699           }
5700     }
5701   return 0;
5702 }
5703
5704 int
5705 procfs_first_available ()
5706 {
5707   struct procinfo *pi;
5708
5709   for (pi = procinfo_list; pi; pi = pi->next)
5710     {
5711       if (procfs_read_status (pi))
5712         return pi->pid;
5713     }
5714   return -1;
5715 }
5716
5717 int
5718 procfs_get_pid_fd (pid)
5719      int pid;
5720 {
5721   struct procinfo *pi = find_procinfo (pid, 1);
5722
5723   if (pi == NULL)
5724     return -1;
5725
5726   return pi->ctl_fd;
5727 }
5728
5729 /* Send a SIGINT to the process group.  This acts just like the user typed a
5730    ^C on the controlling terminal.
5731
5732    XXX - This may not be correct for all systems.  Some may want to use
5733    killpg() instead of kill (-pgrp). */
5734
5735 static void
5736 procfs_stop ()
5737 {
5738   extern pid_t inferior_process_group;
5739
5740   kill (-inferior_process_group, SIGINT);
5741 }
5742 \f
5743 /* Convert a pid to printable form. */
5744
5745 #ifdef TIDGET
5746 char *
5747 procfs_pid_to_str (pid)
5748      int pid;
5749 {
5750   static char buf[100];
5751
5752   sprintf (buf, "Kernel thread %d", TIDGET (pid));
5753
5754   return buf;
5755 }
5756 #endif /* TIDGET */
5757
5758 \f
5759 static void
5760 init_procfs_ops ()
5761 {
5762   procfs_ops.to_shortname = "procfs";
5763   procfs_ops.to_longname = "Unix /proc child process";
5764   procfs_ops.to_doc = "Unix /proc child process (started by the \"run\" command).";
5765   procfs_ops.to_open = procfs_open;
5766   procfs_ops.to_attach = procfs_attach;
5767   procfs_ops.to_detach = procfs_detach;
5768   procfs_ops.to_resume = procfs_resume;
5769   procfs_ops.to_wait = procfs_wait;
5770   procfs_ops.to_fetch_registers = procfs_fetch_registers;
5771   procfs_ops.to_store_registers = procfs_store_registers;
5772   procfs_ops.to_prepare_to_store = procfs_prepare_to_store;
5773   procfs_ops.to_xfer_memory = procfs_xfer_memory;
5774   procfs_ops.to_files_info = procfs_files_info;
5775   procfs_ops.to_insert_breakpoint = memory_insert_breakpoint;
5776   procfs_ops.to_remove_breakpoint = memory_remove_breakpoint;
5777   procfs_ops.to_terminal_init = terminal_init_inferior;
5778   procfs_ops.to_terminal_inferior = terminal_inferior;
5779   procfs_ops.to_terminal_ours_for_output = terminal_ours_for_output;
5780   procfs_ops.to_terminal_ours = terminal_ours;
5781   procfs_ops.to_terminal_info = child_terminal_info;
5782   procfs_ops.to_kill = procfs_kill_inferior;
5783   procfs_ops.to_create_inferior = procfs_create_inferior;
5784   procfs_ops.to_mourn_inferior = procfs_mourn_inferior;
5785   procfs_ops.to_can_run = procfs_can_run;
5786   procfs_ops.to_notice_signals = procfs_notice_signals;
5787   procfs_ops.to_thread_alive = procfs_thread_alive;
5788   procfs_ops.to_stop = procfs_stop;
5789   procfs_ops.to_stratum = process_stratum;
5790   procfs_ops.to_has_all_memory = 1;
5791   procfs_ops.to_has_memory = 1;
5792   procfs_ops.to_has_stack = 1;
5793   procfs_ops.to_has_registers = 1;
5794   procfs_ops.to_has_execution = 1;
5795   procfs_ops.to_magic = OPS_MAGIC;
5796 }
5797
5798 void
5799 _initialize_procfs ()
5800 {
5801 #ifdef HAVE_OPTIONAL_PROC_FS
5802   char procname[MAX_PROC_NAME_SIZE];
5803   int fd;
5804
5805   /* If we have an optional /proc filesystem (e.g. under OSF/1),
5806      don't add procfs support if we cannot access the running
5807      GDB via /proc.  */
5808   sprintf (procname, STATUS_PROC_NAME_FMT, getpid ());
5809   if ((fd = open (procname, O_RDONLY)) < 0)
5810     return;
5811   close (fd);
5812 #endif
5813
5814   init_procfs_ops ();
5815   add_target (&procfs_ops);
5816
5817   add_info ("processes", info_proc, 
5818 "Show process status information using /proc entry.\n\
5819 Specify process id or use current inferior by default.\n\
5820 Specify keywords for detailed information; default is summary.\n\
5821 Keywords are: `all', `faults', `flags', `id', `mappings', `signals',\n\
5822 `status', `syscalls', and `times'.\n\
5823 Unambiguous abbreviations may be used.");
5824
5825   init_syscall_table ();
5826 }
This page took 0.34031 seconds and 4 git commands to generate.