1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
3 Written by Fred Fish at Cygnus Support.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 For information on the details of using /proc consult section proc(4)
25 in the UNIX System V Release 4 System Administrator's Reference Manual.
27 The general register and floating point register sets are manipulated by
28 separate ioctl's. This file makes the assumption that if FP0_REGNUM is
29 defined, then support for the floating point register set is desired,
30 regardless of whether or not the actual target has floating point hardware.
37 #include <sys/types.h>
39 #include <sys/fault.h>
40 #include <sys/syscall.h>
41 #include <sys/procfs.h>
44 #include "gdb_string.h"
54 #include "gdbthread.h"
56 #define MAX_SYSCALLS 256 /* Maximum number of syscalls for table */
59 #define PROC_NAME_FMT "/proc/%05d"
62 extern struct target_ops procfs_ops; /* Forward declaration */
64 int procfs_suppress_run = 0; /* Non-zero if procfs should pretend not to
65 be a runnable target. Used by targets
66 that can sit atop procfs, such as solaris
69 #if 1 /* FIXME: Gross and ugly hack to resolve coredep.c global */
70 CORE_ADDR kernel_u_addr;
73 #ifdef BROKEN_SIGINFO_H /* Workaround broken SGS <sys/siginfo.h> */
75 #define si_pid _data._proc.pid
77 #define si_uid _data._proc._pdata._kill.uid
78 #endif /* BROKEN_SIGINFO_H */
80 /* All access to the inferior, either one started by gdb or one that has
81 been attached to, is controlled by an instance of a procinfo structure,
82 defined below. Since gdb currently only handles one inferior at a time,
83 the procinfo structure for the inferior is statically allocated and
84 only one exists at any given time. There is a separate procinfo
85 structure for use by the "info proc" command, so that we can print
86 useful information about any random process without interfering with
87 the inferior's procinfo information. */
90 struct procinfo *next;
91 int pid; /* Process ID of inferior */
92 int fd; /* File descriptor for /proc entry */
93 char *pathname; /* Pathname to /proc entry */
94 int had_event; /* poll/select says something happened */
95 int was_stopped; /* Nonzero if was stopped prior to attach */
96 int nopass_next_sigstop; /* Don't pass a sigstop on next resume */
97 prrun_t prrun; /* Control state when it is run */
98 prstatus_t prstatus; /* Current process status info */
99 gregset_t gregset; /* General register set */
100 fpregset_t fpregset; /* Floating point register set */
101 fltset_t fltset; /* Current traced hardware fault set */
102 sigset_t trace; /* Current traced signal set */
103 sysset_t exitset; /* Current traced system call exit set */
104 sysset_t entryset; /* Current traced system call entry set */
105 fltset_t saved_fltset; /* Saved traced hardware fault set */
106 sigset_t saved_trace; /* Saved traced signal set */
107 sigset_t saved_sighold; /* Saved held signal set */
108 sysset_t saved_exitset; /* Saved traced system call exit set */
109 sysset_t saved_entryset; /* Saved traced system call entry set */
110 int num_syscall_handlers; /* Number of syscall handlers currently installed */
111 struct procfs_syscall_handler *syscall_handlers; /* Pointer to list of syscall trap handlers */
112 int new_child; /* Non-zero if it's a new thread */
115 /* List of inferior process information */
116 static struct procinfo *procinfo_list = NULL;
118 static struct pollfd *poll_list; /* pollfds used for waiting on /proc */
120 static int num_poll_list = 0; /* Number of entries in poll_list */
122 /* Much of the information used in the /proc interface, particularly for
123 printing status information, is kept as tables of structures of the
124 following form. These tables can be used to map numeric values to
125 their symbolic names and to a string that describes their specific use. */
128 int value; /* The numeric value */
129 char *name; /* The equivalent symbolic value */
130 char *desc; /* Short description of value */
133 /* Translate bits in the pr_flags member of the prstatus structure, into the
134 names and desc information. */
136 static struct trans pr_flag_table[] =
138 #if defined (PR_STOPPED)
139 { PR_STOPPED, "PR_STOPPED", "Process is stopped" },
141 #if defined (PR_ISTOP)
142 { PR_ISTOP, "PR_ISTOP", "Stopped on an event of interest" },
144 #if defined (PR_DSTOP)
145 { PR_DSTOP, "PR_DSTOP", "A stop directive is in effect" },
147 #if defined (PR_ASLEEP)
148 { PR_ASLEEP, "PR_ASLEEP", "Sleeping in an interruptible system call" },
150 #if defined (PR_FORK)
151 { PR_FORK, "PR_FORK", "Inherit-on-fork is in effect" },
154 { PR_RLC, "PR_RLC", "Run-on-last-close is in effect" },
156 #if defined (PR_PTRACE)
157 { PR_PTRACE, "PR_PTRACE", "Process is being controlled by ptrace" },
159 #if defined (PR_PCINVAL)
160 { PR_PCINVAL, "PR_PCINVAL", "PC refers to an invalid virtual address" },
162 #if defined (PR_ISSYS)
163 { PR_ISSYS, "PR_ISSYS", "Is a system process" },
165 #if defined (PR_STEP)
166 { PR_STEP, "PR_STEP", "Process has single step pending" },
169 { PR_KLC, "PR_KLC", "Kill-on-last-close is in effect" },
171 #if defined (PR_ASYNC)
172 { PR_ASYNC, "PR_ASYNC", "Asynchronous stop is in effect" },
174 #if defined (PR_PCOMPAT)
175 { PR_PCOMPAT, "PR_PCOMPAT", "Ptrace compatibility mode in effect" },
180 /* Translate values in the pr_why field of the prstatus struct. */
182 static struct trans pr_why_table[] =
184 #if defined (PR_REQUESTED)
185 { PR_REQUESTED, "PR_REQUESTED", "Directed to stop via PIOCSTOP/PIOCWSTOP" },
187 #if defined (PR_SIGNALLED)
188 { PR_SIGNALLED, "PR_SIGNALLED", "Receipt of a traced signal" },
190 #if defined (PR_FAULTED)
191 { PR_FAULTED, "PR_FAULTED", "Incurred a traced hardware fault" },
193 #if defined (PR_SYSENTRY)
194 { PR_SYSENTRY, "PR_SYSENTRY", "Entry to a traced system call" },
196 #if defined (PR_SYSEXIT)
197 { PR_SYSEXIT, "PR_SYSEXIT", "Exit from a traced system call" },
199 #if defined (PR_JOBCONTROL)
200 { PR_JOBCONTROL, "PR_JOBCONTROL", "Default job control stop signal action" },
202 #if defined (PR_SUSPENDED)
203 { PR_SUSPENDED, "PR_SUSPENDED", "Process suspended" },
208 /* Hardware fault translation table. */
210 static struct trans faults_table[] =
213 { FLTILL, "FLTILL", "Illegal instruction" },
215 #if defined (FLTPRIV)
216 { FLTPRIV, "FLTPRIV", "Privileged instruction" },
219 { FLTBPT, "FLTBPT", "Breakpoint trap" },
221 #if defined (FLTTRACE)
222 { FLTTRACE, "FLTTRACE", "Trace trap" },
224 #if defined (FLTACCESS)
225 { FLTACCESS, "FLTACCESS", "Memory access fault" },
227 #if defined (FLTBOUNDS)
228 { FLTBOUNDS, "FLTBOUNDS", "Memory bounds violation" },
230 #if defined (FLTIOVF)
231 { FLTIOVF, "FLTIOVF", "Integer overflow" },
233 #if defined (FLTIZDIV)
234 { FLTIZDIV, "FLTIZDIV", "Integer zero divide" },
237 { FLTFPE, "FLTFPE", "Floating-point exception" },
239 #if defined (FLTSTACK)
240 { FLTSTACK, "FLTSTACK", "Unrecoverable stack fault" },
242 #if defined (FLTPAGE)
243 { FLTPAGE, "FLTPAGE", "Recoverable page fault" },
248 /* Translation table for signal generation information. See UNIX System
249 V Release 4 Programmer's Reference Manual, siginfo(5). */
251 static struct sigcode {
256 } siginfo_table[] = {
257 #if defined (SIGILL) && defined (ILL_ILLOPC)
258 { SIGILL, ILL_ILLOPC, "ILL_ILLOPC", "Illegal opcode" },
260 #if defined (SIGILL) && defined (ILL_ILLOPN)
261 { SIGILL, ILL_ILLOPN, "ILL_ILLOPN", "Illegal operand", },
263 #if defined (SIGILL) && defined (ILL_ILLADR)
264 { SIGILL, ILL_ILLADR, "ILL_ILLADR", "Illegal addressing mode" },
266 #if defined (SIGILL) && defined (ILL_ILLTRP)
267 { SIGILL, ILL_ILLTRP, "ILL_ILLTRP", "Illegal trap" },
269 #if defined (SIGILL) && defined (ILL_PRVOPC)
270 { SIGILL, ILL_PRVOPC, "ILL_PRVOPC", "Privileged opcode" },
272 #if defined (SIGILL) && defined (ILL_PRVREG)
273 { SIGILL, ILL_PRVREG, "ILL_PRVREG", "Privileged register" },
275 #if defined (SIGILL) && defined (ILL_COPROC)
276 { SIGILL, ILL_COPROC, "ILL_COPROC", "Coprocessor error" },
278 #if defined (SIGILL) && defined (ILL_BADSTK)
279 { SIGILL, ILL_BADSTK, "ILL_BADSTK", "Internal stack error" },
281 #if defined (SIGFPE) && defined (FPE_INTDIV)
282 { SIGFPE, FPE_INTDIV, "FPE_INTDIV", "Integer divide by zero" },
284 #if defined (SIGFPE) && defined (FPE_INTOVF)
285 { SIGFPE, FPE_INTOVF, "FPE_INTOVF", "Integer overflow" },
287 #if defined (SIGFPE) && defined (FPE_FLTDIV)
288 { SIGFPE, FPE_FLTDIV, "FPE_FLTDIV", "Floating point divide by zero" },
290 #if defined (SIGFPE) && defined (FPE_FLTOVF)
291 { SIGFPE, FPE_FLTOVF, "FPE_FLTOVF", "Floating point overflow" },
293 #if defined (SIGFPE) && defined (FPE_FLTUND)
294 { SIGFPE, FPE_FLTUND, "FPE_FLTUND", "Floating point underflow" },
296 #if defined (SIGFPE) && defined (FPE_FLTRES)
297 { SIGFPE, FPE_FLTRES, "FPE_FLTRES", "Floating point inexact result" },
299 #if defined (SIGFPE) && defined (FPE_FLTINV)
300 { SIGFPE, FPE_FLTINV, "FPE_FLTINV", "Invalid floating point operation" },
302 #if defined (SIGFPE) && defined (FPE_FLTSUB)
303 { SIGFPE, FPE_FLTSUB, "FPE_FLTSUB", "Subscript out of range" },
305 #if defined (SIGSEGV) && defined (SEGV_MAPERR)
306 { SIGSEGV, SEGV_MAPERR, "SEGV_MAPERR", "Address not mapped to object" },
308 #if defined (SIGSEGV) && defined (SEGV_ACCERR)
309 { SIGSEGV, SEGV_ACCERR, "SEGV_ACCERR", "Invalid permissions for object" },
311 #if defined (SIGBUS) && defined (BUS_ADRALN)
312 { SIGBUS, BUS_ADRALN, "BUS_ADRALN", "Invalid address alignment" },
314 #if defined (SIGBUS) && defined (BUS_ADRERR)
315 { SIGBUS, BUS_ADRERR, "BUS_ADRERR", "Non-existent physical address" },
317 #if defined (SIGBUS) && defined (BUS_OBJERR)
318 { SIGBUS, BUS_OBJERR, "BUS_OBJERR", "Object specific hardware error" },
320 #if defined (SIGTRAP) && defined (TRAP_BRKPT)
321 { SIGTRAP, TRAP_BRKPT, "TRAP_BRKPT", "Process breakpoint" },
323 #if defined (SIGTRAP) && defined (TRAP_TRACE)
324 { SIGTRAP, TRAP_TRACE, "TRAP_TRACE", "Process trace trap" },
326 #if defined (SIGCLD) && defined (CLD_EXITED)
327 { SIGCLD, CLD_EXITED, "CLD_EXITED", "Child has exited" },
329 #if defined (SIGCLD) && defined (CLD_KILLED)
330 { SIGCLD, CLD_KILLED, "CLD_KILLED", "Child was killed" },
332 #if defined (SIGCLD) && defined (CLD_DUMPED)
333 { SIGCLD, CLD_DUMPED, "CLD_DUMPED", "Child has terminated abnormally" },
335 #if defined (SIGCLD) && defined (CLD_TRAPPED)
336 { SIGCLD, CLD_TRAPPED, "CLD_TRAPPED", "Traced child has trapped" },
338 #if defined (SIGCLD) && defined (CLD_STOPPED)
339 { SIGCLD, CLD_STOPPED, "CLD_STOPPED", "Child has stopped" },
341 #if defined (SIGCLD) && defined (CLD_CONTINUED)
342 { SIGCLD, CLD_CONTINUED, "CLD_CONTINUED", "Stopped child had continued" },
344 #if defined (SIGPOLL) && defined (POLL_IN)
345 { SIGPOLL, POLL_IN, "POLL_IN", "Input input available" },
347 #if defined (SIGPOLL) && defined (POLL_OUT)
348 { SIGPOLL, POLL_OUT, "POLL_OUT", "Output buffers available" },
350 #if defined (SIGPOLL) && defined (POLL_MSG)
351 { SIGPOLL, POLL_MSG, "POLL_MSG", "Input message available" },
353 #if defined (SIGPOLL) && defined (POLL_ERR)
354 { SIGPOLL, POLL_ERR, "POLL_ERR", "I/O error" },
356 #if defined (SIGPOLL) && defined (POLL_PRI)
357 { SIGPOLL, POLL_PRI, "POLL_PRI", "High priority input available" },
359 #if defined (SIGPOLL) && defined (POLL_HUP)
360 { SIGPOLL, POLL_HUP, "POLL_HUP", "Device disconnected" },
365 static char *syscall_table[MAX_SYSCALLS];
367 /* Prototypes for local functions */
369 static void procfs_stop PARAMS ((void));
371 static int procfs_thread_alive PARAMS ((int));
373 static int procfs_can_run PARAMS ((void));
375 static void procfs_mourn_inferior PARAMS ((void));
377 static void procfs_fetch_registers PARAMS ((int));
379 static int procfs_wait PARAMS ((int, struct target_waitstatus *));
381 static void procfs_open PARAMS ((char *, int));
383 static void procfs_files_info PARAMS ((struct target_ops *));
385 static void procfs_prepare_to_store PARAMS ((void));
387 static void procfs_detach PARAMS ((char *, int));
389 static void procfs_attach PARAMS ((char *, int));
391 static void proc_set_exec_trap PARAMS ((void));
393 static int procfs_init_inferior PARAMS ((int));
395 static struct procinfo *create_procinfo PARAMS ((int));
397 static void procfs_store_registers PARAMS ((int));
399 static int procfs_xfer_memory PARAMS ((CORE_ADDR, char *, int, int, struct target_ops *));
401 static void procfs_kill_inferior PARAMS ((void));
403 static char *sigcodedesc PARAMS ((siginfo_t *));
405 static char *sigcodename PARAMS ((siginfo_t *));
407 static struct procinfo *wait_fd PARAMS ((void));
409 static void remove_fd PARAMS ((struct procinfo *));
411 static void add_fd PARAMS ((struct procinfo *));
413 static void set_proc_siginfo PARAMS ((struct procinfo *, int));
415 static void init_syscall_table PARAMS ((void));
417 static char *syscallname PARAMS ((int));
419 static char *signalname PARAMS ((int));
421 static char *errnoname PARAMS ((int));
423 static int proc_address_to_fd PARAMS ((struct procinfo *, CORE_ADDR, int));
425 static int open_proc_file PARAMS ((int, struct procinfo *, int));
427 static void close_proc_file PARAMS ((struct procinfo *));
429 static void unconditionally_kill_inferior PARAMS ((struct procinfo *));
431 static NORETURN void proc_init_failed PARAMS ((struct procinfo *, char *)) ATTR_NORETURN;
433 static void info_proc PARAMS ((char *, int));
435 static void info_proc_flags PARAMS ((struct procinfo *, int));
437 static void info_proc_stop PARAMS ((struct procinfo *, int));
439 static void info_proc_siginfo PARAMS ((struct procinfo *, int));
441 static void info_proc_syscalls PARAMS ((struct procinfo *, int));
443 static void info_proc_mappings PARAMS ((struct procinfo *, int));
445 static void info_proc_signals PARAMS ((struct procinfo *, int));
447 static void info_proc_faults PARAMS ((struct procinfo *, int));
449 static char *mappingflags PARAMS ((long));
451 static char *lookupname PARAMS ((struct trans *, unsigned int, char *));
453 static char *lookupdesc PARAMS ((struct trans *, unsigned int));
455 static int do_attach PARAMS ((int pid));
457 static void do_detach PARAMS ((int siggnal));
459 static void procfs_create_inferior PARAMS ((char *, char *, char **));
461 static void procfs_notice_signals PARAMS ((int pid));
463 static struct procinfo *find_procinfo PARAMS ((pid_t pid, int okfail));
465 typedef int syscall_func_t PARAMS ((struct procinfo *pi, int syscall_num,
466 int why, int *rtnval, int *statval));
468 static void procfs_set_syscall_trap PARAMS ((struct procinfo *pi,
469 int syscall_num, int flags,
470 syscall_func_t *func));
472 static void procfs_clear_syscall_trap PARAMS ((struct procinfo *pi,
473 int syscall_num, int errok));
475 #define PROCFS_SYSCALL_ENTRY 0x1 /* Trap on entry to sys call */
476 #define PROCFS_SYSCALL_EXIT 0x2 /* Trap on exit from sys call */
478 static syscall_func_t procfs_exit_handler;
480 static syscall_func_t procfs_exec_handler;
483 static syscall_func_t procfs_sproc_handler;
484 static syscall_func_t procfs_fork_handler;
487 #ifdef SYS_lwp_create
488 static syscall_func_t procfs_lwp_creation_handler;
491 static void modify_inherit_on_fork_flag PARAMS ((int fd, int flag));
492 static void modify_run_on_last_close_flag PARAMS ((int fd, int flag));
496 struct procfs_syscall_handler
498 int syscall_num; /* The number of the system call being handled */
499 /* The function to be called */
500 syscall_func_t *func;
503 static void procfs_resume PARAMS ((int pid, int step,
504 enum target_signal signo));
506 /* External function prototypes that can't be easily included in any
507 header file because the args are typedefs in system include files. */
509 extern void supply_gregset PARAMS ((gregset_t *));
511 extern void fill_gregset PARAMS ((gregset_t *, int));
513 extern void supply_fpregset PARAMS ((fpregset_t *));
515 extern void fill_fpregset PARAMS ((fpregset_t *, int));
521 find_procinfo -- convert a process id to a struct procinfo
525 static struct procinfo * find_procinfo (pid_t pid, int okfail);
529 Given a process id, look it up in the procinfo chain. Returns
530 a struct procinfo *. If can't find pid, then call error(),
531 unless okfail is set, in which case, return NULL;
534 static struct procinfo *
535 find_procinfo (pid, okfail)
539 struct procinfo *procinfo;
541 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
542 if (procinfo->pid == pid)
548 error ("procfs (find_procinfo): Couldn't locate pid %d", pid);
555 current_procinfo -- convert inferior_pid to a struct procinfo
559 static struct procinfo * current_procinfo;
563 Looks up inferior_pid in the procinfo chain. Always returns a
564 struct procinfo *. If process can't be found, we error() out.
567 #define current_procinfo find_procinfo (inferior_pid, 0)
573 add_fd -- Add the fd to the poll/select list
577 static void add_fd (struct procinfo *);
581 Add the fd of the supplied procinfo to the list of fds used for
582 poll/select operations.
589 if (num_poll_list <= 0)
590 poll_list = (struct pollfd *) xmalloc (sizeof (struct pollfd));
592 poll_list = (struct pollfd *) xrealloc (poll_list,
594 * sizeof (struct pollfd));
595 poll_list[num_poll_list].fd = pi->fd;
596 poll_list[num_poll_list].events = POLLPRI;
607 for (i = 0; i < num_poll_list; i++)
609 if (poll_list[i].fd == pi->fd)
611 if (i != num_poll_list - 1)
612 memcpy (poll_list + i, poll_list + i + 1,
613 (num_poll_list - i - 1) * sizeof (struct pollfd));
617 if (num_poll_list == 0)
620 poll_list = (struct pollfd *) xrealloc (poll_list,
622 * sizeof (struct pollfd));
628 static struct procinfo *
637 set_sigint_trap (); /* Causes SIGINT to be passed on to the
642 num_fds = poll (poll_list, num_poll_list, -1);
644 pi = current_procinfo;
646 while (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
650 /* Process exited. */
651 pi->prstatus.pr_flags = 0;
654 else if (errno != EINTR)
656 print_sys_errmsg (pi->pathname, errno);
657 error ("PIOCWSTOP failed");
663 clear_sigint_trap ();
670 print_sys_errmsg ("poll failed\n", errno);
671 error ("Poll failed, returned %d", num_fds);
674 for (i = 0; i < num_poll_list && num_fds > 0; i++)
676 if ((poll_list[i].revents & (POLLPRI|POLLERR|POLLHUP|POLLNVAL)) == 0)
678 for (pi = procinfo_list; pi; pi = pi->next)
680 if (poll_list[i].fd == pi->fd)
682 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
684 print_sys_errmsg (pi->pathname, errno);
685 error ("PIOCSTATUS failed");
693 error ("wait_fd: Couldn't find procinfo for fd %d\n",
696 #endif /* LOSING_POLL */
705 lookupdesc -- translate a value to a summary desc string
709 static char *lookupdesc (struct trans *transp, unsigned int val);
713 Given a pointer to a translation table and a value to be translated,
714 lookup the desc string and return it.
718 lookupdesc (transp, val)
719 struct trans *transp;
724 for (desc = NULL; transp -> name != NULL; transp++)
726 if (transp -> value == val)
728 desc = transp -> desc;
733 /* Didn't find a translation for the specified value, set a default one. */
746 lookupname -- translate a value to symbolic name
750 static char *lookupname (struct trans *transp, unsigned int val,
755 Given a pointer to a translation table, a value to be translated,
756 and a default prefix to return if the value can't be translated,
757 match the value with one of the translation table entries and
758 return a pointer to the symbolic name.
760 If no match is found it just returns the value as a printable string,
761 with the given prefix. The previous such value, if any, is freed
766 lookupname (transp, val, prefix)
767 struct trans *transp;
774 for (name = NULL; transp -> name != NULL; transp++)
776 if (transp -> value == val)
778 name = transp -> name;
783 /* Didn't find a translation for the specified value, build a default
784 one using the specified prefix and return it. The lifetime of
785 the value is only until the next one is needed. */
793 locbuf = xmalloc (strlen (prefix) + 16);
794 sprintf (locbuf, "%s %u", prefix, val);
806 static char locbuf[32];
808 for (scp = siginfo_table; scp -> codename != NULL; scp++)
810 if ((scp -> signo == sip -> si_signo) &&
811 (scp -> code == sip -> si_code))
813 name = scp -> codename;
819 sprintf (locbuf, "sigcode %u", sip -> si_signo);
832 for (scp = siginfo_table; scp -> codename != NULL; scp++)
834 if ((scp -> signo == sip -> si_signo) &&
835 (scp -> code == sip -> si_code))
843 desc = "Unrecognized signal or trap use";
852 syscallname - translate a system call number into a system call name
856 char *syscallname (int syscallnum)
860 Given a system call number, translate it into the printable name
861 of a system call, or into "syscall <num>" if it is an unknown
866 syscallname (syscallnum)
869 static char locbuf[32];
871 if (syscallnum >= 0 && syscallnum < MAX_SYSCALLS
872 && syscall_table[syscallnum] != NULL)
873 return syscall_table[syscallnum];
876 sprintf (locbuf, "syscall %u", syscallnum);
885 init_syscall_table - initialize syscall translation table
889 void init_syscall_table (void)
893 Dynamically initialize the translation table to convert system
894 call numbers into printable system call names. Done once per
895 gdb run, on initialization.
899 This is awfully ugly, but preprocessor tricks to make it prettier
900 tend to be nonportable.
904 init_syscall_table ()
906 #if defined (SYS_exit)
907 syscall_table[SYS_exit] = "exit";
909 #if defined (SYS_fork)
910 syscall_table[SYS_fork] = "fork";
912 #if defined (SYS_read)
913 syscall_table[SYS_read] = "read";
915 #if defined (SYS_write)
916 syscall_table[SYS_write] = "write";
918 #if defined (SYS_open)
919 syscall_table[SYS_open] = "open";
921 #if defined (SYS_close)
922 syscall_table[SYS_close] = "close";
924 #if defined (SYS_wait)
925 syscall_table[SYS_wait] = "wait";
927 #if defined (SYS_creat)
928 syscall_table[SYS_creat] = "creat";
930 #if defined (SYS_link)
931 syscall_table[SYS_link] = "link";
933 #if defined (SYS_unlink)
934 syscall_table[SYS_unlink] = "unlink";
936 #if defined (SYS_exec)
937 syscall_table[SYS_exec] = "exec";
939 #if defined (SYS_execv)
940 syscall_table[SYS_execv] = "execv";
942 #if defined (SYS_execve)
943 syscall_table[SYS_execve] = "execve";
945 #if defined (SYS_chdir)
946 syscall_table[SYS_chdir] = "chdir";
948 #if defined (SYS_time)
949 syscall_table[SYS_time] = "time";
951 #if defined (SYS_mknod)
952 syscall_table[SYS_mknod] = "mknod";
954 #if defined (SYS_chmod)
955 syscall_table[SYS_chmod] = "chmod";
957 #if defined (SYS_chown)
958 syscall_table[SYS_chown] = "chown";
960 #if defined (SYS_brk)
961 syscall_table[SYS_brk] = "brk";
963 #if defined (SYS_stat)
964 syscall_table[SYS_stat] = "stat";
966 #if defined (SYS_lseek)
967 syscall_table[SYS_lseek] = "lseek";
969 #if defined (SYS_getpid)
970 syscall_table[SYS_getpid] = "getpid";
972 #if defined (SYS_mount)
973 syscall_table[SYS_mount] = "mount";
975 #if defined (SYS_umount)
976 syscall_table[SYS_umount] = "umount";
978 #if defined (SYS_setuid)
979 syscall_table[SYS_setuid] = "setuid";
981 #if defined (SYS_getuid)
982 syscall_table[SYS_getuid] = "getuid";
984 #if defined (SYS_stime)
985 syscall_table[SYS_stime] = "stime";
987 #if defined (SYS_ptrace)
988 syscall_table[SYS_ptrace] = "ptrace";
990 #if defined (SYS_alarm)
991 syscall_table[SYS_alarm] = "alarm";
993 #if defined (SYS_fstat)
994 syscall_table[SYS_fstat] = "fstat";
996 #if defined (SYS_pause)
997 syscall_table[SYS_pause] = "pause";
999 #if defined (SYS_utime)
1000 syscall_table[SYS_utime] = "utime";
1002 #if defined (SYS_stty)
1003 syscall_table[SYS_stty] = "stty";
1005 #if defined (SYS_gtty)
1006 syscall_table[SYS_gtty] = "gtty";
1008 #if defined (SYS_access)
1009 syscall_table[SYS_access] = "access";
1011 #if defined (SYS_nice)
1012 syscall_table[SYS_nice] = "nice";
1014 #if defined (SYS_statfs)
1015 syscall_table[SYS_statfs] = "statfs";
1017 #if defined (SYS_sync)
1018 syscall_table[SYS_sync] = "sync";
1020 #if defined (SYS_kill)
1021 syscall_table[SYS_kill] = "kill";
1023 #if defined (SYS_fstatfs)
1024 syscall_table[SYS_fstatfs] = "fstatfs";
1026 #if defined (SYS_pgrpsys)
1027 syscall_table[SYS_pgrpsys] = "pgrpsys";
1029 #if defined (SYS_xenix)
1030 syscall_table[SYS_xenix] = "xenix";
1032 #if defined (SYS_dup)
1033 syscall_table[SYS_dup] = "dup";
1035 #if defined (SYS_pipe)
1036 syscall_table[SYS_pipe] = "pipe";
1038 #if defined (SYS_times)
1039 syscall_table[SYS_times] = "times";
1041 #if defined (SYS_profil)
1042 syscall_table[SYS_profil] = "profil";
1044 #if defined (SYS_plock)
1045 syscall_table[SYS_plock] = "plock";
1047 #if defined (SYS_setgid)
1048 syscall_table[SYS_setgid] = "setgid";
1050 #if defined (SYS_getgid)
1051 syscall_table[SYS_getgid] = "getgid";
1053 #if defined (SYS_signal)
1054 syscall_table[SYS_signal] = "signal";
1056 #if defined (SYS_msgsys)
1057 syscall_table[SYS_msgsys] = "msgsys";
1059 #if defined (SYS_sys3b)
1060 syscall_table[SYS_sys3b] = "sys3b";
1062 #if defined (SYS_acct)
1063 syscall_table[SYS_acct] = "acct";
1065 #if defined (SYS_shmsys)
1066 syscall_table[SYS_shmsys] = "shmsys";
1068 #if defined (SYS_semsys)
1069 syscall_table[SYS_semsys] = "semsys";
1071 #if defined (SYS_ioctl)
1072 syscall_table[SYS_ioctl] = "ioctl";
1074 #if defined (SYS_uadmin)
1075 syscall_table[SYS_uadmin] = "uadmin";
1077 #if defined (SYS_utssys)
1078 syscall_table[SYS_utssys] = "utssys";
1080 #if defined (SYS_fsync)
1081 syscall_table[SYS_fsync] = "fsync";
1083 #if defined (SYS_umask)
1084 syscall_table[SYS_umask] = "umask";
1086 #if defined (SYS_chroot)
1087 syscall_table[SYS_chroot] = "chroot";
1089 #if defined (SYS_fcntl)
1090 syscall_table[SYS_fcntl] = "fcntl";
1092 #if defined (SYS_ulimit)
1093 syscall_table[SYS_ulimit] = "ulimit";
1095 #if defined (SYS_rfsys)
1096 syscall_table[SYS_rfsys] = "rfsys";
1098 #if defined (SYS_rmdir)
1099 syscall_table[SYS_rmdir] = "rmdir";
1101 #if defined (SYS_mkdir)
1102 syscall_table[SYS_mkdir] = "mkdir";
1104 #if defined (SYS_getdents)
1105 syscall_table[SYS_getdents] = "getdents";
1107 #if defined (SYS_sysfs)
1108 syscall_table[SYS_sysfs] = "sysfs";
1110 #if defined (SYS_getmsg)
1111 syscall_table[SYS_getmsg] = "getmsg";
1113 #if defined (SYS_putmsg)
1114 syscall_table[SYS_putmsg] = "putmsg";
1116 #if defined (SYS_poll)
1117 syscall_table[SYS_poll] = "poll";
1119 #if defined (SYS_lstat)
1120 syscall_table[SYS_lstat] = "lstat";
1122 #if defined (SYS_symlink)
1123 syscall_table[SYS_symlink] = "symlink";
1125 #if defined (SYS_readlink)
1126 syscall_table[SYS_readlink] = "readlink";
1128 #if defined (SYS_setgroups)
1129 syscall_table[SYS_setgroups] = "setgroups";
1131 #if defined (SYS_getgroups)
1132 syscall_table[SYS_getgroups] = "getgroups";
1134 #if defined (SYS_fchmod)
1135 syscall_table[SYS_fchmod] = "fchmod";
1137 #if defined (SYS_fchown)
1138 syscall_table[SYS_fchown] = "fchown";
1140 #if defined (SYS_sigprocmask)
1141 syscall_table[SYS_sigprocmask] = "sigprocmask";
1143 #if defined (SYS_sigsuspend)
1144 syscall_table[SYS_sigsuspend] = "sigsuspend";
1146 #if defined (SYS_sigaltstack)
1147 syscall_table[SYS_sigaltstack] = "sigaltstack";
1149 #if defined (SYS_sigaction)
1150 syscall_table[SYS_sigaction] = "sigaction";
1152 #if defined (SYS_sigpending)
1153 syscall_table[SYS_sigpending] = "sigpending";
1155 #if defined (SYS_context)
1156 syscall_table[SYS_context] = "context";
1158 #if defined (SYS_evsys)
1159 syscall_table[SYS_evsys] = "evsys";
1161 #if defined (SYS_evtrapret)
1162 syscall_table[SYS_evtrapret] = "evtrapret";
1164 #if defined (SYS_statvfs)
1165 syscall_table[SYS_statvfs] = "statvfs";
1167 #if defined (SYS_fstatvfs)
1168 syscall_table[SYS_fstatvfs] = "fstatvfs";
1170 #if defined (SYS_nfssys)
1171 syscall_table[SYS_nfssys] = "nfssys";
1173 #if defined (SYS_waitsys)
1174 syscall_table[SYS_waitsys] = "waitsys";
1176 #if defined (SYS_sigsendsys)
1177 syscall_table[SYS_sigsendsys] = "sigsendsys";
1179 #if defined (SYS_hrtsys)
1180 syscall_table[SYS_hrtsys] = "hrtsys";
1182 #if defined (SYS_acancel)
1183 syscall_table[SYS_acancel] = "acancel";
1185 #if defined (SYS_async)
1186 syscall_table[SYS_async] = "async";
1188 #if defined (SYS_priocntlsys)
1189 syscall_table[SYS_priocntlsys] = "priocntlsys";
1191 #if defined (SYS_pathconf)
1192 syscall_table[SYS_pathconf] = "pathconf";
1194 #if defined (SYS_mincore)
1195 syscall_table[SYS_mincore] = "mincore";
1197 #if defined (SYS_mmap)
1198 syscall_table[SYS_mmap] = "mmap";
1200 #if defined (SYS_mprotect)
1201 syscall_table[SYS_mprotect] = "mprotect";
1203 #if defined (SYS_munmap)
1204 syscall_table[SYS_munmap] = "munmap";
1206 #if defined (SYS_fpathconf)
1207 syscall_table[SYS_fpathconf] = "fpathconf";
1209 #if defined (SYS_vfork)
1210 syscall_table[SYS_vfork] = "vfork";
1212 #if defined (SYS_fchdir)
1213 syscall_table[SYS_fchdir] = "fchdir";
1215 #if defined (SYS_readv)
1216 syscall_table[SYS_readv] = "readv";
1218 #if defined (SYS_writev)
1219 syscall_table[SYS_writev] = "writev";
1221 #if defined (SYS_xstat)
1222 syscall_table[SYS_xstat] = "xstat";
1224 #if defined (SYS_lxstat)
1225 syscall_table[SYS_lxstat] = "lxstat";
1227 #if defined (SYS_fxstat)
1228 syscall_table[SYS_fxstat] = "fxstat";
1230 #if defined (SYS_xmknod)
1231 syscall_table[SYS_xmknod] = "xmknod";
1233 #if defined (SYS_clocal)
1234 syscall_table[SYS_clocal] = "clocal";
1236 #if defined (SYS_setrlimit)
1237 syscall_table[SYS_setrlimit] = "setrlimit";
1239 #if defined (SYS_getrlimit)
1240 syscall_table[SYS_getrlimit] = "getrlimit";
1242 #if defined (SYS_lchown)
1243 syscall_table[SYS_lchown] = "lchown";
1245 #if defined (SYS_memcntl)
1246 syscall_table[SYS_memcntl] = "memcntl";
1248 #if defined (SYS_getpmsg)
1249 syscall_table[SYS_getpmsg] = "getpmsg";
1251 #if defined (SYS_putpmsg)
1252 syscall_table[SYS_putpmsg] = "putpmsg";
1254 #if defined (SYS_rename)
1255 syscall_table[SYS_rename] = "rename";
1257 #if defined (SYS_uname)
1258 syscall_table[SYS_uname] = "uname";
1260 #if defined (SYS_setegid)
1261 syscall_table[SYS_setegid] = "setegid";
1263 #if defined (SYS_sysconfig)
1264 syscall_table[SYS_sysconfig] = "sysconfig";
1266 #if defined (SYS_adjtime)
1267 syscall_table[SYS_adjtime] = "adjtime";
1269 #if defined (SYS_systeminfo)
1270 syscall_table[SYS_systeminfo] = "systeminfo";
1272 #if defined (SYS_seteuid)
1273 syscall_table[SYS_seteuid] = "seteuid";
1275 #if defined (SYS_sproc)
1276 syscall_table[SYS_sproc] = "sproc";
1284 procfs_kill_inferior - kill any currently inferior
1288 void procfs_kill_inferior (void)
1292 Kill any current inferior.
1296 Kills even attached inferiors. Presumably the user has already
1297 been prompted that the inferior is an attached one rather than
1298 one started by gdb. (FIXME?)
1303 procfs_kill_inferior ()
1305 target_mourn_inferior ();
1312 unconditionally_kill_inferior - terminate the inferior
1316 static void unconditionally_kill_inferior (struct procinfo *)
1320 Kill the specified inferior.
1324 A possibly useful enhancement would be to first try sending
1325 the inferior a terminate signal, politely asking it to commit
1326 suicide, before we murder it (we could call that
1327 politely_kill_inferior()).
1332 unconditionally_kill_inferior (pi)
1333 struct procinfo *pi;
1338 ppid = pi->prstatus.pr_ppid;
1342 #ifdef PROCFS_NEED_CLEAR_CURSIG_FOR_KILL
1343 /* Alpha OSF/1-3.x procfs needs a clear of the current signal
1344 before the PIOCKILL, otherwise it might generate a corrupted core
1345 file for the inferior. */
1346 ioctl (pi->fd, PIOCSSIG, NULL);
1348 #ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
1349 /* Alpha OSF/1-2.x procfs needs a PIOCSSIG call with a SIGKILL signal
1350 to kill the inferior, otherwise it might remain stopped with a
1352 We do not check the result of the PIOCSSIG, the inferior might have
1355 struct siginfo newsiginfo;
1357 memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
1358 newsiginfo.si_signo = signo;
1359 newsiginfo.si_code = 0;
1360 newsiginfo.si_errno = 0;
1361 newsiginfo.si_pid = getpid ();
1362 newsiginfo.si_uid = getuid ();
1363 ioctl (pi->fd, PIOCSSIG, &newsiginfo);
1366 ioctl (pi->fd, PIOCKILL, &signo);
1369 close_proc_file (pi);
1371 /* Only wait() for our direct children. Our grandchildren zombies are killed
1372 by the death of their parents. */
1374 if (ppid == getpid())
1382 procfs_xfer_memory -- copy data to or from inferior memory space
1386 int procfs_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
1387 int dowrite, struct target_ops target)
1391 Copy LEN bytes to/from inferior's memory starting at MEMADDR
1392 from/to debugger memory starting at MYADDR. Copy from inferior
1393 if DOWRITE is zero or to inferior if DOWRITE is nonzero.
1395 Returns the length copied, which is either the LEN argument or
1396 zero. This xfer function does not do partial moves, since procfs_ops
1397 doesn't allow memory operations to cross below us in the target stack
1402 The /proc interface makes this an almost trivial task.
1406 procfs_xfer_memory (memaddr, myaddr, len, dowrite, target)
1411 struct target_ops *target; /* ignored */
1414 struct procinfo *pi;
1416 pi = current_procinfo;
1418 if (lseek(pi->fd, (off_t) memaddr, 0) == (off_t) memaddr)
1422 nbytes = write (pi->fd, myaddr, len);
1426 nbytes = read (pi->fd, myaddr, len);
1440 procfs_store_registers -- copy register values back to inferior
1444 void procfs_store_registers (int regno)
1448 Store our current register values back into the inferior. If
1449 REGNO is -1 then store all the register, otherwise store just
1450 the value specified by REGNO.
1454 If we are storing only a single register, we first have to get all
1455 the current values from the process, overwrite the desired register
1456 in the gregset with the one we want from gdb's registers, and then
1457 send the whole set back to the process. For writing all the
1458 registers, all we have to do is generate the gregset and send it to
1461 Also note that the process has to be stopped on an event of interest
1462 for this to work, which basically means that it has to have been
1463 run under the control of one of the other /proc ioctl calls and not
1464 ptrace. Since we don't use ptrace anyway, we don't worry about this
1465 fine point, but it is worth noting for future reference.
1467 Gdb is confused about what this function is supposed to return.
1468 Some versions return a value, others return nothing. Some are
1469 declared to return a value and actually return nothing. Gdb ignores
1470 anything returned. (FIXME)
1475 procfs_store_registers (regno)
1478 struct procinfo *pi;
1480 pi = current_procinfo;
1484 ioctl (pi->fd, PIOCGREG, &pi->gregset);
1486 fill_gregset (&pi->gregset, regno);
1487 ioctl (pi->fd, PIOCSREG, &pi->gregset);
1489 #if defined (FP0_REGNUM)
1491 /* Now repeat everything using the floating point register set, if the
1492 target has floating point hardware. Since we ignore the returned value,
1493 we'll never know whether it worked or not anyway. */
1497 ioctl (pi->fd, PIOCGFPREG, &pi->fpregset);
1499 fill_fpregset (&pi->fpregset, regno);
1500 ioctl (pi->fd, PIOCSFPREG, &pi->fpregset);
1502 #endif /* FP0_REGNUM */
1510 create_procinfo - initialize access to a /proc entry
1514 struct procinfo * create_procinfo (int pid)
1518 Allocate a procinfo structure, open the /proc file and then set up the
1519 set of signals and faults that are to be traced. Returns a pointer to
1520 the new procinfo structure.
1524 If proc_init_failed ever gets called, control returns to the command
1525 processing loop via the standard error handling code.
1529 static struct procinfo *
1530 create_procinfo (pid)
1533 struct procinfo *pi;
1535 pi = find_procinfo (pid, 1);
1537 return pi; /* All done! It already exists */
1539 pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
1541 if (!open_proc_file (pid, pi, O_RDWR))
1542 proc_init_failed (pi, "can't open process file");
1544 /* open_proc_file may modify pid. */
1548 /* Add new process to process info list */
1550 pi->next = procinfo_list;
1553 add_fd (pi); /* Add to list for poll/select */
1555 pi->num_syscall_handlers = 0;
1556 pi->syscall_handlers = NULL;
1557 memset ((char *) &pi->prrun, 0, sizeof (pi->prrun));
1558 prfillset (&pi->prrun.pr_trace);
1559 procfs_notice_signals (pid);
1560 prfillset (&pi->prrun.pr_fault);
1561 prdelset (&pi->prrun.pr_fault, FLTPAGE);
1563 #ifdef PROCFS_DONT_TRACE_FAULTS
1564 premptyset (&pi->prrun.pr_fault);
1567 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
1568 proc_init_failed (pi, "PIOCSTATUS failed");
1570 /* A bug in Solaris (2.5 at least) causes PIOCWSTOP to hang on LWPs that are
1571 already stopped, even if they all have PR_ASYNC set. */
1573 if (!(pi->prstatus.pr_flags & PR_STOPPED))
1574 if (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
1575 proc_init_failed (pi, "PIOCWSTOP failed");
1577 if (ioctl (pi->fd, PIOCSFAULT, &pi->prrun.pr_fault) < 0)
1578 proc_init_failed (pi, "PIOCSFAULT failed");
1587 procfs_exit_handler - handle entry into the _exit syscall
1591 int procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
1595 This routine is called when an inferior process enters the _exit()
1596 system call. It continues the process, and then collects the exit
1597 status and pid which are returned in *statvalp and *rtnvalp. After
1598 that it returns non-zero to indicate that procfs_wait should wake up.
1601 There is probably a better way to do this.
1606 procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
1607 struct procinfo *pi;
1613 pi->prrun.pr_flags = PRCFAULT;
1615 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
1616 perror_with_name (pi->pathname);
1618 *rtnvalp = wait (statvalp);
1629 procfs_exec_handler - handle exit from the exec family of syscalls
1633 int procfs_exec_handler (pi, syscall_num, why, rtnvalp, statvalp)
1637 This routine is called when an inferior process is about to finish any
1638 of the exec() family of system calls. It pretends that we got a
1639 SIGTRAP (for compatibility with ptrace behavior), and returns non-zero
1640 to tell procfs_wait to wake up.
1643 This need for compatibility with ptrace is questionable. In the
1644 future, it shouldn't be necessary.
1649 procfs_exec_handler (pi, syscall_num, why, rtnvalp, statvalp)
1650 struct procinfo *pi;
1656 *statvalp = (SIGTRAP << 8) | 0177;
1661 #ifdef SYS_sproc /* IRIX lwp creation system call */
1667 procfs_sproc_handler - handle exit from the sproc syscall
1671 int procfs_sproc_handler (pi, syscall_num, why, rtnvalp, statvalp)
1675 This routine is called when an inferior process is about to finish an
1676 sproc() system call. This is the system call that IRIX uses to create
1677 a lightweight process. When the target process gets this event, we can
1678 look at rval1 to find the new child processes ID, and create a new
1679 procinfo struct from that.
1681 After that, it pretends that we got a SIGTRAP, and returns non-zero
1682 to tell procfs_wait to wake up. Subsequently, wait_for_inferior gets
1683 woken up, sees the new process and continues it.
1686 We actually never see the child exiting from sproc because we will
1687 shortly stop the child with PIOCSTOP, which is then registered as the
1692 procfs_sproc_handler (pi, syscall_num, why, rtnvalp, statvalp)
1693 struct procinfo *pi;
1699 /* We've just detected the completion of an sproc system call. Now we need to
1700 setup a procinfo struct for this thread, and notify the thread system of the
1703 /* If sproc failed, then nothing interesting happened. Continue the process
1704 and go back to sleep. */
1706 if (pi->prstatus.pr_errno != 0)
1708 pi->prrun.pr_flags &= PRSTEP;
1709 pi->prrun.pr_flags |= PRCFAULT;
1711 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
1712 perror_with_name (pi->pathname);
1717 /* At this point, the new thread is stopped at it's first instruction, and
1718 the parent is stopped at the exit from sproc. */
1720 /* Notify the caller of the arrival of a new thread. */
1721 create_procinfo (pi->prstatus.pr_rval1);
1723 *rtnvalp = pi->prstatus.pr_rval1;
1724 *statvalp = (SIGTRAP << 8) | 0177;
1733 procfs_fork_handler - handle exit from the fork syscall
1737 int procfs_fork_handler (pi, syscall_num, why, rtnvalp, statvalp)
1741 This routine is called when an inferior process is about to finish a
1742 fork() system call. We will open up the new process, and then close
1743 it, which releases it from the clutches of the debugger.
1745 After that, we continue the target process as though nothing had
1749 This is necessary for IRIX because we have to set PR_FORK in order
1750 to catch the creation of lwps (via sproc()). When an actual fork
1751 occurs, it becomes necessary to reset the forks debugger flags and
1752 continue it because we can't hack multiple processes yet.
1756 procfs_fork_handler (pi, syscall_num, why, rtnvalp, statvalp)
1757 struct procinfo *pi;
1763 struct procinfo *pitemp;
1765 /* At this point, we've detected the completion of a fork (or vfork) call in
1766 our child. The grandchild is also stopped because we set inherit-on-fork
1767 earlier. (Note that nobody has the grandchilds' /proc file open at this
1768 point.) We will release the grandchild from the debugger by opening it's
1769 /proc file and then closing it. Since run-on-last-close is set, the
1770 grandchild continues on its' merry way. */
1773 pitemp = create_procinfo (pi->prstatus.pr_rval1);
1775 close_proc_file (pitemp);
1777 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
1778 perror_with_name (pi->pathname);
1782 #endif /* SYS_sproc */
1788 procfs_init_inferior - initialize target vector and access to a
1793 int procfs_init_inferior (int pid)
1797 When gdb starts an inferior, this function is called in the parent
1798 process immediately after the fork. It waits for the child to stop
1799 on the return from the exec system call (the child itself takes care
1800 of ensuring that this is set up), then sets up the set of signals
1801 and faults that are to be traced. Returns the pid, which may have had
1802 the thread-id added to it.
1806 If proc_init_failed ever gets called, control returns to the command
1807 processing loop via the standard error handling code.
1812 procfs_init_inferior (pid)
1815 struct procinfo *pip;
1817 push_target (&procfs_ops);
1819 pip = create_procinfo (pid);
1821 procfs_set_syscall_trap (pip, SYS_exit, PROCFS_SYSCALL_ENTRY,
1822 procfs_exit_handler);
1824 #ifndef PRFS_STOPEXEC
1826 procfs_set_syscall_trap (pip, SYS_exec, PROCFS_SYSCALL_EXIT,
1827 procfs_exec_handler);
1830 procfs_set_syscall_trap (pip, SYS_execv, PROCFS_SYSCALL_EXIT,
1831 procfs_exec_handler);
1834 procfs_set_syscall_trap (pip, SYS_execve, PROCFS_SYSCALL_EXIT,
1835 procfs_exec_handler);
1837 #endif /* PRFS_STOPEXEC */
1839 /* Setup traps on exit from sproc() */
1842 procfs_set_syscall_trap (pip, SYS_sproc, PROCFS_SYSCALL_EXIT,
1843 procfs_sproc_handler);
1844 procfs_set_syscall_trap (pip, SYS_fork, PROCFS_SYSCALL_EXIT,
1845 procfs_fork_handler);
1847 procfs_set_syscall_trap (pip, SYS_vfork, PROCFS_SYSCALL_EXIT,
1848 procfs_fork_handler);
1850 /* Turn on inherit-on-fork flag so that all children of the target process
1851 start with tracing flags set. This allows us to trap lwp creation. Note
1852 that we also have to trap on fork and vfork in order to disable all tracing
1853 in the targets child processes. */
1855 modify_inherit_on_fork_flag (pip->fd, 1);
1858 #ifdef SYS_lwp_create
1859 procfs_set_syscall_trap (pip, SYS_lwp_create, PROCFS_SYSCALL_EXIT,
1860 procfs_lwp_creation_handler);
1863 /* create_procinfo may change the pid, so we have to update inferior_pid
1864 here before calling other gdb routines that need the right pid. */
1869 add_thread (pip -> pid); /* Setup initial thread */
1871 #ifdef START_INFERIOR_TRAPS_EXPECTED
1872 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
1874 /* One trap to exec the shell, one to exec the program being debugged. */
1875 startup_inferior (2);
1885 procfs_notice_signals
1889 static void procfs_notice_signals (int pid);
1893 When the user changes the state of gdb's signal handling via the
1894 "handle" command, this function gets called to see if any change
1895 in the /proc interface is required. It is also called internally
1896 by other /proc interface functions to initialize the state of
1897 the traced signal set.
1899 One thing it does is that signals for which the state is "nostop",
1900 "noprint", and "pass", have their trace bits reset in the pr_trace
1901 field, so that they are no longer traced. This allows them to be
1902 delivered directly to the inferior without the debugger ever being
1907 procfs_notice_signals (pid)
1911 struct procinfo *pi;
1913 pi = find_procinfo (pid, 0);
1915 for (signo = 0; signo < NSIG; signo++)
1917 if (signal_stop_state (target_signal_from_host (signo)) == 0 &&
1918 signal_print_state (target_signal_from_host (signo)) == 0 &&
1919 signal_pass_state (target_signal_from_host (signo)) == 1)
1921 prdelset (&pi->prrun.pr_trace, signo);
1925 praddset (&pi->prrun.pr_trace, signo);
1928 if (ioctl (pi->fd, PIOCSTRACE, &pi->prrun.pr_trace))
1930 print_sys_errmsg ("PIOCSTRACE failed", errno);
1938 proc_set_exec_trap -- arrange for exec'd child to halt at startup
1942 void proc_set_exec_trap (void)
1946 This function is called in the child process when starting up
1947 an inferior, prior to doing the exec of the actual inferior.
1948 It sets the child process's exitset to make exit from the exec
1949 system call an event of interest to stop on, and then simply
1950 returns. The child does the exec, the system call returns, and
1951 the child stops at the first instruction, ready for the gdb
1952 parent process to take control of it.
1956 We need to use all local variables since the child may be sharing
1957 it's data space with the parent, if vfork was used rather than
1960 Also note that we want to turn off the inherit-on-fork flag in
1961 the child process so that any grand-children start with all
1962 tracing flags cleared.
1966 proc_set_exec_trap ()
1970 auto char procname[32];
1973 sprintf (procname, PROC_NAME_FMT, getpid ());
1974 if ((fd = open (procname, O_RDWR)) < 0)
1977 gdb_flush (gdb_stderr);
1980 premptyset (&exitset);
1981 premptyset (&entryset);
1984 /* Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
1985 exits from exec system calls because of the user level loader. */
1989 if (ioctl (fd, PIOCGSPCACT, &prfs_flags) < 0)
1992 gdb_flush (gdb_stderr);
1995 prfs_flags |= PRFS_STOPEXEC;
1996 if (ioctl (fd, PIOCSSPCACT, &prfs_flags) < 0)
1999 gdb_flush (gdb_stderr);
2005 Not all systems with /proc have all the exec* syscalls with the same
2006 names. On the SGI, for example, there is no SYS_exec, but there
2007 *is* a SYS_execv. So, we try to account for that. */
2010 praddset (&exitset, SYS_exec);
2013 praddset (&exitset, SYS_execve);
2016 praddset (&exitset, SYS_execv);
2019 if (ioctl (fd, PIOCSEXIT, &exitset) < 0)
2022 gdb_flush (gdb_stderr);
2027 praddset (&entryset, SYS_exit);
2029 if (ioctl (fd, PIOCSENTRY, &entryset) < 0)
2032 gdb_flush (gdb_stderr);
2036 /* Turn off inherit-on-fork flag so that all grand-children of gdb
2037 start with tracing flags cleared. */
2039 modify_inherit_on_fork_flag (fd, 0);
2041 /* Turn on run-on-last-close flag so that this process will not hang
2042 if GDB goes away for some reason. */
2044 modify_run_on_last_close_flag (fd, 1);
2050 /* Solaris needs this to make procfs treat all threads seperately. Without
2051 this, all threads halt whenever something happens to any thread. Since
2052 GDB wants to control all this itself, it needs to set PR_ASYNC. */
2054 pr_flags = PR_ASYNC;
2056 ioctl (fd, PIOCSET, &pr_flags);
2058 #endif /* PR_ASYNC */
2065 proc_iterate_over_mappings -- call function for every mapped space
2069 int proc_iterate_over_mappings (int (*func)())
2073 Given a pointer to a function, call that function for every
2074 mapped address space, passing it an open file descriptor for
2075 the file corresponding to that mapped address space (if any)
2076 and the base address of the mapped space. Quit when we hit
2077 the end of the mappings or the function returns nonzero.
2081 proc_iterate_over_mappings (func)
2082 int (*func) PARAMS ((int, CORE_ADDR));
2087 struct prmap *prmaps;
2088 struct prmap *prmap;
2089 struct procinfo *pi;
2091 pi = current_procinfo;
2093 if (ioctl (pi->fd, PIOCNMAP, &nmap) == 0)
2095 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
2096 if (ioctl (pi->fd, PIOCMAP, prmaps) == 0)
2098 for (prmap = prmaps; prmap -> pr_size && funcstat == 0; ++prmap)
2100 fd = proc_address_to_fd (pi, (CORE_ADDR) prmap -> pr_vaddr, 0);
2101 funcstat = (*func) (fd, (CORE_ADDR) prmap -> pr_vaddr);
2109 #if 0 /* Currently unused */
2114 proc_base_address -- find base address for segment containing address
2118 CORE_ADDR proc_base_address (CORE_ADDR addr)
2122 Given an address of a location in the inferior, find and return
2123 the base address of the mapped segment containing that address.
2125 This is used for example, by the shared library support code,
2126 where we have the pc value for some location in the shared library
2127 where we are stopped, and need to know the base address of the
2128 segment containing that address.
2132 proc_base_address (addr)
2136 struct prmap *prmaps;
2137 struct prmap *prmap;
2138 CORE_ADDR baseaddr = 0;
2139 struct procinfo *pi;
2141 pi = current_procinfo;
2143 if (ioctl (pi->fd, PIOCNMAP, &nmap) == 0)
2145 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
2146 if (ioctl (pi->fd, PIOCMAP, prmaps) == 0)
2148 for (prmap = prmaps; prmap -> pr_size; ++prmap)
2150 if ((prmap -> pr_vaddr <= (caddr_t) addr) &&
2151 (prmap -> pr_vaddr + prmap -> pr_size > (caddr_t) addr))
2153 baseaddr = (CORE_ADDR) prmap -> pr_vaddr;
2168 proc_address_to_fd -- return open fd for file mapped to address
2172 int proc_address_to_fd (struct procinfo *pi, CORE_ADDR addr, complain)
2176 Given an address in the current inferior's address space, use the
2177 /proc interface to find an open file descriptor for the file that
2178 this address was mapped in from. Return -1 if there is no current
2179 inferior. Print a warning message if there is an inferior but
2180 the address corresponds to no file (IE a bogus address).
2185 proc_address_to_fd (pi, addr, complain)
2186 struct procinfo *pi;
2192 if ((fd = ioctl (pi->fd, PIOCOPENM, (caddr_t *) &addr)) < 0)
2196 print_sys_errmsg (pi->pathname, errno);
2197 warning ("can't find mapped file for address 0x%x", addr);
2204 /* Attach to process PID, then initialize for debugging it
2205 and wait for the trace-trap that results from attaching. */
2208 procfs_attach (args, from_tty)
2216 error_no_arg ("process-id to attach");
2220 if (pid == getpid()) /* Trying to masturbate? */
2221 error ("I refuse to debug myself!");
2225 exec_file = (char *) get_exec_file (0);
2228 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file, target_pid_to_str (pid));
2230 printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid));
2232 gdb_flush (gdb_stdout);
2235 inferior_pid = pid = do_attach (pid);
2236 push_target (&procfs_ops);
2240 /* Take a program previously attached to and detaches it.
2241 The program resumes execution and will no longer stop
2242 on signals, etc. We'd better not have left any breakpoints
2243 in the program or it'll die when it hits one. For this
2244 to work, it may be necessary for the process to have been
2245 previously attached. It *might* work if the program was
2246 started via the normal ptrace (PTRACE_TRACEME). */
2249 procfs_detach (args, from_tty)
2257 char *exec_file = get_exec_file (0);
2260 printf_unfiltered ("Detaching from program: %s %s\n",
2261 exec_file, target_pid_to_str (inferior_pid));
2262 gdb_flush (gdb_stdout);
2265 siggnal = atoi (args);
2267 do_detach (siggnal);
2269 unpush_target (&procfs_ops); /* Pop out of handling an inferior */
2272 /* Get ready to modify the registers array. On machines which store
2273 individual registers, this doesn't need to do anything. On machines
2274 which store all the registers in one fell swoop, this makes sure
2275 that registers contains all the registers from the program being
2279 procfs_prepare_to_store ()
2281 #ifdef CHILD_PREPARE_TO_STORE
2282 CHILD_PREPARE_TO_STORE ();
2286 /* Print status information about what we're accessing. */
2289 procfs_files_info (ignore)
2290 struct target_ops *ignore;
2292 printf_unfiltered ("\tUsing the running image of %s %s via /proc.\n",
2293 attach_flag? "attached": "child", target_pid_to_str (inferior_pid));
2298 procfs_open (arg, from_tty)
2302 error ("Use the \"run\" command to start a Unix child process.");
2309 do_attach -- attach to an already existing process
2313 int do_attach (int pid)
2317 Attach to an already existing process with the specified process
2318 id. If the process is not already stopped, query whether to
2323 The option of stopping at attach time is specific to the /proc
2324 versions of gdb. Versions using ptrace force the attachee
2325 to stop. (I have changed this version to do so, too. All you
2334 struct procinfo *pi;
2336 pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
2338 if (!open_proc_file (pid, pi, O_RDWR))
2341 perror_with_name (pi->pathname);
2347 /* Add new process to process info list */
2349 pi->next = procinfo_list;
2352 add_fd (pi); /* Add to list for poll/select */
2354 /* Get current status of process and if it is not already stopped,
2355 then stop it. Remember whether or not it was stopped when we first
2358 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
2360 print_sys_errmsg (pi->pathname, errno);
2361 close_proc_file (pi);
2362 error ("PIOCSTATUS failed");
2364 if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
2366 pi->was_stopped = 1;
2370 pi->was_stopped = 0;
2371 if (1 || query ("Process is currently running, stop it? "))
2373 /* Make it run again when we close it. */
2375 modify_run_on_last_close_flag (pi->fd, 1);
2377 if (ioctl (pi->fd, PIOCSTOP, &pi->prstatus) < 0)
2379 print_sys_errmsg (pi->pathname, errno);
2380 close_proc_file (pi);
2381 error ("PIOCSTOP failed");
2383 pi->nopass_next_sigstop = 1;
2387 printf_unfiltered ("Ok, gdb will wait for %s to stop.\n", target_pid_to_str (pid));
2391 /* Remember some things about the inferior that we will, or might, change
2392 so that we can restore them when we detach. */
2394 ioctl (pi->fd, PIOCGTRACE, &pi->saved_trace);
2395 ioctl (pi->fd, PIOCGHOLD, &pi->saved_sighold);
2396 ioctl (pi->fd, PIOCGFAULT, &pi->saved_fltset);
2397 ioctl (pi->fd, PIOCGENTRY, &pi->saved_entryset);
2398 ioctl (pi->fd, PIOCGEXIT, &pi->saved_exitset);
2400 /* Set up trace and fault sets, as gdb expects them. */
2402 memset (&pi->prrun, 0, sizeof (pi->prrun));
2403 prfillset (&pi->prrun.pr_trace);
2404 procfs_notice_signals (pid);
2405 prfillset (&pi->prrun.pr_fault);
2406 prdelset (&pi->prrun.pr_fault, FLTPAGE);
2408 #ifdef PROCFS_DONT_TRACE_FAULTS
2409 premptyset (&pi->prrun.pr_fault);
2412 if (ioctl (pi->fd, PIOCSFAULT, &pi->prrun.pr_fault))
2414 print_sys_errmsg ("PIOCSFAULT failed", errno);
2416 if (ioctl (pi->fd, PIOCSTRACE, &pi->prrun.pr_trace))
2418 print_sys_errmsg ("PIOCSTRACE failed", errno);
2428 do_detach -- detach from an attached-to process
2432 void do_detach (int signal)
2436 Detach from the current attachee.
2438 If signal is non-zero, the attachee is started running again and sent
2439 the specified signal.
2441 If signal is zero and the attachee was not already stopped when we
2442 attached to it, then we make it runnable again when we detach.
2444 Otherwise, we query whether or not to make the attachee runnable
2445 again, since we may simply want to leave it in the state it was in
2448 We report any problems, but do not consider them errors, since we
2449 MUST detach even if some things don't seem to go right. This may not
2450 be the ideal situation. (FIXME).
2457 struct procinfo *pi;
2459 pi = current_procinfo;
2463 set_proc_siginfo (pi, signal);
2465 if (ioctl (pi->fd, PIOCSEXIT, &pi->saved_exitset) < 0)
2467 print_sys_errmsg (pi->pathname, errno);
2468 printf_unfiltered ("PIOCSEXIT failed.\n");
2470 if (ioctl (pi->fd, PIOCSENTRY, &pi->saved_entryset) < 0)
2472 print_sys_errmsg (pi->pathname, errno);
2473 printf_unfiltered ("PIOCSENTRY failed.\n");
2475 if (ioctl (pi->fd, PIOCSTRACE, &pi->saved_trace) < 0)
2477 print_sys_errmsg (pi->pathname, errno);
2478 printf_unfiltered ("PIOCSTRACE failed.\n");
2480 if (ioctl (pi->fd, PIOCSHOLD, &pi->saved_sighold) < 0)
2482 print_sys_errmsg (pi->pathname, errno);
2483 printf_unfiltered ("PIOSCHOLD failed.\n");
2485 if (ioctl (pi->fd, PIOCSFAULT, &pi->saved_fltset) < 0)
2487 print_sys_errmsg (pi->pathname, errno);
2488 printf_unfiltered ("PIOCSFAULT failed.\n");
2490 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
2492 print_sys_errmsg (pi->pathname, errno);
2493 printf_unfiltered ("PIOCSTATUS failed.\n");
2497 if (signal || (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
2499 if (signal || !pi->was_stopped ||
2500 query ("Was stopped when attached, make it runnable again? "))
2502 /* Clear any pending signal if we want to detach without
2505 set_proc_siginfo (pi, signal);
2507 /* Clear any fault that might have stopped it. */
2508 if (ioctl (pi->fd, PIOCCFAULT, 0))
2510 print_sys_errmsg (pi->pathname, errno);
2511 printf_unfiltered ("PIOCCFAULT failed.\n");
2514 /* Make it run again when we close it. */
2516 modify_run_on_last_close_flag (pi->fd, 1);
2520 close_proc_file (pi);
2524 /* emulate wait() as much as possible.
2525 Wait for child to do something. Return pid of child, or -1 in case
2526 of error; store status in *OURSTATUS.
2528 Not sure why we can't
2529 just use wait(), but it seems to have problems when applied to a
2530 process being controlled with the /proc interface.
2532 We have a race problem here with no obvious solution. We need to let
2533 the inferior run until it stops on an event of interest, which means
2534 that we need to use the PIOCWSTOP ioctl. However, we cannot use this
2535 ioctl if the process is already stopped on something that is not an
2536 event of interest, or the call will hang indefinitely. Thus we first
2537 use PIOCSTATUS to see if the process is not stopped. If not, then we
2538 use PIOCWSTOP. But during the window between the two, if the process
2539 stops for any reason that is not an event of interest (such as a job
2540 control signal) then gdb will hang. One possible workaround is to set
2541 an alarm to wake up every minute of so and check to see if the process
2542 is still running, and if so, then reissue the PIOCWSTOP. But this is
2543 a real kludge, so has not been implemented. FIXME: investigate
2546 FIXME: Investigate why wait() seems to have problems with programs
2547 being control by /proc routines. */
2550 procfs_wait (pid, ourstatus)
2552 struct target_waitstatus *ourstatus;
2559 struct procinfo *pi;
2561 if (pid != -1) /* Non-specific process? */
2564 for (pi = procinfo_list; pi; pi = pi->next)
2579 for (pi = procinfo_list; pi; pi = pi->next)
2580 if (pi->pid == pid && pi->had_event)
2583 if (!pi && !checkerr)
2586 if (!checkerr && !(pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
2588 if (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
2595 if (errno == ENOENT)
2597 rtnval = wait (&statval);
2598 if (rtnval != inferior_pid)
2600 print_sys_errmsg (pi->pathname, errno);
2601 error ("PIOCWSTOP, wait failed, returned %d", rtnval);
2607 print_sys_errmsg (pi->pathname, errno);
2608 error ("PIOCSTATUS or PIOCWSTOP failed.");
2612 else if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
2615 why = pi->prstatus.pr_why;
2616 what = pi->prstatus.pr_what;
2621 statval = (what << 8) | 0177;
2627 int found_handler = 0;
2629 for (i = 0; i < pi->num_syscall_handlers; i++)
2630 if (pi->syscall_handlers[i].syscall_num == what)
2633 if (!pi->syscall_handlers[i].func (pi, what, why,
2641 if (why == PR_SYSENTRY)
2642 error ("PR_SYSENTRY, unhandled system call %d", what);
2644 error ("PR_SYSEXIT, unhandled system call %d", what);
2648 statval = (SIGSTOP << 8) | 0177;
2651 statval = (what << 8) | 0177;
2658 statval = (SIGTRAP << 8) | 0177;
2663 statval = (SIGTRAP << 8) | 0177;
2666 #ifndef FAULTED_USE_SIGINFO
2667 /* Irix, contrary to the documentation, fills in 0 for si_signo.
2668 Solaris fills in si_signo. I'm not sure about others. */
2671 statval = (SIGILL << 8) | 0177;
2675 statval = (SIGTRAP << 8) | 0177;
2680 statval = (SIGSEGV << 8) | 0177;
2685 statval = (SIGFPE << 8) | 0177;
2687 case FLTPAGE: /* Recoverable page fault */
2688 #endif /* not FAULTED_USE_SIGINFO */
2690 /* Use the signal which the kernel assigns. This is better than
2691 trying to second-guess it from the fault. In fact, I suspect
2692 that FLTACCESS can be either SIGSEGV or SIGBUS. */
2693 statval = ((pi->prstatus.pr_info.si_signo) << 8) | 0177;
2698 error ("PIOCWSTOP, unknown why %d, what %d", why, what);
2700 /* Stop all the other threads when any of them stops. */
2703 struct procinfo *procinfo;
2705 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
2707 if (!procinfo->had_event)
2709 /* A bug in Solaris (2.5) causes us to hang when trying to
2710 stop a stopped process. So, we have to check first in
2711 order to avoid the hang. */
2712 if (ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus) < 0)
2714 print_sys_errmsg (procinfo->pathname, errno);
2715 error ("PIOCSTATUS failed");
2717 if (!(procinfo->prstatus.pr_flags & PR_STOPPED))
2718 if (ioctl (procinfo->fd, PIOCSTOP, &procinfo->prstatus) < 0)
2720 print_sys_errmsg (procinfo->pathname, errno);
2721 error ("PIOCSTOP failed");
2729 error ("PIOCWSTOP, stopped for unknown/unhandled reason, flags %#x",
2730 pi->prstatus.pr_flags);
2733 store_waitstatus (ourstatus, statval);
2735 if (rtnval == -1) /* No more children to wait for */
2737 fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing.\n");
2738 /* Claim it exited with unknown signal. */
2739 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
2740 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
2744 pi->had_event = 0; /* Indicate that we've seen this one */
2752 set_proc_siginfo - set a process's current signal info
2756 void set_proc_siginfo (struct procinfo *pip, int signo);
2760 Given a pointer to a process info struct in PIP and a signal number
2761 in SIGNO, set the process's current signal and its associated signal
2762 information. The signal will be delivered to the process immediately
2763 after execution is resumed, even if it is being held. In addition,
2764 this particular delivery will not cause another PR_SIGNALLED stop
2765 even if the signal is being traced.
2767 If we are not delivering the same signal that the prstatus siginfo
2768 struct contains information about, then synthesize a siginfo struct
2769 to match the signal we are doing to deliver, make it of the type
2770 "generated by a user process", and send this synthesized copy. When
2771 used to set the inferior's signal state, this will be required if we
2772 are not currently stopped because of a traced signal, or if we decide
2773 to continue with a different signal.
2775 Note that when continuing the inferior from a stop due to receipt
2776 of a traced signal, we either have set PRCSIG to clear the existing
2777 signal, or we have to call this function to do a PIOCSSIG with either
2778 the existing siginfo struct from pr_info, or one we have synthesized
2779 appropriately for the signal we want to deliver. Otherwise if the
2780 signal is still being traced, the inferior will immediately stop
2783 See siginfo(5) for more details.
2787 set_proc_siginfo (pip, signo)
2788 struct procinfo *pip;
2791 struct siginfo newsiginfo;
2792 struct siginfo *sip;
2794 #ifdef PROCFS_DONT_PIOCSSIG_CURSIG
2795 /* With Alpha OSF/1 procfs, the kernel gets really confused if it
2796 receives a PIOCSSIG with a signal identical to the current signal,
2797 it messes up the current signal. Work around the kernel bug. */
2798 if (signo == pip -> prstatus.pr_cursig)
2802 if (signo == pip -> prstatus.pr_info.si_signo)
2804 sip = &pip -> prstatus.pr_info;
2808 memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
2810 sip -> si_signo = signo;
2812 sip -> si_errno = 0;
2813 sip -> si_pid = getpid ();
2814 sip -> si_uid = getuid ();
2816 if (ioctl (pip -> fd, PIOCSSIG, sip) < 0)
2818 print_sys_errmsg (pip -> pathname, errno);
2819 warning ("PIOCSSIG failed");
2823 /* Resume execution of process PID. If STEP is nozero, then
2824 just single step it. If SIGNAL is nonzero, restart it with that
2825 signal activated. */
2828 procfs_resume (pid, step, signo)
2831 enum target_signal signo;
2834 struct procinfo *pi, *procinfo;
2836 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
2839 pi->prrun.pr_flags = PRSTRACE | PRSFAULT | PRCFAULT;
2842 /* It should not be necessary. If the user explicitly changes the value,
2843 value_assign calls write_register_bytes, which writes it. */
2844 /* It may not be absolutely necessary to specify the PC value for
2845 restarting, but to be safe we use the value that gdb considers
2846 to be current. One case where this might be necessary is if the
2847 user explicitly changes the PC value that gdb considers to be
2848 current. FIXME: Investigate if this is necessary or not. */
2850 #ifdef PRSVADDR_BROKEN
2851 /* Can't do this under Solaris running on a Sparc, as there seems to be no
2852 place to put nPC. In fact, if you use this, nPC seems to be set to some
2853 random garbage. We have to rely on the fact that PC and nPC have been
2854 written previously via PIOCSREG during a register flush. */
2856 pi->prrun.pr_vaddr = (caddr_t) *(int *) ®isters[REGISTER_BYTE (PC_REGNUM)];
2857 pi->prrun.pr_flags != PRSVADDR;
2861 if (signo == TARGET_SIGNAL_STOP && pi->nopass_next_sigstop)
2862 /* When attaching to a child process, if we forced it to stop with
2863 a PIOCSTOP, then we will have set the nopass_next_sigstop flag.
2864 Upon resuming the first time after such a stop, we explicitly
2865 inhibit sending it another SIGSTOP, which would be the normal
2866 result of default signal handling. One potential drawback to
2867 this is that we will also ignore any attempt to by the user
2868 to explicitly continue after the attach with a SIGSTOP. Ultimately
2869 this problem should be dealt with by making the routines that
2870 deal with the inferior a little smarter, and possibly even allow
2871 an inferior to continue running at the same time as gdb. (FIXME?) */
2873 else if (signo == TARGET_SIGNAL_TSTP
2874 && pi->prstatus.pr_cursig == SIGTSTP
2875 && pi->prstatus.pr_action.sa_handler == SIG_DFL)
2877 /* We are about to pass the inferior a SIGTSTP whose action is
2878 SIG_DFL. The SIG_DFL action for a SIGTSTP is to stop
2879 (notifying the parent via wait()), and then keep going from the
2880 same place when the parent is ready for you to keep going. So
2881 under the debugger, it should do nothing (as if the program had
2882 been stopped and then later resumed. Under ptrace, this
2883 happens for us, but under /proc, the system obligingly stops
2884 the process, and wait_for_inferior would have no way of
2885 distinguishing that type of stop (which indicates that we
2886 should just start it again), with a stop due to the pr_trace
2887 field of the prrun_t struct.
2889 Note that if the SIGTSTP is being caught, we *do* need to pass it,
2890 because the handler needs to get executed. */
2893 signal_to_pass = target_signal_to_host (signo);
2897 set_proc_siginfo (pi, signal_to_pass);
2901 pi->prrun.pr_flags |= PRCSIG;
2903 pi->nopass_next_sigstop = 0;
2906 pi->prrun.pr_flags |= PRSTEP;
2909 /* Don't try to start a process unless it's stopped on an
2910 `event of interest'. Doing so will cause errors. */
2912 if ((pi->prstatus.pr_flags & PR_ISTOP)
2913 && ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
2915 perror_with_name (pi->pathname);
2921 /* Continue all the other threads that haven't had an event of
2925 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
2927 if (pi != procinfo && !procinfo->had_event)
2929 procinfo->prrun.pr_flags &= PRSTEP;
2930 procinfo->prrun.pr_flags |= PRCFAULT | PRCSIG;
2931 ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus);
2933 /* Don't try to start a process unless it's stopped on an
2934 `event of interest'. Doing so will cause errors. */
2936 if ((procinfo->prstatus.pr_flags & PR_ISTOP)
2937 && ioctl (procinfo->fd, PIOCRUN, &procinfo->prrun) < 0)
2939 if (ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus) < 0)
2941 fprintf_unfiltered(gdb_stderr, "PIOCSTATUS failed, errno=%d\n", errno);
2943 print_sys_errmsg (procinfo->pathname, errno);
2944 error ("PIOCRUN failed");
2946 ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus);
2955 procfs_fetch_registers -- fetch current registers from inferior
2959 void procfs_fetch_registers (int regno)
2963 Read the current values of the inferior's registers, both the
2964 general register set and floating point registers (if supported)
2965 and update gdb's idea of their current values.
2970 procfs_fetch_registers (regno)
2973 struct procinfo *pi;
2975 pi = current_procinfo;
2977 if (ioctl (pi->fd, PIOCGREG, &pi->gregset) != -1)
2979 supply_gregset (&pi->gregset);
2981 #if defined (FP0_REGNUM)
2982 if (ioctl (pi->fd, PIOCGFPREG, &pi->fpregset) != -1)
2984 supply_fpregset (&pi->fpregset);
2993 proc_init_failed - called whenever /proc access initialization
2998 static void proc_init_failed (struct procinfo *pi, char *why)
3002 This function is called whenever initialization of access to a /proc
3003 entry fails. It prints a suitable error message, does some cleanup,
3004 and then invokes the standard error processing routine which dumps
3005 us back into the command loop.
3009 proc_init_failed (pi, why)
3010 struct procinfo *pi;
3013 print_sys_errmsg (pi->pathname, errno);
3014 kill (pi->pid, SIGKILL);
3015 close_proc_file (pi);
3024 close_proc_file - close any currently open /proc entry
3028 static void close_proc_file (struct procinfo *pip)
3032 Close any currently open /proc entry and mark the process information
3033 entry as invalid. In order to ensure that we don't try to reuse any
3034 stale information, the pid, fd, and pathnames are explicitly
3035 invalidated, which may be overkill.
3040 close_proc_file (pip)
3041 struct procinfo *pip;
3043 struct procinfo *procinfo;
3045 remove_fd (pip); /* Remove fd from poll/select list */
3049 free (pip -> pathname);
3051 /* Unlink pip from the procinfo chain. Note pip might not be on the list. */
3053 if (procinfo_list == pip)
3054 procinfo_list = pip->next;
3056 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
3057 if (procinfo->next == pip)
3058 procinfo->next = pip->next;
3067 open_proc_file - open a /proc entry for a given process id
3071 static int open_proc_file (int pid, struct procinfo *pip, int mode)
3075 Given a process id and a mode, close the existing open /proc
3076 entry (if any) and open one for the new process id, in the
3077 specified mode. Once it is open, then mark the local process
3078 information structure as valid, which guarantees that the pid,
3079 fd, and pathname fields match an open /proc entry. Returns
3080 zero if the open fails, nonzero otherwise.
3082 Note that the pathname is left intact, even when the open fails,
3083 so that callers can use it to construct meaningful error messages
3084 rather than just "file open failed".
3086 Note that for Solaris, the process-id also includes an LWP-id, so we
3087 actually attempt to open that. If we are handed a pid with a 0 LWP-id,
3088 then we will ask the kernel what it is and add it to the pid. Hence,
3089 the pid can be changed by us.
3093 open_proc_file (pid, pip, mode)
3095 struct procinfo *pip;
3101 pip -> had_event = 0;
3102 pip -> pathname = xmalloc (32);
3111 sprintf (pip -> pathname, PROC_NAME_FMT, tmp);
3112 if ((tmpfd = open (pip -> pathname, mode)) < 0)
3118 tmp = (pid >> 16) & 0xffff; /* Extract thread id */
3121 { /* Don't know thread id yet */
3122 if (ioctl (tmpfd, PIOCSTATUS, &pip -> prstatus) < 0)
3124 print_sys_errmsg (pip -> pathname, errno);
3126 error ("open_proc_file: PIOCSTATUS failed");
3129 tmp = pip -> prstatus.pr_who; /* Get thread id from prstatus_t */
3130 pip -> pid = (tmp << 16) | pid; /* Update pip */
3133 if ((pip -> fd = ioctl (tmpfd, PIOCOPENLWP, &tmp)) < 0)
3139 #ifdef PIOCSET /* New method */
3142 pr_flags = PR_ASYNC;
3143 ioctl (pip -> fd, PIOCSET, &pr_flags);
3147 close (tmpfd); /* All done with main pid */
3148 #endif /* PIOCOPENLWP */
3154 mappingflags (flags)
3157 static char asciiflags[8];
3159 strcpy (asciiflags, "-------");
3160 #if defined (MA_PHYS)
3161 if (flags & MA_PHYS) asciiflags[0] = 'd';
3163 if (flags & MA_STACK) asciiflags[1] = 's';
3164 if (flags & MA_BREAK) asciiflags[2] = 'b';
3165 if (flags & MA_SHARED) asciiflags[3] = 's';
3166 if (flags & MA_READ) asciiflags[4] = 'r';
3167 if (flags & MA_WRITE) asciiflags[5] = 'w';
3168 if (flags & MA_EXEC) asciiflags[6] = 'x';
3169 return (asciiflags);
3173 info_proc_flags (pip, summary)
3174 struct procinfo *pip;
3177 struct trans *transp;
3179 printf_filtered ("%-32s", "Process status flags:");
3182 printf_filtered ("\n\n");
3184 for (transp = pr_flag_table; transp -> name != NULL; transp++)
3186 if (pip -> prstatus.pr_flags & transp -> value)
3190 printf_filtered ("%s ", transp -> name);
3194 printf_filtered ("\t%-16s %s.\n", transp -> name, transp -> desc);
3198 printf_filtered ("\n");
3202 info_proc_stop (pip, summary)
3203 struct procinfo *pip;
3206 struct trans *transp;
3210 why = pip -> prstatus.pr_why;
3211 what = pip -> prstatus.pr_what;
3213 if (pip -> prstatus.pr_flags & PR_STOPPED)
3215 printf_filtered ("%-32s", "Reason for stopping:");
3218 printf_filtered ("\n\n");
3220 for (transp = pr_why_table; transp -> name != NULL; transp++)
3222 if (why == transp -> value)
3226 printf_filtered ("%s ", transp -> name);
3230 printf_filtered ("\t%-16s %s.\n",
3231 transp -> name, transp -> desc);
3237 /* Use the pr_why field to determine what the pr_what field means, and
3238 print more information. */
3243 /* pr_what is unused for this case */
3249 printf_filtered ("%s ", signalname (what));
3253 printf_filtered ("\t%-16s %s.\n", signalname (what),
3254 safe_strsignal (what));
3260 printf_filtered ("%s ", syscallname (what));
3264 printf_filtered ("\t%-16s %s.\n", syscallname (what),
3265 "Entered this system call");
3271 printf_filtered ("%s ", syscallname (what));
3275 printf_filtered ("\t%-16s %s.\n", syscallname (what),
3276 "Returned from this system call");
3282 printf_filtered ("%s ",
3283 lookupname (faults_table, what, "fault"));
3287 printf_filtered ("\t%-16s %s.\n",
3288 lookupname (faults_table, what, "fault"),
3289 lookupdesc (faults_table, what));
3293 printf_filtered ("\n");
3298 info_proc_siginfo (pip, summary)
3299 struct procinfo *pip;
3302 struct siginfo *sip;
3304 if ((pip -> prstatus.pr_flags & PR_STOPPED) &&
3305 (pip -> prstatus.pr_why == PR_SIGNALLED ||
3306 pip -> prstatus.pr_why == PR_FAULTED))
3308 printf_filtered ("%-32s", "Additional signal/fault info:");
3309 sip = &pip -> prstatus.pr_info;
3312 printf_filtered ("%s ", signalname (sip -> si_signo));
3313 if (sip -> si_errno > 0)
3315 printf_filtered ("%s ", errnoname (sip -> si_errno));
3317 if (sip -> si_code <= 0)
3319 printf_filtered ("sent by %s, uid %d ",
3320 target_pid_to_str (sip -> si_pid),
3325 printf_filtered ("%s ", sigcodename (sip));
3326 if ((sip -> si_signo == SIGILL) ||
3327 (sip -> si_signo == SIGFPE) ||
3328 (sip -> si_signo == SIGSEGV) ||
3329 (sip -> si_signo == SIGBUS))
3331 printf_filtered ("addr=%#lx ",
3332 (unsigned long) sip -> si_addr);
3334 else if ((sip -> si_signo == SIGCHLD))
3336 printf_filtered ("child %s, status %u ",
3337 target_pid_to_str (sip -> si_pid),
3340 else if ((sip -> si_signo == SIGPOLL))
3342 printf_filtered ("band %u ", sip -> si_band);
3348 printf_filtered ("\n\n");
3349 printf_filtered ("\t%-16s %s.\n", signalname (sip -> si_signo),
3350 safe_strsignal (sip -> si_signo));
3351 if (sip -> si_errno > 0)
3353 printf_filtered ("\t%-16s %s.\n",
3354 errnoname (sip -> si_errno),
3355 safe_strerror (sip -> si_errno));
3357 if (sip -> si_code <= 0)
3359 printf_filtered ("\t%-16u %s\n", sip -> si_pid, /* XXX need target_pid_to_str() */
3360 "PID of process sending signal");
3361 printf_filtered ("\t%-16u %s\n", sip -> si_uid,
3362 "UID of process sending signal");
3366 printf_filtered ("\t%-16s %s.\n", sigcodename (sip),
3368 if ((sip -> si_signo == SIGILL) ||
3369 (sip -> si_signo == SIGFPE))
3371 printf_filtered ("\t%#-16lx %s.\n",
3372 (unsigned long) sip -> si_addr,
3373 "Address of faulting instruction");
3375 else if ((sip -> si_signo == SIGSEGV) ||
3376 (sip -> si_signo == SIGBUS))
3378 printf_filtered ("\t%#-16lx %s.\n",
3379 (unsigned long) sip -> si_addr,
3380 "Address of faulting memory reference");
3382 else if ((sip -> si_signo == SIGCHLD))
3384 printf_filtered ("\t%-16u %s.\n", sip -> si_pid, /* XXX need target_pid_to_str() */
3385 "Child process ID");
3386 printf_filtered ("\t%-16u %s.\n", sip -> si_status,
3387 "Child process exit value or signal");
3389 else if ((sip -> si_signo == SIGPOLL))
3391 printf_filtered ("\t%-16u %s.\n", sip -> si_band,
3392 "Band event for POLL_{IN,OUT,MSG}");
3396 printf_filtered ("\n");
3401 info_proc_syscalls (pip, summary)
3402 struct procinfo *pip;
3410 #if 0 /* FIXME: Needs to use gdb-wide configured info about system calls. */
3411 if (pip -> prstatus.pr_flags & PR_ASLEEP)
3413 int syscallnum = pip -> prstatus.pr_reg[R_D0];
3416 printf_filtered ("%-32s", "Sleeping in system call:");
3417 printf_filtered ("%s", syscallname (syscallnum));
3421 printf_filtered ("Sleeping in system call '%s'.\n",
3422 syscallname (syscallnum));
3427 if (ioctl (pip -> fd, PIOCGENTRY, &pip -> entryset) < 0)
3429 print_sys_errmsg (pip -> pathname, errno);
3430 error ("PIOCGENTRY failed");
3433 if (ioctl (pip -> fd, PIOCGEXIT, &pip -> exitset) < 0)
3435 print_sys_errmsg (pip -> pathname, errno);
3436 error ("PIOCGEXIT failed");
3439 printf_filtered ("System call tracing information:\n\n");
3441 printf_filtered ("\t%-12s %-8s %-8s\n",
3445 for (syscallnum = 0; syscallnum < MAX_SYSCALLS; syscallnum++)
3448 if (syscall_table[syscallnum] != NULL)
3449 printf_filtered ("\t%-12s ", syscall_table[syscallnum]);
3451 printf_filtered ("\t%-12d ", syscallnum);
3453 printf_filtered ("%-8s ",
3454 prismember (&pip -> entryset, syscallnum)
3456 printf_filtered ("%-8s ",
3457 prismember (&pip -> exitset, syscallnum)
3459 printf_filtered ("\n");
3461 printf_filtered ("\n");
3470 static char locbuf[32];
3472 name = strsigno (signo);
3475 sprintf (locbuf, "Signal %d", signo);
3479 sprintf (locbuf, "%s (%d)", name, signo);
3489 static char locbuf[32];
3491 name = strerrno (errnum);
3494 sprintf (locbuf, "Errno %d", errnum);
3498 sprintf (locbuf, "%s (%d)", name, errnum);
3504 info_proc_signals (pip, summary)
3505 struct procinfo *pip;
3512 if (ioctl (pip -> fd, PIOCGTRACE, &pip -> trace) < 0)
3514 print_sys_errmsg (pip -> pathname, errno);
3515 error ("PIOCGTRACE failed");
3518 printf_filtered ("Disposition of signals:\n\n");
3519 printf_filtered ("\t%-15s %-8s %-8s %-8s %s\n\n",
3520 "Signal", "Trace", "Hold", "Pending", "Description");
3521 for (signo = 0; signo < NSIG; signo++)
3524 printf_filtered ("\t%-15s ", signalname (signo));
3525 printf_filtered ("%-8s ",
3526 prismember (&pip -> trace, signo)
3528 printf_filtered ("%-8s ",
3529 prismember (&pip -> prstatus.pr_sighold, signo)
3532 #ifdef PROCFS_SIGPEND_OFFSET
3533 /* Alpha OSF/1 numbers the pending signals from 1. */
3534 printf_filtered ("%-8s ",
3535 (signo ? prismember (&pip -> prstatus.pr_sigpend,
3540 printf_filtered ("%-8s ",
3541 prismember (&pip -> prstatus.pr_sigpend, signo)
3544 printf_filtered (" %s\n", safe_strsignal (signo));
3546 printf_filtered ("\n");
3551 info_proc_faults (pip, summary)
3552 struct procinfo *pip;
3555 struct trans *transp;
3559 if (ioctl (pip -> fd, PIOCGFAULT, &pip -> fltset) < 0)
3561 print_sys_errmsg (pip -> pathname, errno);
3562 error ("PIOCGFAULT failed");
3565 printf_filtered ("Current traced hardware fault set:\n\n");
3566 printf_filtered ("\t%-12s %-8s\n", "Fault", "Trace");
3568 for (transp = faults_table; transp -> name != NULL; transp++)
3571 printf_filtered ("\t%-12s ", transp -> name);
3572 printf_filtered ("%-8s", prismember (&pip -> fltset, transp -> value)
3574 printf_filtered ("\n");
3576 printf_filtered ("\n");
3581 info_proc_mappings (pip, summary)
3582 struct procinfo *pip;
3586 struct prmap *prmaps;
3587 struct prmap *prmap;
3591 printf_filtered ("Mapped address spaces:\n\n");
3592 #ifdef BFD_HOST_64_BIT
3593 printf_filtered (" %18s %18s %10s %10s %7s\n",
3595 printf_filtered ("\t%10s %10s %10s %10s %7s\n",
3602 if (ioctl (pip -> fd, PIOCNMAP, &nmap) == 0)
3604 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
3605 if (ioctl (pip -> fd, PIOCMAP, prmaps) == 0)
3607 for (prmap = prmaps; prmap -> pr_size; ++prmap)
3609 #ifdef BFD_HOST_64_BIT
3610 printf_filtered (" %#18lx %#18lx %#10x %#10x %7s\n",
3612 printf_filtered ("\t%#10lx %#10lx %#10x %#10x %7s\n",
3614 (unsigned long)prmap -> pr_vaddr,
3615 (unsigned long)prmap -> pr_vaddr
3616 + prmap -> pr_size - 1,
3619 mappingflags (prmap -> pr_mflags));
3623 printf_filtered ("\n");
3631 info_proc -- implement the "info proc" command
3635 void info_proc (char *args, int from_tty)
3639 Implement gdb's "info proc" command by using the /proc interface
3640 to print status information about any currently running process.
3642 Examples of the use of "info proc" are:
3644 info proc (prints summary info for current inferior)
3645 info proc 123 (prints summary info for process with pid 123)
3646 info proc mappings (prints address mappings)
3647 info proc times (prints process/children times)
3648 info proc id (prints pid, ppid, gid, sid, etc)
3649 FIXME: i proc id not implemented.
3650 info proc status (prints general process state info)
3651 FIXME: i proc status not implemented.
3652 info proc signals (prints info about signal handling)
3653 info proc all (prints all info)
3658 info_proc (args, from_tty)
3662 int pid = inferior_pid;
3663 struct procinfo *pip;
3664 struct cleanup *old_chain;
3680 old_chain = make_cleanup (null_cleanup, 0);
3682 /* Default to using the current inferior if no pid specified. Note
3683 that inferior_pid may be 0, hence we set okerr. */
3685 pip = find_procinfo (inferior_pid, 1);
3689 if ((argv = buildargv (args)) == NULL)
3693 make_cleanup (freeargv, (char *) argv);
3695 while (*argv != NULL)
3697 argsize = strlen (*argv);
3698 if (argsize >= 1 && strncmp (*argv, "all", argsize) == 0)
3703 else if (argsize >= 2 && strncmp (*argv, "faults", argsize) == 0)
3708 else if (argsize >= 2 && strncmp (*argv, "flags", argsize) == 0)
3713 else if (argsize >= 1 && strncmp (*argv, "id", argsize) == 0)
3718 else if (argsize >= 1 && strncmp (*argv, "mappings", argsize) == 0)
3723 else if (argsize >= 2 && strncmp (*argv, "signals", argsize) == 0)
3728 else if (argsize >= 2 && strncmp (*argv, "status", argsize) == 0)
3733 else if (argsize >= 2 && strncmp (*argv, "syscalls", argsize) == 0)
3738 else if (argsize >= 1 && strncmp (*argv, "times", argsize) == 0)
3743 else if ((pid = atoi (*argv)) > 0)
3745 pip = (struct procinfo *) xmalloc (sizeof (struct procinfo));
3746 memset (pip, 0, sizeof (*pip));
3749 if (!open_proc_file (pid, pip, O_RDONLY))
3751 perror_with_name (pip -> pathname);
3755 make_cleanup (close_proc_file, pip);
3757 else if (**argv != '\000')
3759 error ("Unrecognized or ambiguous keyword `%s'.", *argv);
3765 /* If we don't have a valid open process at this point, then we have no
3766 inferior or didn't specify a specific pid. */
3771 No process. Start debugging a program or specify an explicit process ID.");
3773 if (ioctl (pip -> fd, PIOCSTATUS, &(pip -> prstatus)) < 0)
3775 print_sys_errmsg (pip -> pathname, errno);
3776 error ("PIOCSTATUS failed");
3780 nlwp = pip->prstatus.pr_nlwp;
3781 lwps = alloca ((2 * nlwp + 2) * sizeof (id_t));
3783 if (ioctl (pip->fd, PIOCLWPIDS, lwps))
3785 print_sys_errmsg (pip -> pathname, errno);
3786 error ("PIOCSTATUS failed");
3788 #else /* PIOCLWPIDS */
3790 lwps = alloca ((2 * nlwp + 2) * sizeof *lwps);
3792 #endif /* PIOCLWPIDS */
3794 for (; nlwp > 0; nlwp--, lwps++)
3796 pip = find_procinfo ((*lwps << 16) | pid, 1);
3800 pip = (struct procinfo *) xmalloc (sizeof (struct procinfo));
3801 memset (pip, 0, sizeof (*pip));
3802 if (!open_proc_file ((*lwps << 16) | pid, pip, O_RDONLY))
3805 make_cleanup (close_proc_file, pip);
3807 if (ioctl (pip -> fd, PIOCSTATUS, &(pip -> prstatus)) < 0)
3809 print_sys_errmsg (pip -> pathname, errno);
3810 error ("PIOCSTATUS failed");
3814 /* Print verbose information of the requested type(s), or just a summary
3815 of the information for all types. */
3817 printf_filtered ("\nInformation for %s.%d:\n\n", pip -> pathname, *lwps);
3818 if (summary || all || flags)
3820 info_proc_flags (pip, summary);
3824 info_proc_stop (pip, summary);
3826 if (summary || all || signals || faults)
3828 info_proc_siginfo (pip, summary);
3830 if (summary || all || syscalls)
3832 info_proc_syscalls (pip, summary);
3834 if (summary || all || mappings)
3836 info_proc_mappings (pip, summary);
3838 if (summary || all || signals)
3840 info_proc_signals (pip, summary);
3842 if (summary || all || faults)
3844 info_proc_faults (pip, summary);
3846 printf_filtered ("\n");
3848 /* All done, deal with closing any temporary process info structure,
3849 freeing temporary memory , etc. */
3851 do_cleanups (old_chain);
3859 modify_inherit_on_fork_flag - Change the inherit-on-fork flag
3863 void modify_inherit_on_fork_flag (fd, flag)
3867 Call this routine to modify the inherit-on-fork flag. This routine is
3868 just a nice wrapper to hide the #ifdefs needed by various systems to
3874 modify_inherit_on_fork_flag (fd, flag)
3883 #ifdef PIOCSET /* New method */
3886 retval = ioctl (fd, PIOCSET, &pr_flags);
3888 retval = ioctl (fd, PIOCRESET, &pr_flags);
3891 #ifdef PIOCSFORK /* Original method */
3893 retval = ioctl (fd, PIOCSFORK, NULL);
3895 retval = ioctl (fd, PIOCRFORK, NULL);
3897 Neither PR_FORK nor PIOCSFORK exist!!!
3904 print_sys_errmsg ("modify_inherit_on_fork_flag", errno);
3905 error ("PIOCSFORK or PR_FORK modification failed");
3912 modify_run_on_last_close_flag - Change the run-on-last-close flag
3916 void modify_run_on_last_close_flag (fd, flag)
3920 Call this routine to modify the run-on-last-close flag. This routine
3921 is just a nice wrapper to hide the #ifdefs needed by various systems to
3927 modify_run_on_last_close_flag (fd, flag)
3936 #ifdef PIOCSET /* New method */
3939 retval = ioctl (fd, PIOCSET, &pr_flags);
3941 retval = ioctl (fd, PIOCRESET, &pr_flags);
3944 #ifdef PIOCSRLC /* Original method */
3946 retval = ioctl (fd, PIOCSRLC, NULL);
3948 retval = ioctl (fd, PIOCRRLC, NULL);
3950 Neither PR_RLC nor PIOCSRLC exist!!!
3957 print_sys_errmsg ("modify_run_on_last_close_flag", errno);
3958 error ("PIOCSRLC or PR_RLC modification failed");
3965 procfs_clear_syscall_trap -- Deletes the trap for the specified system call.
3969 void procfs_clear_syscall_trap (struct procinfo *, int syscall_num, int errok)
3973 This function function disables traps for the specified system call.
3974 errok is non-zero if errors should be ignored.
3978 procfs_clear_syscall_trap (pi, syscall_num, errok)
3979 struct procinfo *pi;
3986 goterr = ioctl (pi->fd, PIOCGENTRY, &sysset) < 0;
3988 if (goterr && !errok)
3990 print_sys_errmsg (pi->pathname, errno);
3991 error ("PIOCGENTRY failed");
3996 prdelset (&sysset, syscall_num);
3998 if ((ioctl (pi->fd, PIOCSENTRY, &sysset) < 0) && !errok)
4000 print_sys_errmsg (pi->pathname, errno);
4001 error ("PIOCSENTRY failed");
4005 goterr = ioctl (pi->fd, PIOCGEXIT, &sysset) < 0;
4007 if (goterr && !errok)
4009 procfs_clear_syscall_trap (pi, syscall_num, 1);
4010 print_sys_errmsg (pi->pathname, errno);
4011 error ("PIOCGEXIT failed");
4016 praddset (&sysset, syscall_num);
4018 if ((ioctl (pi->fd, PIOCSEXIT, &sysset) < 0) && !errok)
4020 procfs_clear_syscall_trap (pi, syscall_num, 1);
4021 print_sys_errmsg (pi->pathname, errno);
4022 error ("PIOCSEXIT failed");
4026 if (!pi->syscall_handlers)
4029 error ("procfs_clear_syscall_trap: syscall_handlers is empty");
4033 /* Remove handler func from the handler list */
4035 for (i = 0; i < pi->num_syscall_handlers; i++)
4036 if (pi->syscall_handlers[i].syscall_num == syscall_num)
4038 if (i + 1 != pi->num_syscall_handlers)
4039 { /* Not the last entry.
4040 Move subsequent entries fwd. */
4041 memcpy (&pi->syscall_handlers[i], &pi->syscall_handlers[i + 1],
4042 (pi->num_syscall_handlers - i - 1)
4043 * sizeof (struct procfs_syscall_handler));
4046 pi->syscall_handlers = xrealloc (pi->syscall_handlers,
4047 (pi->num_syscall_handlers - 1)
4048 * sizeof (struct procfs_syscall_handler));
4049 pi->num_syscall_handlers--;
4054 error ("procfs_clear_syscall_trap: Couldn't find handler for sys call %d",
4062 procfs_set_syscall_trap -- arrange for a function to be called when the
4063 child executes the specified system call.
4067 void procfs_set_syscall_trap (struct procinfo *, int syscall_num, int flags,
4068 syscall_func_t *function)
4072 This function sets up an entry and/or exit trap for the specified system
4073 call. When the child executes the specified system call, your function
4074 will be called with the call #, a flag that indicates entry or exit, and
4075 pointers to rtnval and statval (which are used by procfs_wait). The
4076 function should return non-zero if something interesting happened, zero
4081 procfs_set_syscall_trap (pi, syscall_num, flags, func)
4082 struct procinfo *pi;
4085 syscall_func_t *func;
4089 if (flags & PROCFS_SYSCALL_ENTRY)
4091 if (ioctl (pi->fd, PIOCGENTRY, &sysset) < 0)
4093 print_sys_errmsg (pi->pathname, errno);
4094 error ("PIOCGENTRY failed");
4097 praddset (&sysset, syscall_num);
4099 if (ioctl (pi->fd, PIOCSENTRY, &sysset) < 0)
4101 print_sys_errmsg (pi->pathname, errno);
4102 error ("PIOCSENTRY failed");
4106 if (flags & PROCFS_SYSCALL_EXIT)
4108 if (ioctl (pi->fd, PIOCGEXIT, &sysset) < 0)
4110 procfs_clear_syscall_trap (pi, syscall_num, 1);
4111 print_sys_errmsg (pi->pathname, errno);
4112 error ("PIOCGEXIT failed");
4115 praddset (&sysset, syscall_num);
4117 if (ioctl (pi->fd, PIOCSEXIT, &sysset) < 0)
4119 procfs_clear_syscall_trap (pi, syscall_num, 1);
4120 print_sys_errmsg (pi->pathname, errno);
4121 error ("PIOCSEXIT failed");
4125 if (!pi->syscall_handlers)
4127 pi->syscall_handlers = xmalloc (sizeof (struct procfs_syscall_handler));
4128 pi->syscall_handlers[0].syscall_num = syscall_num;
4129 pi->syscall_handlers[0].func = func;
4130 pi->num_syscall_handlers = 1;
4136 for (i = 0; i < pi->num_syscall_handlers; i++)
4137 if (pi->syscall_handlers[i].syscall_num == syscall_num)
4139 pi->syscall_handlers[i].func = func;
4143 pi->syscall_handlers = xrealloc (pi->syscall_handlers, (i + 1)
4144 * sizeof (struct procfs_syscall_handler));
4145 pi->syscall_handlers[i].syscall_num = syscall_num;
4146 pi->syscall_handlers[i].func = func;
4147 pi->num_syscall_handlers++;
4151 #ifdef SYS_lwp_create
4157 procfs_lwp_creation_handler - handle exit from the _lwp_create syscall
4161 int procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
4165 This routine is called both when an inferior process and it's new lwp
4166 are about to finish a _lwp_create() system call. This is the system
4167 call that Solaris uses to create a lightweight process. When the
4168 target process gets this event, we can look at sysarg[2] to find the
4169 new childs lwp ID, and create a procinfo struct from that. After that,
4170 we pretend that we got a SIGTRAP, and return non-zero to tell
4171 procfs_wait to wake up. Subsequently, wait_for_inferior gets woken up,
4172 sees the new process and continues it.
4174 When we see the child exiting from lwp_create, we just contine it,
4175 since everything was handled when the parent trapped.
4178 In effect, we are only paying attention to the parent's completion of
4179 the lwp_create syscall. If we only paid attention to the child
4180 instead, then we wouldn't detect the creation of a suspended thread.
4184 procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
4185 struct procinfo *pi;
4192 struct procinfo *childpi;
4194 /* We've just detected the completion of an lwp_create system call. Now we
4195 need to setup a procinfo struct for this thread, and notify the thread
4196 system of the new arrival. */
4198 /* If lwp_create failed, then nothing interesting happened. Continue the
4199 process and go back to sleep. */
4201 if (pi->prstatus.pr_reg[R_PSR] & PS_FLAG_CARRY)
4202 { /* _lwp_create failed */
4203 pi->prrun.pr_flags &= PRSTEP;
4204 pi->prrun.pr_flags |= PRCFAULT;
4206 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
4207 perror_with_name (pi->pathname);
4212 /* At this point, the new thread is stopped at it's first instruction, and
4213 the parent is stopped at the exit from lwp_create. */
4215 if (pi->new_child) /* Child? */
4216 { /* Yes, just continue it */
4217 pi->prrun.pr_flags &= PRSTEP;
4218 pi->prrun.pr_flags |= PRCFAULT;
4220 if ((pi->prstatus.pr_flags & PR_ISTOP)
4221 && ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
4222 perror_with_name (pi->pathname);
4224 pi->new_child = 0; /* No longer new */
4229 /* We're the proud parent of a new thread. Setup an exit trap for lwp_create
4230 in the child and continue the parent. */
4232 /* Third arg is pointer to new thread id. */
4233 lwp_id = read_memory_integer (pi->prstatus.pr_sysarg[2], sizeof (int));
4235 lwp_id = (lwp_id << 16) | PIDGET (pi->pid);
4237 childpi = create_procinfo (lwp_id);
4239 /* The new process has actually inherited the lwp_create syscall trap from
4240 it's parent, but we still have to call this to register a handler for
4243 procfs_set_syscall_trap (childpi, SYS_lwp_create, PROCFS_SYSCALL_EXIT,
4244 procfs_lwp_creation_handler);
4246 childpi->new_child = 1; /* Flag this as an unseen child process */
4248 *rtnvalp = lwp_id; /* the new arrival. */
4249 *statvalp = (SIGTRAP << 8) | 0177;
4253 #endif /* SYS_lwp_create */
4255 /* Fork an inferior process, and start debugging it with /proc. */
4258 procfs_create_inferior (exec_file, allargs, env)
4263 char *shell_file = getenv ("SHELL");
4265 if (shell_file != NULL && strchr (shell_file, '/') == NULL)
4268 /* We will be looking down the PATH to find shell_file. If we
4269 just do this the normal way (via execlp, which operates by
4270 attempting an exec for each element of the PATH until it
4271 finds one which succeeds), then there will be an exec for
4272 each failed attempt, each of which will cause a PR_SYSEXIT
4273 stop, and we won't know how to distinguish the PR_SYSEXIT's
4274 for these failed execs with the ones for successful execs
4275 (whether the exec has succeeded is stored at that time in the
4276 carry bit or some such architecture-specific and
4277 non-ABI-specified place).
4279 So I can't think of anything better than to search the PATH
4280 now. This has several disadvantages: (1) There is a race
4281 condition; if we find a file now and it is deleted before we
4282 exec it, we lose, even if the deletion leaves a valid file
4283 further down in the PATH, (2) there is no way to know exactly
4284 what an executable (in the sense of "capable of being
4285 exec'd") file is. Using access() loses because it may lose
4286 if the caller is the superuser; failing to use it loses if
4287 there are ACLs or some such. */
4291 /* FIXME-maybe: might want "set path" command so user can change what
4292 path is used from within GDB. */
4293 char *path = getenv ("PATH");
4295 struct stat statbuf;
4298 path = "/bin:/usr/bin";
4300 tryname = alloca (strlen (path) + strlen (shell_file) + 2);
4301 for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
4303 p1 = strchr (p, ':');
4308 strncpy (tryname, p, len);
4309 tryname[len] = '\0';
4310 strcat (tryname, "/");
4311 strcat (tryname, shell_file);
4312 if (access (tryname, X_OK) < 0)
4314 if (stat (tryname, &statbuf) < 0)
4316 if (!S_ISREG (statbuf.st_mode))
4317 /* We certainly need to reject directories. I'm not quite
4318 as sure about FIFOs, sockets, etc., but I kind of doubt
4319 that people want to exec() these things. */
4324 /* Not found. This must be an error rather than merely passing
4325 the file to execlp(), because execlp() would try all the
4326 exec()s, causing GDB to get confused. */
4327 error ("Can't find shell %s in PATH", shell_file);
4329 shell_file = tryname;
4332 fork_inferior (exec_file, allargs, env,
4333 proc_set_exec_trap, procfs_init_inferior, shell_file);
4335 /* We are at the first instruction we care about. */
4336 /* Pedal to the metal... */
4338 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
4341 /* Clean up after the inferior dies. */
4344 procfs_mourn_inferior ()
4346 struct procinfo *pi;
4347 struct procinfo *next_pi;
4349 for (pi = procinfo_list; pi; pi = next_pi)
4352 unconditionally_kill_inferior (pi);
4355 unpush_target (&procfs_ops);
4356 generic_mourn_inferior ();
4360 /* Mark our target-struct as eligible for stray "run" and "attach" commands. */
4364 /* This variable is controlled by modules that sit atop procfs that may layer
4365 their own process structure atop that provided here. sol-thread.c does
4366 this because of the Solaris two-level thread model. */
4368 return !procfs_suppress_run;
4370 #ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
4372 /* Insert a watchpoint */
4374 procfs_set_watchpoint(pid, addr, len, rw)
4380 struct procinfo *pi;
4383 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
4384 wpt.pr_vaddr = (caddr_t)addr;
4386 wpt.pr_wflags = ((rw & 1) ? MA_READ : 0) | ((rw & 2) ? MA_WRITE : 0);
4387 if (ioctl (pi->fd, PIOCSWATCH, &wpt) < 0)
4391 /* Currently it sometimes happens that the same watchpoint gets
4392 deleted twice - don't die in this case (FIXME please) */
4393 if (errno == ESRCH && len == 0)
4395 print_sys_errmsg (pi->pathname, errno);
4396 error ("PIOCSWATCH failed");
4402 procfs_stopped_by_watchpoint(pid)
4405 struct procinfo *pi;
4409 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
4410 if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
4412 why = pi->prstatus.pr_why;
4413 what = pi->prstatus.pr_what;
4414 if (why == PR_FAULTED
4415 #if defined (FLTWATCH) && defined (FLTKWATCH)
4416 && (what == FLTWATCH || what == FLTKWATCH)
4419 && (what == FLTWATCH)
4422 && (what == FLTKWATCH)
4432 /* Why is this necessary? Shouldn't dead threads just be removed from the
4436 procfs_thread_alive (pid)
4442 /* Send a SIGINT to the process group. This acts just like the user typed a
4443 ^C on the controlling terminal.
4445 XXX - This may not be correct for all systems. Some may want to use
4446 killpg() instead of kill (-pgrp). */
4451 extern pid_t inferior_process_group;
4453 kill (-inferior_process_group, SIGINT);
4456 /* Convert a pid to printable form. */
4460 procfs_pid_to_str (pid)
4463 static char buf[100];
4465 sprintf (buf, "Kernel thread %d", TIDGET (pid));
4471 struct target_ops procfs_ops = {
4472 "procfs", /* to_shortname */
4473 "Unix /proc child process", /* to_longname */
4474 "Unix /proc child process (started by the \"run\" command).", /* to_doc */
4475 procfs_open, /* to_open */
4477 procfs_attach, /* to_attach */
4478 procfs_detach, /* to_detach */
4479 procfs_resume, /* to_resume */
4480 procfs_wait, /* to_wait */
4481 procfs_fetch_registers, /* to_fetch_registers */
4482 procfs_store_registers, /* to_store_registers */
4483 procfs_prepare_to_store, /* to_prepare_to_store */
4484 procfs_xfer_memory, /* to_xfer_memory */
4485 procfs_files_info, /* to_files_info */
4486 memory_insert_breakpoint, /* to_insert_breakpoint */
4487 memory_remove_breakpoint, /* to_remove_breakpoint */
4488 terminal_init_inferior, /* to_terminal_init */
4489 terminal_inferior, /* to_terminal_inferior */
4490 terminal_ours_for_output, /* to_terminal_ours_for_output */
4491 terminal_ours, /* to_terminal_ours */
4492 child_terminal_info, /* to_terminal_info */
4493 procfs_kill_inferior, /* to_kill */
4495 0, /* to_lookup_symbol */
4496 procfs_create_inferior, /* to_create_inferior */
4497 procfs_mourn_inferior, /* to_mourn_inferior */
4498 procfs_can_run, /* to_can_run */
4499 procfs_notice_signals, /* to_notice_signals */
4500 procfs_thread_alive, /* to_thread_alive */
4501 procfs_stop, /* to_stop */
4502 process_stratum, /* to_stratum */
4504 1, /* to_has_all_memory */
4505 1, /* to_has_memory */
4506 1, /* to_has_stack */
4507 1, /* to_has_registers */
4508 1, /* to_has_execution */
4510 0, /* sections_end */
4511 OPS_MAGIC /* to_magic */
4515 _initialize_procfs ()
4517 #ifdef HAVE_OPTIONAL_PROC_FS
4521 /* If we have an optional /proc filesystem (e.g. under OSF/1),
4522 don't add procfs support if we cannot access the running
4524 sprintf (procname, PROC_NAME_FMT, getpid ());
4525 if ((fd = open (procname, O_RDONLY)) < 0)
4530 add_target (&procfs_ops);
4532 add_info ("proc", info_proc,
4533 "Show process status information using /proc entry.\n\
4534 Specify process id or use current inferior by default.\n\
4535 Specify keywords for detailed information; default is summary.\n\
4536 Keywords are: `all', `faults', `flags', `id', `mappings', `signals',\n\
4537 `status', `syscalls', and `times'.\n\
4538 Unambiguous abbreviations may be used.");
4540 init_syscall_table ();