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
644 num_fds = poll (poll_list, num_poll_list, -1);
647 if (num_fds < 0 && errno == EINTR)
649 print_sys_errmsg ("poll failed", errno);
650 error ("Poll failed, returned %d", num_fds);
653 pi = current_procinfo;
655 while (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
659 /* Process exited. */
660 pi->prstatus.pr_flags = 0;
663 else if (errno != EINTR)
665 print_sys_errmsg (pi->pathname, errno);
666 error ("PIOCWSTOP failed");
672 clear_sigint_trap ();
677 for (i = 0; i < num_poll_list && num_fds > 0; i++)
679 if ((poll_list[i].revents & (POLLPRI|POLLERR|POLLHUP|POLLNVAL)) == 0)
681 for (pi = procinfo_list; pi; pi = pi->next)
683 if (poll_list[i].fd == pi->fd)
685 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
687 print_sys_errmsg (pi->pathname, errno);
688 error ("PIOCSTATUS failed");
696 error ("wait_fd: Couldn't find procinfo for fd %d\n",
699 #endif /* LOSING_POLL */
708 lookupdesc -- translate a value to a summary desc string
712 static char *lookupdesc (struct trans *transp, unsigned int val);
716 Given a pointer to a translation table and a value to be translated,
717 lookup the desc string and return it.
721 lookupdesc (transp, val)
722 struct trans *transp;
727 for (desc = NULL; transp -> name != NULL; transp++)
729 if (transp -> value == val)
731 desc = transp -> desc;
736 /* Didn't find a translation for the specified value, set a default one. */
749 lookupname -- translate a value to symbolic name
753 static char *lookupname (struct trans *transp, unsigned int val,
758 Given a pointer to a translation table, a value to be translated,
759 and a default prefix to return if the value can't be translated,
760 match the value with one of the translation table entries and
761 return a pointer to the symbolic name.
763 If no match is found it just returns the value as a printable string,
764 with the given prefix. The previous such value, if any, is freed
769 lookupname (transp, val, prefix)
770 struct trans *transp;
777 for (name = NULL; transp -> name != NULL; transp++)
779 if (transp -> value == val)
781 name = transp -> name;
786 /* Didn't find a translation for the specified value, build a default
787 one using the specified prefix and return it. The lifetime of
788 the value is only until the next one is needed. */
796 locbuf = xmalloc (strlen (prefix) + 16);
797 sprintf (locbuf, "%s %u", prefix, val);
809 static char locbuf[32];
811 for (scp = siginfo_table; scp -> codename != NULL; scp++)
813 if ((scp -> signo == sip -> si_signo) &&
814 (scp -> code == sip -> si_code))
816 name = scp -> codename;
822 sprintf (locbuf, "sigcode %u", sip -> si_signo);
835 for (scp = siginfo_table; scp -> codename != NULL; scp++)
837 if ((scp -> signo == sip -> si_signo) &&
838 (scp -> code == sip -> si_code))
846 desc = "Unrecognized signal or trap use";
855 syscallname - translate a system call number into a system call name
859 char *syscallname (int syscallnum)
863 Given a system call number, translate it into the printable name
864 of a system call, or into "syscall <num>" if it is an unknown
869 syscallname (syscallnum)
872 static char locbuf[32];
874 if (syscallnum >= 0 && syscallnum < MAX_SYSCALLS
875 && syscall_table[syscallnum] != NULL)
876 return syscall_table[syscallnum];
879 sprintf (locbuf, "syscall %u", syscallnum);
888 init_syscall_table - initialize syscall translation table
892 void init_syscall_table (void)
896 Dynamically initialize the translation table to convert system
897 call numbers into printable system call names. Done once per
898 gdb run, on initialization.
902 This is awfully ugly, but preprocessor tricks to make it prettier
903 tend to be nonportable.
907 init_syscall_table ()
909 #if defined (SYS_exit)
910 syscall_table[SYS_exit] = "exit";
912 #if defined (SYS_fork)
913 syscall_table[SYS_fork] = "fork";
915 #if defined (SYS_read)
916 syscall_table[SYS_read] = "read";
918 #if defined (SYS_write)
919 syscall_table[SYS_write] = "write";
921 #if defined (SYS_open)
922 syscall_table[SYS_open] = "open";
924 #if defined (SYS_close)
925 syscall_table[SYS_close] = "close";
927 #if defined (SYS_wait)
928 syscall_table[SYS_wait] = "wait";
930 #if defined (SYS_creat)
931 syscall_table[SYS_creat] = "creat";
933 #if defined (SYS_link)
934 syscall_table[SYS_link] = "link";
936 #if defined (SYS_unlink)
937 syscall_table[SYS_unlink] = "unlink";
939 #if defined (SYS_exec)
940 syscall_table[SYS_exec] = "exec";
942 #if defined (SYS_execv)
943 syscall_table[SYS_execv] = "execv";
945 #if defined (SYS_execve)
946 syscall_table[SYS_execve] = "execve";
948 #if defined (SYS_chdir)
949 syscall_table[SYS_chdir] = "chdir";
951 #if defined (SYS_time)
952 syscall_table[SYS_time] = "time";
954 #if defined (SYS_mknod)
955 syscall_table[SYS_mknod] = "mknod";
957 #if defined (SYS_chmod)
958 syscall_table[SYS_chmod] = "chmod";
960 #if defined (SYS_chown)
961 syscall_table[SYS_chown] = "chown";
963 #if defined (SYS_brk)
964 syscall_table[SYS_brk] = "brk";
966 #if defined (SYS_stat)
967 syscall_table[SYS_stat] = "stat";
969 #if defined (SYS_lseek)
970 syscall_table[SYS_lseek] = "lseek";
972 #if defined (SYS_getpid)
973 syscall_table[SYS_getpid] = "getpid";
975 #if defined (SYS_mount)
976 syscall_table[SYS_mount] = "mount";
978 #if defined (SYS_umount)
979 syscall_table[SYS_umount] = "umount";
981 #if defined (SYS_setuid)
982 syscall_table[SYS_setuid] = "setuid";
984 #if defined (SYS_getuid)
985 syscall_table[SYS_getuid] = "getuid";
987 #if defined (SYS_stime)
988 syscall_table[SYS_stime] = "stime";
990 #if defined (SYS_ptrace)
991 syscall_table[SYS_ptrace] = "ptrace";
993 #if defined (SYS_alarm)
994 syscall_table[SYS_alarm] = "alarm";
996 #if defined (SYS_fstat)
997 syscall_table[SYS_fstat] = "fstat";
999 #if defined (SYS_pause)
1000 syscall_table[SYS_pause] = "pause";
1002 #if defined (SYS_utime)
1003 syscall_table[SYS_utime] = "utime";
1005 #if defined (SYS_stty)
1006 syscall_table[SYS_stty] = "stty";
1008 #if defined (SYS_gtty)
1009 syscall_table[SYS_gtty] = "gtty";
1011 #if defined (SYS_access)
1012 syscall_table[SYS_access] = "access";
1014 #if defined (SYS_nice)
1015 syscall_table[SYS_nice] = "nice";
1017 #if defined (SYS_statfs)
1018 syscall_table[SYS_statfs] = "statfs";
1020 #if defined (SYS_sync)
1021 syscall_table[SYS_sync] = "sync";
1023 #if defined (SYS_kill)
1024 syscall_table[SYS_kill] = "kill";
1026 #if defined (SYS_fstatfs)
1027 syscall_table[SYS_fstatfs] = "fstatfs";
1029 #if defined (SYS_pgrpsys)
1030 syscall_table[SYS_pgrpsys] = "pgrpsys";
1032 #if defined (SYS_xenix)
1033 syscall_table[SYS_xenix] = "xenix";
1035 #if defined (SYS_dup)
1036 syscall_table[SYS_dup] = "dup";
1038 #if defined (SYS_pipe)
1039 syscall_table[SYS_pipe] = "pipe";
1041 #if defined (SYS_times)
1042 syscall_table[SYS_times] = "times";
1044 #if defined (SYS_profil)
1045 syscall_table[SYS_profil] = "profil";
1047 #if defined (SYS_plock)
1048 syscall_table[SYS_plock] = "plock";
1050 #if defined (SYS_setgid)
1051 syscall_table[SYS_setgid] = "setgid";
1053 #if defined (SYS_getgid)
1054 syscall_table[SYS_getgid] = "getgid";
1056 #if defined (SYS_signal)
1057 syscall_table[SYS_signal] = "signal";
1059 #if defined (SYS_msgsys)
1060 syscall_table[SYS_msgsys] = "msgsys";
1062 #if defined (SYS_sys3b)
1063 syscall_table[SYS_sys3b] = "sys3b";
1065 #if defined (SYS_acct)
1066 syscall_table[SYS_acct] = "acct";
1068 #if defined (SYS_shmsys)
1069 syscall_table[SYS_shmsys] = "shmsys";
1071 #if defined (SYS_semsys)
1072 syscall_table[SYS_semsys] = "semsys";
1074 #if defined (SYS_ioctl)
1075 syscall_table[SYS_ioctl] = "ioctl";
1077 #if defined (SYS_uadmin)
1078 syscall_table[SYS_uadmin] = "uadmin";
1080 #if defined (SYS_utssys)
1081 syscall_table[SYS_utssys] = "utssys";
1083 #if defined (SYS_fsync)
1084 syscall_table[SYS_fsync] = "fsync";
1086 #if defined (SYS_umask)
1087 syscall_table[SYS_umask] = "umask";
1089 #if defined (SYS_chroot)
1090 syscall_table[SYS_chroot] = "chroot";
1092 #if defined (SYS_fcntl)
1093 syscall_table[SYS_fcntl] = "fcntl";
1095 #if defined (SYS_ulimit)
1096 syscall_table[SYS_ulimit] = "ulimit";
1098 #if defined (SYS_rfsys)
1099 syscall_table[SYS_rfsys] = "rfsys";
1101 #if defined (SYS_rmdir)
1102 syscall_table[SYS_rmdir] = "rmdir";
1104 #if defined (SYS_mkdir)
1105 syscall_table[SYS_mkdir] = "mkdir";
1107 #if defined (SYS_getdents)
1108 syscall_table[SYS_getdents] = "getdents";
1110 #if defined (SYS_sysfs)
1111 syscall_table[SYS_sysfs] = "sysfs";
1113 #if defined (SYS_getmsg)
1114 syscall_table[SYS_getmsg] = "getmsg";
1116 #if defined (SYS_putmsg)
1117 syscall_table[SYS_putmsg] = "putmsg";
1119 #if defined (SYS_poll)
1120 syscall_table[SYS_poll] = "poll";
1122 #if defined (SYS_lstat)
1123 syscall_table[SYS_lstat] = "lstat";
1125 #if defined (SYS_symlink)
1126 syscall_table[SYS_symlink] = "symlink";
1128 #if defined (SYS_readlink)
1129 syscall_table[SYS_readlink] = "readlink";
1131 #if defined (SYS_setgroups)
1132 syscall_table[SYS_setgroups] = "setgroups";
1134 #if defined (SYS_getgroups)
1135 syscall_table[SYS_getgroups] = "getgroups";
1137 #if defined (SYS_fchmod)
1138 syscall_table[SYS_fchmod] = "fchmod";
1140 #if defined (SYS_fchown)
1141 syscall_table[SYS_fchown] = "fchown";
1143 #if defined (SYS_sigprocmask)
1144 syscall_table[SYS_sigprocmask] = "sigprocmask";
1146 #if defined (SYS_sigsuspend)
1147 syscall_table[SYS_sigsuspend] = "sigsuspend";
1149 #if defined (SYS_sigaltstack)
1150 syscall_table[SYS_sigaltstack] = "sigaltstack";
1152 #if defined (SYS_sigaction)
1153 syscall_table[SYS_sigaction] = "sigaction";
1155 #if defined (SYS_sigpending)
1156 syscall_table[SYS_sigpending] = "sigpending";
1158 #if defined (SYS_context)
1159 syscall_table[SYS_context] = "context";
1161 #if defined (SYS_evsys)
1162 syscall_table[SYS_evsys] = "evsys";
1164 #if defined (SYS_evtrapret)
1165 syscall_table[SYS_evtrapret] = "evtrapret";
1167 #if defined (SYS_statvfs)
1168 syscall_table[SYS_statvfs] = "statvfs";
1170 #if defined (SYS_fstatvfs)
1171 syscall_table[SYS_fstatvfs] = "fstatvfs";
1173 #if defined (SYS_nfssys)
1174 syscall_table[SYS_nfssys] = "nfssys";
1176 #if defined (SYS_waitsys)
1177 syscall_table[SYS_waitsys] = "waitsys";
1179 #if defined (SYS_sigsendsys)
1180 syscall_table[SYS_sigsendsys] = "sigsendsys";
1182 #if defined (SYS_hrtsys)
1183 syscall_table[SYS_hrtsys] = "hrtsys";
1185 #if defined (SYS_acancel)
1186 syscall_table[SYS_acancel] = "acancel";
1188 #if defined (SYS_async)
1189 syscall_table[SYS_async] = "async";
1191 #if defined (SYS_priocntlsys)
1192 syscall_table[SYS_priocntlsys] = "priocntlsys";
1194 #if defined (SYS_pathconf)
1195 syscall_table[SYS_pathconf] = "pathconf";
1197 #if defined (SYS_mincore)
1198 syscall_table[SYS_mincore] = "mincore";
1200 #if defined (SYS_mmap)
1201 syscall_table[SYS_mmap] = "mmap";
1203 #if defined (SYS_mprotect)
1204 syscall_table[SYS_mprotect] = "mprotect";
1206 #if defined (SYS_munmap)
1207 syscall_table[SYS_munmap] = "munmap";
1209 #if defined (SYS_fpathconf)
1210 syscall_table[SYS_fpathconf] = "fpathconf";
1212 #if defined (SYS_vfork)
1213 syscall_table[SYS_vfork] = "vfork";
1215 #if defined (SYS_fchdir)
1216 syscall_table[SYS_fchdir] = "fchdir";
1218 #if defined (SYS_readv)
1219 syscall_table[SYS_readv] = "readv";
1221 #if defined (SYS_writev)
1222 syscall_table[SYS_writev] = "writev";
1224 #if defined (SYS_xstat)
1225 syscall_table[SYS_xstat] = "xstat";
1227 #if defined (SYS_lxstat)
1228 syscall_table[SYS_lxstat] = "lxstat";
1230 #if defined (SYS_fxstat)
1231 syscall_table[SYS_fxstat] = "fxstat";
1233 #if defined (SYS_xmknod)
1234 syscall_table[SYS_xmknod] = "xmknod";
1236 #if defined (SYS_clocal)
1237 syscall_table[SYS_clocal] = "clocal";
1239 #if defined (SYS_setrlimit)
1240 syscall_table[SYS_setrlimit] = "setrlimit";
1242 #if defined (SYS_getrlimit)
1243 syscall_table[SYS_getrlimit] = "getrlimit";
1245 #if defined (SYS_lchown)
1246 syscall_table[SYS_lchown] = "lchown";
1248 #if defined (SYS_memcntl)
1249 syscall_table[SYS_memcntl] = "memcntl";
1251 #if defined (SYS_getpmsg)
1252 syscall_table[SYS_getpmsg] = "getpmsg";
1254 #if defined (SYS_putpmsg)
1255 syscall_table[SYS_putpmsg] = "putpmsg";
1257 #if defined (SYS_rename)
1258 syscall_table[SYS_rename] = "rename";
1260 #if defined (SYS_uname)
1261 syscall_table[SYS_uname] = "uname";
1263 #if defined (SYS_setegid)
1264 syscall_table[SYS_setegid] = "setegid";
1266 #if defined (SYS_sysconfig)
1267 syscall_table[SYS_sysconfig] = "sysconfig";
1269 #if defined (SYS_adjtime)
1270 syscall_table[SYS_adjtime] = "adjtime";
1272 #if defined (SYS_systeminfo)
1273 syscall_table[SYS_systeminfo] = "systeminfo";
1275 #if defined (SYS_seteuid)
1276 syscall_table[SYS_seteuid] = "seteuid";
1278 #if defined (SYS_sproc)
1279 syscall_table[SYS_sproc] = "sproc";
1287 procfs_kill_inferior - kill any currently inferior
1291 void procfs_kill_inferior (void)
1295 Kill any current inferior.
1299 Kills even attached inferiors. Presumably the user has already
1300 been prompted that the inferior is an attached one rather than
1301 one started by gdb. (FIXME?)
1306 procfs_kill_inferior ()
1308 target_mourn_inferior ();
1315 unconditionally_kill_inferior - terminate the inferior
1319 static void unconditionally_kill_inferior (struct procinfo *)
1323 Kill the specified inferior.
1327 A possibly useful enhancement would be to first try sending
1328 the inferior a terminate signal, politely asking it to commit
1329 suicide, before we murder it (we could call that
1330 politely_kill_inferior()).
1335 unconditionally_kill_inferior (pi)
1336 struct procinfo *pi;
1341 ppid = pi->prstatus.pr_ppid;
1345 #ifdef PROCFS_NEED_CLEAR_CURSIG_FOR_KILL
1346 /* Alpha OSF/1-3.x procfs needs a clear of the current signal
1347 before the PIOCKILL, otherwise it might generate a corrupted core
1348 file for the inferior. */
1349 ioctl (pi->fd, PIOCSSIG, NULL);
1351 #ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
1352 /* Alpha OSF/1-2.x procfs needs a PIOCSSIG call with a SIGKILL signal
1353 to kill the inferior, otherwise it might remain stopped with a
1355 We do not check the result of the PIOCSSIG, the inferior might have
1358 struct siginfo newsiginfo;
1360 memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
1361 newsiginfo.si_signo = signo;
1362 newsiginfo.si_code = 0;
1363 newsiginfo.si_errno = 0;
1364 newsiginfo.si_pid = getpid ();
1365 newsiginfo.si_uid = getuid ();
1366 ioctl (pi->fd, PIOCSSIG, &newsiginfo);
1369 ioctl (pi->fd, PIOCKILL, &signo);
1372 close_proc_file (pi);
1374 /* Only wait() for our direct children. Our grandchildren zombies are killed
1375 by the death of their parents. */
1377 if (ppid == getpid())
1385 procfs_xfer_memory -- copy data to or from inferior memory space
1389 int procfs_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
1390 int dowrite, struct target_ops target)
1394 Copy LEN bytes to/from inferior's memory starting at MEMADDR
1395 from/to debugger memory starting at MYADDR. Copy from inferior
1396 if DOWRITE is zero or to inferior if DOWRITE is nonzero.
1398 Returns the length copied, which is either the LEN argument or
1399 zero. This xfer function does not do partial moves, since procfs_ops
1400 doesn't allow memory operations to cross below us in the target stack
1405 The /proc interface makes this an almost trivial task.
1409 procfs_xfer_memory (memaddr, myaddr, len, dowrite, target)
1414 struct target_ops *target; /* ignored */
1417 struct procinfo *pi;
1419 pi = current_procinfo;
1421 if (lseek(pi->fd, (off_t) memaddr, 0) == (off_t) memaddr)
1425 nbytes = write (pi->fd, myaddr, len);
1429 nbytes = read (pi->fd, myaddr, len);
1443 procfs_store_registers -- copy register values back to inferior
1447 void procfs_store_registers (int regno)
1451 Store our current register values back into the inferior. If
1452 REGNO is -1 then store all the register, otherwise store just
1453 the value specified by REGNO.
1457 If we are storing only a single register, we first have to get all
1458 the current values from the process, overwrite the desired register
1459 in the gregset with the one we want from gdb's registers, and then
1460 send the whole set back to the process. For writing all the
1461 registers, all we have to do is generate the gregset and send it to
1464 Also note that the process has to be stopped on an event of interest
1465 for this to work, which basically means that it has to have been
1466 run under the control of one of the other /proc ioctl calls and not
1467 ptrace. Since we don't use ptrace anyway, we don't worry about this
1468 fine point, but it is worth noting for future reference.
1470 Gdb is confused about what this function is supposed to return.
1471 Some versions return a value, others return nothing. Some are
1472 declared to return a value and actually return nothing. Gdb ignores
1473 anything returned. (FIXME)
1478 procfs_store_registers (regno)
1481 struct procinfo *pi;
1483 pi = current_procinfo;
1487 ioctl (pi->fd, PIOCGREG, &pi->gregset);
1489 fill_gregset (&pi->gregset, regno);
1490 ioctl (pi->fd, PIOCSREG, &pi->gregset);
1492 #if defined (FP0_REGNUM)
1494 /* Now repeat everything using the floating point register set, if the
1495 target has floating point hardware. Since we ignore the returned value,
1496 we'll never know whether it worked or not anyway. */
1500 ioctl (pi->fd, PIOCGFPREG, &pi->fpregset);
1502 fill_fpregset (&pi->fpregset, regno);
1503 ioctl (pi->fd, PIOCSFPREG, &pi->fpregset);
1505 #endif /* FP0_REGNUM */
1513 create_procinfo - initialize access to a /proc entry
1517 struct procinfo * create_procinfo (int pid)
1521 Allocate a procinfo structure, open the /proc file and then set up the
1522 set of signals and faults that are to be traced. Returns a pointer to
1523 the new procinfo structure.
1527 If proc_init_failed ever gets called, control returns to the command
1528 processing loop via the standard error handling code.
1532 static struct procinfo *
1533 create_procinfo (pid)
1536 struct procinfo *pi;
1538 pi = find_procinfo (pid, 1);
1540 return pi; /* All done! It already exists */
1542 pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
1544 if (!open_proc_file (pid, pi, O_RDWR))
1545 proc_init_failed (pi, "can't open process file");
1547 /* open_proc_file may modify pid. */
1551 /* Add new process to process info list */
1553 pi->next = procinfo_list;
1556 add_fd (pi); /* Add to list for poll/select */
1558 pi->num_syscall_handlers = 0;
1559 pi->syscall_handlers = NULL;
1560 memset ((char *) &pi->prrun, 0, sizeof (pi->prrun));
1561 prfillset (&pi->prrun.pr_trace);
1562 procfs_notice_signals (pid);
1563 prfillset (&pi->prrun.pr_fault);
1564 prdelset (&pi->prrun.pr_fault, FLTPAGE);
1566 #ifdef PROCFS_DONT_TRACE_FAULTS
1567 premptyset (&pi->prrun.pr_fault);
1570 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
1571 proc_init_failed (pi, "PIOCSTATUS failed");
1573 /* A bug in Solaris (2.5 at least) causes PIOCWSTOP to hang on LWPs that are
1574 already stopped, even if they all have PR_ASYNC set. */
1576 if (!(pi->prstatus.pr_flags & PR_STOPPED))
1577 if (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
1578 proc_init_failed (pi, "PIOCWSTOP failed");
1580 if (ioctl (pi->fd, PIOCSFAULT, &pi->prrun.pr_fault) < 0)
1581 proc_init_failed (pi, "PIOCSFAULT failed");
1590 procfs_exit_handler - handle entry into the _exit syscall
1594 int procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
1598 This routine is called when an inferior process enters the _exit()
1599 system call. It continues the process, and then collects the exit
1600 status and pid which are returned in *statvalp and *rtnvalp. After
1601 that it returns non-zero to indicate that procfs_wait should wake up.
1604 There is probably a better way to do this.
1609 procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
1610 struct procinfo *pi;
1616 pi->prrun.pr_flags = PRCFAULT;
1618 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
1619 perror_with_name (pi->pathname);
1621 *rtnvalp = wait (statvalp);
1632 procfs_exec_handler - handle exit from the exec family of syscalls
1636 int procfs_exec_handler (pi, syscall_num, why, rtnvalp, statvalp)
1640 This routine is called when an inferior process is about to finish any
1641 of the exec() family of system calls. It pretends that we got a
1642 SIGTRAP (for compatibility with ptrace behavior), and returns non-zero
1643 to tell procfs_wait to wake up.
1646 This need for compatibility with ptrace is questionable. In the
1647 future, it shouldn't be necessary.
1652 procfs_exec_handler (pi, syscall_num, why, rtnvalp, statvalp)
1653 struct procinfo *pi;
1659 *statvalp = (SIGTRAP << 8) | 0177;
1664 #ifdef SYS_sproc /* IRIX lwp creation system call */
1670 procfs_sproc_handler - handle exit from the sproc syscall
1674 int procfs_sproc_handler (pi, syscall_num, why, rtnvalp, statvalp)
1678 This routine is called when an inferior process is about to finish an
1679 sproc() system call. This is the system call that IRIX uses to create
1680 a lightweight process. When the target process gets this event, we can
1681 look at rval1 to find the new child processes ID, and create a new
1682 procinfo struct from that.
1684 After that, it pretends that we got a SIGTRAP, and returns non-zero
1685 to tell procfs_wait to wake up. Subsequently, wait_for_inferior gets
1686 woken up, sees the new process and continues it.
1689 We actually never see the child exiting from sproc because we will
1690 shortly stop the child with PIOCSTOP, which is then registered as the
1695 procfs_sproc_handler (pi, syscall_num, why, rtnvalp, statvalp)
1696 struct procinfo *pi;
1702 /* We've just detected the completion of an sproc system call. Now we need to
1703 setup a procinfo struct for this thread, and notify the thread system of the
1706 /* If sproc failed, then nothing interesting happened. Continue the process
1707 and go back to sleep. */
1709 if (pi->prstatus.pr_errno != 0)
1711 pi->prrun.pr_flags &= PRSTEP;
1712 pi->prrun.pr_flags |= PRCFAULT;
1714 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
1715 perror_with_name (pi->pathname);
1720 /* At this point, the new thread is stopped at it's first instruction, and
1721 the parent is stopped at the exit from sproc. */
1723 /* Notify the caller of the arrival of a new thread. */
1724 create_procinfo (pi->prstatus.pr_rval1);
1726 *rtnvalp = pi->prstatus.pr_rval1;
1727 *statvalp = (SIGTRAP << 8) | 0177;
1736 procfs_fork_handler - handle exit from the fork syscall
1740 int procfs_fork_handler (pi, syscall_num, why, rtnvalp, statvalp)
1744 This routine is called when an inferior process is about to finish a
1745 fork() system call. We will open up the new process, and then close
1746 it, which releases it from the clutches of the debugger.
1748 After that, we continue the target process as though nothing had
1752 This is necessary for IRIX because we have to set PR_FORK in order
1753 to catch the creation of lwps (via sproc()). When an actual fork
1754 occurs, it becomes necessary to reset the forks debugger flags and
1755 continue it because we can't hack multiple processes yet.
1759 procfs_fork_handler (pi, syscall_num, why, rtnvalp, statvalp)
1760 struct procinfo *pi;
1766 struct procinfo *pitemp;
1768 /* At this point, we've detected the completion of a fork (or vfork) call in
1769 our child. The grandchild is also stopped because we set inherit-on-fork
1770 earlier. (Note that nobody has the grandchilds' /proc file open at this
1771 point.) We will release the grandchild from the debugger by opening it's
1772 /proc file and then closing it. Since run-on-last-close is set, the
1773 grandchild continues on its' merry way. */
1776 pitemp = create_procinfo (pi->prstatus.pr_rval1);
1778 close_proc_file (pitemp);
1780 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
1781 perror_with_name (pi->pathname);
1785 #endif /* SYS_sproc */
1791 procfs_init_inferior - initialize target vector and access to a
1796 int procfs_init_inferior (int pid)
1800 When gdb starts an inferior, this function is called in the parent
1801 process immediately after the fork. It waits for the child to stop
1802 on the return from the exec system call (the child itself takes care
1803 of ensuring that this is set up), then sets up the set of signals
1804 and faults that are to be traced. Returns the pid, which may have had
1805 the thread-id added to it.
1809 If proc_init_failed ever gets called, control returns to the command
1810 processing loop via the standard error handling code.
1815 procfs_init_inferior (pid)
1818 struct procinfo *pip;
1820 push_target (&procfs_ops);
1822 pip = create_procinfo (pid);
1825 procfs_set_syscall_trap (pip, SYS_exit, PROCFS_SYSCALL_ENTRY,
1826 procfs_exit_handler);
1829 procfs_set_syscall_trap (pip, SYS_exec, PROCFS_SYSCALL_EXIT,
1830 procfs_exec_handler);
1833 procfs_set_syscall_trap (pip, SYS_execv, PROCFS_SYSCALL_EXIT,
1834 procfs_exec_handler);
1837 procfs_set_syscall_trap (pip, SYS_execve, PROCFS_SYSCALL_EXIT,
1838 procfs_exec_handler);
1840 #endif /* PIOCSSPCACT */
1842 /* Setup traps on exit from sproc() */
1845 procfs_set_syscall_trap (pip, SYS_sproc, PROCFS_SYSCALL_EXIT,
1846 procfs_sproc_handler);
1847 procfs_set_syscall_trap (pip, SYS_fork, PROCFS_SYSCALL_EXIT,
1848 procfs_fork_handler);
1850 procfs_set_syscall_trap (pip, SYS_vfork, PROCFS_SYSCALL_EXIT,
1851 procfs_fork_handler);
1853 /* Turn on inherit-on-fork flag so that all children of the target process
1854 start with tracing flags set. This allows us to trap lwp creation. Note
1855 that we also have to trap on fork and vfork in order to disable all tracing
1856 in the targets child processes. */
1858 modify_inherit_on_fork_flag (pip->fd, 1);
1861 #ifdef SYS_lwp_create
1862 procfs_set_syscall_trap (pip, SYS_lwp_create, PROCFS_SYSCALL_EXIT,
1863 procfs_lwp_creation_handler);
1866 /* create_procinfo may change the pid, so we have to update inferior_pid
1867 here before calling other gdb routines that need the right pid. */
1872 add_thread (pip -> pid); /* Setup initial thread */
1874 #ifdef START_INFERIOR_TRAPS_EXPECTED
1875 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
1877 /* One trap to exec the shell, one to exec the program being debugged. */
1878 startup_inferior (2);
1888 procfs_notice_signals
1892 static void procfs_notice_signals (int pid);
1896 When the user changes the state of gdb's signal handling via the
1897 "handle" command, this function gets called to see if any change
1898 in the /proc interface is required. It is also called internally
1899 by other /proc interface functions to initialize the state of
1900 the traced signal set.
1902 One thing it does is that signals for which the state is "nostop",
1903 "noprint", and "pass", have their trace bits reset in the pr_trace
1904 field, so that they are no longer traced. This allows them to be
1905 delivered directly to the inferior without the debugger ever being
1910 procfs_notice_signals (pid)
1914 struct procinfo *pi;
1916 pi = find_procinfo (pid, 0);
1918 for (signo = 0; signo < NSIG; signo++)
1920 if (signal_stop_state (target_signal_from_host (signo)) == 0 &&
1921 signal_print_state (target_signal_from_host (signo)) == 0 &&
1922 signal_pass_state (target_signal_from_host (signo)) == 1)
1924 prdelset (&pi->prrun.pr_trace, signo);
1928 praddset (&pi->prrun.pr_trace, signo);
1931 if (ioctl (pi->fd, PIOCSTRACE, &pi->prrun.pr_trace))
1933 print_sys_errmsg ("PIOCSTRACE failed", errno);
1941 proc_set_exec_trap -- arrange for exec'd child to halt at startup
1945 void proc_set_exec_trap (void)
1949 This function is called in the child process when starting up
1950 an inferior, prior to doing the exec of the actual inferior.
1951 It sets the child process's exitset to make exit from the exec
1952 system call an event of interest to stop on, and then simply
1953 returns. The child does the exec, the system call returns, and
1954 the child stops at the first instruction, ready for the gdb
1955 parent process to take control of it.
1959 We need to use all local variables since the child may be sharing
1960 it's data space with the parent, if vfork was used rather than
1963 Also note that we want to turn off the inherit-on-fork flag in
1964 the child process so that any grand-children start with all
1965 tracing flags cleared.
1969 proc_set_exec_trap ()
1973 auto char procname[32];
1976 sprintf (procname, PROC_NAME_FMT, getpid ());
1977 if ((fd = open (procname, O_RDWR)) < 0)
1980 gdb_flush (gdb_stderr);
1983 premptyset (&exitset);
1984 premptyset (&entryset);
1987 /* Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
1988 exits from exec system calls because of the user level loader.
1989 Starting with OSF/1-4.0, tracing the entry to the exit system
1990 call no longer works. So we have to use PRFS_STOPTERM to trace
1991 termination of the inferior. */
1995 if (ioctl (fd, PIOCGSPCACT, &prfs_flags) < 0)
1998 gdb_flush (gdb_stderr);
2001 prfs_flags |= PRFS_STOPEXEC | PRFS_STOPTERM;
2002 if (ioctl (fd, PIOCSSPCACT, &prfs_flags) < 0)
2005 gdb_flush (gdb_stderr);
2009 #else /* PIOCSSPCACT */
2011 Not all systems with /proc have all the exec* syscalls with the same
2012 names. On the SGI, for example, there is no SYS_exec, but there
2013 *is* a SYS_execv. So, we try to account for that. */
2016 praddset (&exitset, SYS_exec);
2019 praddset (&exitset, SYS_execve);
2022 praddset (&exitset, SYS_execv);
2025 if (ioctl (fd, PIOCSEXIT, &exitset) < 0)
2028 gdb_flush (gdb_stderr);
2032 praddset (&entryset, SYS_exit);
2034 if (ioctl (fd, PIOCSENTRY, &entryset) < 0)
2037 gdb_flush (gdb_stderr);
2040 #endif /* PIOCSSPCACT */
2042 /* Turn off inherit-on-fork flag so that all grand-children of gdb
2043 start with tracing flags cleared. */
2045 modify_inherit_on_fork_flag (fd, 0);
2047 /* Turn on run-on-last-close flag so that this process will not hang
2048 if GDB goes away for some reason. */
2050 modify_run_on_last_close_flag (fd, 1);
2056 /* Solaris needs this to make procfs treat all threads seperately. Without
2057 this, all threads halt whenever something happens to any thread. Since
2058 GDB wants to control all this itself, it needs to set PR_ASYNC. */
2060 pr_flags = PR_ASYNC;
2062 ioctl (fd, PIOCSET, &pr_flags);
2064 #endif /* PR_ASYNC */
2071 proc_iterate_over_mappings -- call function for every mapped space
2075 int proc_iterate_over_mappings (int (*func)())
2079 Given a pointer to a function, call that function for every
2080 mapped address space, passing it an open file descriptor for
2081 the file corresponding to that mapped address space (if any)
2082 and the base address of the mapped space. Quit when we hit
2083 the end of the mappings or the function returns nonzero.
2087 proc_iterate_over_mappings (func)
2088 int (*func) PARAMS ((int, CORE_ADDR));
2093 struct prmap *prmaps;
2094 struct prmap *prmap;
2095 struct procinfo *pi;
2097 pi = current_procinfo;
2099 if (ioctl (pi->fd, PIOCNMAP, &nmap) == 0)
2101 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
2102 if (ioctl (pi->fd, PIOCMAP, prmaps) == 0)
2104 for (prmap = prmaps; prmap -> pr_size && funcstat == 0; ++prmap)
2106 fd = proc_address_to_fd (pi, (CORE_ADDR) prmap -> pr_vaddr, 0);
2107 funcstat = (*func) (fd, (CORE_ADDR) prmap -> pr_vaddr);
2115 #if 0 /* Currently unused */
2120 proc_base_address -- find base address for segment containing address
2124 CORE_ADDR proc_base_address (CORE_ADDR addr)
2128 Given an address of a location in the inferior, find and return
2129 the base address of the mapped segment containing that address.
2131 This is used for example, by the shared library support code,
2132 where we have the pc value for some location in the shared library
2133 where we are stopped, and need to know the base address of the
2134 segment containing that address.
2138 proc_base_address (addr)
2142 struct prmap *prmaps;
2143 struct prmap *prmap;
2144 CORE_ADDR baseaddr = 0;
2145 struct procinfo *pi;
2147 pi = current_procinfo;
2149 if (ioctl (pi->fd, PIOCNMAP, &nmap) == 0)
2151 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
2152 if (ioctl (pi->fd, PIOCMAP, prmaps) == 0)
2154 for (prmap = prmaps; prmap -> pr_size; ++prmap)
2156 if ((prmap -> pr_vaddr <= (caddr_t) addr) &&
2157 (prmap -> pr_vaddr + prmap -> pr_size > (caddr_t) addr))
2159 baseaddr = (CORE_ADDR) prmap -> pr_vaddr;
2174 proc_address_to_fd -- return open fd for file mapped to address
2178 int proc_address_to_fd (struct procinfo *pi, CORE_ADDR addr, complain)
2182 Given an address in the current inferior's address space, use the
2183 /proc interface to find an open file descriptor for the file that
2184 this address was mapped in from. Return -1 if there is no current
2185 inferior. Print a warning message if there is an inferior but
2186 the address corresponds to no file (IE a bogus address).
2191 proc_address_to_fd (pi, addr, complain)
2192 struct procinfo *pi;
2198 if ((fd = ioctl (pi->fd, PIOCOPENM, (caddr_t *) &addr)) < 0)
2202 print_sys_errmsg (pi->pathname, errno);
2203 warning ("can't find mapped file for address 0x%x", addr);
2210 /* Attach to process PID, then initialize for debugging it
2211 and wait for the trace-trap that results from attaching. */
2214 procfs_attach (args, from_tty)
2222 error_no_arg ("process-id to attach");
2226 if (pid == getpid()) /* Trying to masturbate? */
2227 error ("I refuse to debug myself!");
2231 exec_file = (char *) get_exec_file (0);
2234 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file, target_pid_to_str (pid));
2236 printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid));
2238 gdb_flush (gdb_stdout);
2241 inferior_pid = pid = do_attach (pid);
2242 push_target (&procfs_ops);
2246 /* Take a program previously attached to and detaches it.
2247 The program resumes execution and will no longer stop
2248 on signals, etc. We'd better not have left any breakpoints
2249 in the program or it'll die when it hits one. For this
2250 to work, it may be necessary for the process to have been
2251 previously attached. It *might* work if the program was
2252 started via the normal ptrace (PTRACE_TRACEME). */
2255 procfs_detach (args, from_tty)
2263 char *exec_file = get_exec_file (0);
2266 printf_unfiltered ("Detaching from program: %s %s\n",
2267 exec_file, target_pid_to_str (inferior_pid));
2268 gdb_flush (gdb_stdout);
2271 siggnal = atoi (args);
2273 do_detach (siggnal);
2275 unpush_target (&procfs_ops); /* Pop out of handling an inferior */
2278 /* Get ready to modify the registers array. On machines which store
2279 individual registers, this doesn't need to do anything. On machines
2280 which store all the registers in one fell swoop, this makes sure
2281 that registers contains all the registers from the program being
2285 procfs_prepare_to_store ()
2287 #ifdef CHILD_PREPARE_TO_STORE
2288 CHILD_PREPARE_TO_STORE ();
2292 /* Print status information about what we're accessing. */
2295 procfs_files_info (ignore)
2296 struct target_ops *ignore;
2298 printf_unfiltered ("\tUsing the running image of %s %s via /proc.\n",
2299 attach_flag? "attached": "child", target_pid_to_str (inferior_pid));
2304 procfs_open (arg, from_tty)
2308 error ("Use the \"run\" command to start a Unix child process.");
2315 do_attach -- attach to an already existing process
2319 int do_attach (int pid)
2323 Attach to an already existing process with the specified process
2324 id. If the process is not already stopped, query whether to
2329 The option of stopping at attach time is specific to the /proc
2330 versions of gdb. Versions using ptrace force the attachee
2331 to stop. (I have changed this version to do so, too. All you
2340 struct procinfo *pi;
2342 pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
2344 if (!open_proc_file (pid, pi, O_RDWR))
2347 perror_with_name (pi->pathname);
2353 /* Add new process to process info list */
2355 pi->next = procinfo_list;
2358 add_fd (pi); /* Add to list for poll/select */
2360 /* Get current status of process and if it is not already stopped,
2361 then stop it. Remember whether or not it was stopped when we first
2364 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
2366 print_sys_errmsg (pi->pathname, errno);
2367 close_proc_file (pi);
2368 error ("PIOCSTATUS failed");
2370 if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
2372 pi->was_stopped = 1;
2376 pi->was_stopped = 0;
2377 if (1 || query ("Process is currently running, stop it? "))
2379 /* Make it run again when we close it. */
2381 modify_run_on_last_close_flag (pi->fd, 1);
2383 if (ioctl (pi->fd, PIOCSTOP, &pi->prstatus) < 0)
2385 print_sys_errmsg (pi->pathname, errno);
2386 close_proc_file (pi);
2387 error ("PIOCSTOP failed");
2389 pi->nopass_next_sigstop = 1;
2393 printf_unfiltered ("Ok, gdb will wait for %s to stop.\n", target_pid_to_str (pid));
2397 /* Remember some things about the inferior that we will, or might, change
2398 so that we can restore them when we detach. */
2400 ioctl (pi->fd, PIOCGTRACE, &pi->saved_trace);
2401 ioctl (pi->fd, PIOCGHOLD, &pi->saved_sighold);
2402 ioctl (pi->fd, PIOCGFAULT, &pi->saved_fltset);
2403 ioctl (pi->fd, PIOCGENTRY, &pi->saved_entryset);
2404 ioctl (pi->fd, PIOCGEXIT, &pi->saved_exitset);
2406 /* Set up trace and fault sets, as gdb expects them. */
2408 memset (&pi->prrun, 0, sizeof (pi->prrun));
2409 prfillset (&pi->prrun.pr_trace);
2410 procfs_notice_signals (pid);
2411 prfillset (&pi->prrun.pr_fault);
2412 prdelset (&pi->prrun.pr_fault, FLTPAGE);
2414 #ifdef PROCFS_DONT_TRACE_FAULTS
2415 premptyset (&pi->prrun.pr_fault);
2418 if (ioctl (pi->fd, PIOCSFAULT, &pi->prrun.pr_fault))
2420 print_sys_errmsg ("PIOCSFAULT failed", errno);
2422 if (ioctl (pi->fd, PIOCSTRACE, &pi->prrun.pr_trace))
2424 print_sys_errmsg ("PIOCSTRACE failed", errno);
2434 do_detach -- detach from an attached-to process
2438 void do_detach (int signal)
2442 Detach from the current attachee.
2444 If signal is non-zero, the attachee is started running again and sent
2445 the specified signal.
2447 If signal is zero and the attachee was not already stopped when we
2448 attached to it, then we make it runnable again when we detach.
2450 Otherwise, we query whether or not to make the attachee runnable
2451 again, since we may simply want to leave it in the state it was in
2454 We report any problems, but do not consider them errors, since we
2455 MUST detach even if some things don't seem to go right. This may not
2456 be the ideal situation. (FIXME).
2463 struct procinfo *pi;
2465 pi = current_procinfo;
2469 set_proc_siginfo (pi, signal);
2471 if (ioctl (pi->fd, PIOCSEXIT, &pi->saved_exitset) < 0)
2473 print_sys_errmsg (pi->pathname, errno);
2474 printf_unfiltered ("PIOCSEXIT failed.\n");
2476 if (ioctl (pi->fd, PIOCSENTRY, &pi->saved_entryset) < 0)
2478 print_sys_errmsg (pi->pathname, errno);
2479 printf_unfiltered ("PIOCSENTRY failed.\n");
2481 if (ioctl (pi->fd, PIOCSTRACE, &pi->saved_trace) < 0)
2483 print_sys_errmsg (pi->pathname, errno);
2484 printf_unfiltered ("PIOCSTRACE failed.\n");
2486 if (ioctl (pi->fd, PIOCSHOLD, &pi->saved_sighold) < 0)
2488 print_sys_errmsg (pi->pathname, errno);
2489 printf_unfiltered ("PIOSCHOLD failed.\n");
2491 if (ioctl (pi->fd, PIOCSFAULT, &pi->saved_fltset) < 0)
2493 print_sys_errmsg (pi->pathname, errno);
2494 printf_unfiltered ("PIOCSFAULT failed.\n");
2496 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
2498 print_sys_errmsg (pi->pathname, errno);
2499 printf_unfiltered ("PIOCSTATUS failed.\n");
2503 if (signal || (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
2505 if (signal || !pi->was_stopped ||
2506 query ("Was stopped when attached, make it runnable again? "))
2508 /* Clear any pending signal if we want to detach without
2511 set_proc_siginfo (pi, signal);
2513 /* Clear any fault that might have stopped it. */
2514 if (ioctl (pi->fd, PIOCCFAULT, 0))
2516 print_sys_errmsg (pi->pathname, errno);
2517 printf_unfiltered ("PIOCCFAULT failed.\n");
2520 /* Make it run again when we close it. */
2522 modify_run_on_last_close_flag (pi->fd, 1);
2526 close_proc_file (pi);
2530 /* emulate wait() as much as possible.
2531 Wait for child to do something. Return pid of child, or -1 in case
2532 of error; store status in *OURSTATUS.
2534 Not sure why we can't
2535 just use wait(), but it seems to have problems when applied to a
2536 process being controlled with the /proc interface.
2538 We have a race problem here with no obvious solution. We need to let
2539 the inferior run until it stops on an event of interest, which means
2540 that we need to use the PIOCWSTOP ioctl. However, we cannot use this
2541 ioctl if the process is already stopped on something that is not an
2542 event of interest, or the call will hang indefinitely. Thus we first
2543 use PIOCSTATUS to see if the process is not stopped. If not, then we
2544 use PIOCWSTOP. But during the window between the two, if the process
2545 stops for any reason that is not an event of interest (such as a job
2546 control signal) then gdb will hang. One possible workaround is to set
2547 an alarm to wake up every minute of so and check to see if the process
2548 is still running, and if so, then reissue the PIOCWSTOP. But this is
2549 a real kludge, so has not been implemented. FIXME: investigate
2552 FIXME: Investigate why wait() seems to have problems with programs
2553 being control by /proc routines. */
2556 procfs_wait (pid, ourstatus)
2558 struct target_waitstatus *ourstatus;
2565 struct procinfo *pi;
2567 if (pid != -1) /* Non-specific process? */
2570 for (pi = procinfo_list; pi; pi = pi->next)
2585 for (pi = procinfo_list; pi; pi = pi->next)
2586 if (pi->pid == pid && pi->had_event)
2589 if (!pi && !checkerr)
2592 if (!checkerr && !(pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
2594 if (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
2601 if (errno == ENOENT)
2603 rtnval = wait (&statval);
2604 if (rtnval != inferior_pid)
2606 print_sys_errmsg (pi->pathname, errno);
2607 error ("PIOCWSTOP, wait failed, returned %d", rtnval);
2613 print_sys_errmsg (pi->pathname, errno);
2614 error ("PIOCSTATUS or PIOCWSTOP failed.");
2618 else if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
2621 why = pi->prstatus.pr_why;
2622 what = pi->prstatus.pr_what;
2627 statval = (what << 8) | 0177;
2633 int found_handler = 0;
2635 for (i = 0; i < pi->num_syscall_handlers; i++)
2636 if (pi->syscall_handlers[i].syscall_num == what)
2639 if (!pi->syscall_handlers[i].func (pi, what, why,
2647 if (why == PR_SYSENTRY)
2648 error ("PR_SYSENTRY, unhandled system call %d", what);
2650 error ("PR_SYSEXIT, unhandled system call %d", what);
2654 case (short)PR_DEAD:
2658 /* The inferior process is about to terminate.
2659 pr_what has the process's exit or return value.
2660 A PIOCRUN ioctl must be used to restart the process so it
2661 can finish exiting. */
2663 pi->prrun.pr_flags = PRCFAULT;
2665 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
2666 perror_with_name (pi->pathname);
2668 if (wait (&dummy) < 0)
2670 statval = pi->prstatus.pr_what;
2675 statval = (SIGSTOP << 8) | 0177;
2678 statval = (what << 8) | 0177;
2685 statval = (SIGTRAP << 8) | 0177;
2690 statval = (SIGTRAP << 8) | 0177;
2693 #ifndef FAULTED_USE_SIGINFO
2694 /* Irix, contrary to the documentation, fills in 0 for si_signo.
2695 Solaris fills in si_signo. I'm not sure about others. */
2698 statval = (SIGILL << 8) | 0177;
2702 statval = (SIGTRAP << 8) | 0177;
2707 statval = (SIGSEGV << 8) | 0177;
2712 statval = (SIGFPE << 8) | 0177;
2714 case FLTPAGE: /* Recoverable page fault */
2715 #endif /* not FAULTED_USE_SIGINFO */
2717 /* Use the signal which the kernel assigns. This is better than
2718 trying to second-guess it from the fault. In fact, I suspect
2719 that FLTACCESS can be either SIGSEGV or SIGBUS. */
2720 statval = ((pi->prstatus.pr_info.si_signo) << 8) | 0177;
2725 error ("PIOCWSTOP, unknown why %d, what %d", why, what);
2727 /* Stop all the other threads when any of them stops. */
2730 struct procinfo *procinfo;
2732 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
2734 if (!procinfo->had_event)
2736 /* A bug in Solaris (2.5) causes us to hang when trying to
2737 stop a stopped process. So, we have to check first in
2738 order to avoid the hang. */
2739 if (ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus) < 0)
2741 print_sys_errmsg (procinfo->pathname, errno);
2742 error ("PIOCSTATUS failed");
2744 if (!(procinfo->prstatus.pr_flags & PR_STOPPED))
2745 if (ioctl (procinfo->fd, PIOCSTOP, &procinfo->prstatus) < 0)
2747 print_sys_errmsg (procinfo->pathname, errno);
2748 error ("PIOCSTOP failed");
2756 error ("PIOCWSTOP, stopped for unknown/unhandled reason, flags %#x",
2757 pi->prstatus.pr_flags);
2760 store_waitstatus (ourstatus, statval);
2762 if (rtnval == -1) /* No more children to wait for */
2764 fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing.\n");
2765 /* Claim it exited with unknown signal. */
2766 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
2767 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
2771 pi->had_event = 0; /* Indicate that we've seen this one */
2779 set_proc_siginfo - set a process's current signal info
2783 void set_proc_siginfo (struct procinfo *pip, int signo);
2787 Given a pointer to a process info struct in PIP and a signal number
2788 in SIGNO, set the process's current signal and its associated signal
2789 information. The signal will be delivered to the process immediately
2790 after execution is resumed, even if it is being held. In addition,
2791 this particular delivery will not cause another PR_SIGNALLED stop
2792 even if the signal is being traced.
2794 If we are not delivering the same signal that the prstatus siginfo
2795 struct contains information about, then synthesize a siginfo struct
2796 to match the signal we are doing to deliver, make it of the type
2797 "generated by a user process", and send this synthesized copy. When
2798 used to set the inferior's signal state, this will be required if we
2799 are not currently stopped because of a traced signal, or if we decide
2800 to continue with a different signal.
2802 Note that when continuing the inferior from a stop due to receipt
2803 of a traced signal, we either have set PRCSIG to clear the existing
2804 signal, or we have to call this function to do a PIOCSSIG with either
2805 the existing siginfo struct from pr_info, or one we have synthesized
2806 appropriately for the signal we want to deliver. Otherwise if the
2807 signal is still being traced, the inferior will immediately stop
2810 See siginfo(5) for more details.
2814 set_proc_siginfo (pip, signo)
2815 struct procinfo *pip;
2818 struct siginfo newsiginfo;
2819 struct siginfo *sip;
2821 #ifdef PROCFS_DONT_PIOCSSIG_CURSIG
2822 /* With Alpha OSF/1 procfs, the kernel gets really confused if it
2823 receives a PIOCSSIG with a signal identical to the current signal,
2824 it messes up the current signal. Work around the kernel bug. */
2825 if (signo == pip -> prstatus.pr_cursig)
2829 if (signo == pip -> prstatus.pr_info.si_signo)
2831 sip = &pip -> prstatus.pr_info;
2835 memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
2837 sip -> si_signo = signo;
2839 sip -> si_errno = 0;
2840 sip -> si_pid = getpid ();
2841 sip -> si_uid = getuid ();
2843 if (ioctl (pip -> fd, PIOCSSIG, sip) < 0)
2845 print_sys_errmsg (pip -> pathname, errno);
2846 warning ("PIOCSSIG failed");
2850 /* Resume execution of process PID. If STEP is nozero, then
2851 just single step it. If SIGNAL is nonzero, restart it with that
2852 signal activated. */
2855 procfs_resume (pid, step, signo)
2858 enum target_signal signo;
2861 struct procinfo *pi, *procinfo;
2863 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
2866 pi->prrun.pr_flags = PRSTRACE | PRSFAULT | PRCFAULT;
2869 /* It should not be necessary. If the user explicitly changes the value,
2870 value_assign calls write_register_bytes, which writes it. */
2871 /* It may not be absolutely necessary to specify the PC value for
2872 restarting, but to be safe we use the value that gdb considers
2873 to be current. One case where this might be necessary is if the
2874 user explicitly changes the PC value that gdb considers to be
2875 current. FIXME: Investigate if this is necessary or not. */
2877 #ifdef PRSVADDR_BROKEN
2878 /* Can't do this under Solaris running on a Sparc, as there seems to be no
2879 place to put nPC. In fact, if you use this, nPC seems to be set to some
2880 random garbage. We have to rely on the fact that PC and nPC have been
2881 written previously via PIOCSREG during a register flush. */
2883 pi->prrun.pr_vaddr = (caddr_t) *(int *) ®isters[REGISTER_BYTE (PC_REGNUM)];
2884 pi->prrun.pr_flags != PRSVADDR;
2888 if (signo == TARGET_SIGNAL_STOP && pi->nopass_next_sigstop)
2889 /* When attaching to a child process, if we forced it to stop with
2890 a PIOCSTOP, then we will have set the nopass_next_sigstop flag.
2891 Upon resuming the first time after such a stop, we explicitly
2892 inhibit sending it another SIGSTOP, which would be the normal
2893 result of default signal handling. One potential drawback to
2894 this is that we will also ignore any attempt to by the user
2895 to explicitly continue after the attach with a SIGSTOP. Ultimately
2896 this problem should be dealt with by making the routines that
2897 deal with the inferior a little smarter, and possibly even allow
2898 an inferior to continue running at the same time as gdb. (FIXME?) */
2900 else if (signo == TARGET_SIGNAL_TSTP
2901 && pi->prstatus.pr_cursig == SIGTSTP
2902 && pi->prstatus.pr_action.sa_handler == SIG_DFL)
2904 /* We are about to pass the inferior a SIGTSTP whose action is
2905 SIG_DFL. The SIG_DFL action for a SIGTSTP is to stop
2906 (notifying the parent via wait()), and then keep going from the
2907 same place when the parent is ready for you to keep going. So
2908 under the debugger, it should do nothing (as if the program had
2909 been stopped and then later resumed. Under ptrace, this
2910 happens for us, but under /proc, the system obligingly stops
2911 the process, and wait_for_inferior would have no way of
2912 distinguishing that type of stop (which indicates that we
2913 should just start it again), with a stop due to the pr_trace
2914 field of the prrun_t struct.
2916 Note that if the SIGTSTP is being caught, we *do* need to pass it,
2917 because the handler needs to get executed. */
2920 signal_to_pass = target_signal_to_host (signo);
2924 set_proc_siginfo (pi, signal_to_pass);
2928 pi->prrun.pr_flags |= PRCSIG;
2930 pi->nopass_next_sigstop = 0;
2933 pi->prrun.pr_flags |= PRSTEP;
2936 /* Don't try to start a process unless it's stopped on an
2937 `event of interest'. Doing so will cause errors. */
2939 if ((pi->prstatus.pr_flags & PR_ISTOP)
2940 && ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
2942 perror_with_name (pi->pathname);
2948 /* Continue all the other threads that haven't had an event of
2952 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
2954 if (pi != procinfo && !procinfo->had_event)
2956 procinfo->prrun.pr_flags &= PRSTEP;
2957 procinfo->prrun.pr_flags |= PRCFAULT | PRCSIG;
2958 ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus);
2960 /* Don't try to start a process unless it's stopped on an
2961 `event of interest'. Doing so will cause errors. */
2963 if ((procinfo->prstatus.pr_flags & PR_ISTOP)
2964 && ioctl (procinfo->fd, PIOCRUN, &procinfo->prrun) < 0)
2966 if (ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus) < 0)
2968 fprintf_unfiltered(gdb_stderr, "PIOCSTATUS failed, errno=%d\n", errno);
2970 print_sys_errmsg (procinfo->pathname, errno);
2971 error ("PIOCRUN failed");
2973 ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus);
2982 procfs_fetch_registers -- fetch current registers from inferior
2986 void procfs_fetch_registers (int regno)
2990 Read the current values of the inferior's registers, both the
2991 general register set and floating point registers (if supported)
2992 and update gdb's idea of their current values.
2997 procfs_fetch_registers (regno)
3000 struct procinfo *pi;
3002 pi = current_procinfo;
3004 if (ioctl (pi->fd, PIOCGREG, &pi->gregset) != -1)
3006 supply_gregset (&pi->gregset);
3008 #if defined (FP0_REGNUM)
3009 if (ioctl (pi->fd, PIOCGFPREG, &pi->fpregset) != -1)
3011 supply_fpregset (&pi->fpregset);
3020 proc_init_failed - called whenever /proc access initialization
3025 static void proc_init_failed (struct procinfo *pi, char *why)
3029 This function is called whenever initialization of access to a /proc
3030 entry fails. It prints a suitable error message, does some cleanup,
3031 and then invokes the standard error processing routine which dumps
3032 us back into the command loop.
3036 proc_init_failed (pi, why)
3037 struct procinfo *pi;
3040 print_sys_errmsg (pi->pathname, errno);
3041 kill (pi->pid, SIGKILL);
3042 close_proc_file (pi);
3051 close_proc_file - close any currently open /proc entry
3055 static void close_proc_file (struct procinfo *pip)
3059 Close any currently open /proc entry and mark the process information
3060 entry as invalid. In order to ensure that we don't try to reuse any
3061 stale information, the pid, fd, and pathnames are explicitly
3062 invalidated, which may be overkill.
3067 close_proc_file (pip)
3068 struct procinfo *pip;
3070 struct procinfo *procinfo;
3072 remove_fd (pip); /* Remove fd from poll/select list */
3076 free (pip -> pathname);
3078 /* Unlink pip from the procinfo chain. Note pip might not be on the list. */
3080 if (procinfo_list == pip)
3081 procinfo_list = pip->next;
3083 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
3084 if (procinfo->next == pip)
3085 procinfo->next = pip->next;
3094 open_proc_file - open a /proc entry for a given process id
3098 static int open_proc_file (int pid, struct procinfo *pip, int mode)
3102 Given a process id and a mode, close the existing open /proc
3103 entry (if any) and open one for the new process id, in the
3104 specified mode. Once it is open, then mark the local process
3105 information structure as valid, which guarantees that the pid,
3106 fd, and pathname fields match an open /proc entry. Returns
3107 zero if the open fails, nonzero otherwise.
3109 Note that the pathname is left intact, even when the open fails,
3110 so that callers can use it to construct meaningful error messages
3111 rather than just "file open failed".
3113 Note that for Solaris, the process-id also includes an LWP-id, so we
3114 actually attempt to open that. If we are handed a pid with a 0 LWP-id,
3115 then we will ask the kernel what it is and add it to the pid. Hence,
3116 the pid can be changed by us.
3120 open_proc_file (pid, pip, mode)
3122 struct procinfo *pip;
3128 pip -> had_event = 0;
3129 pip -> pathname = xmalloc (32);
3138 sprintf (pip -> pathname, PROC_NAME_FMT, tmp);
3139 if ((tmpfd = open (pip -> pathname, mode)) < 0)
3145 tmp = (pid >> 16) & 0xffff; /* Extract thread id */
3148 { /* Don't know thread id yet */
3149 if (ioctl (tmpfd, PIOCSTATUS, &pip -> prstatus) < 0)
3151 print_sys_errmsg (pip -> pathname, errno);
3153 error ("open_proc_file: PIOCSTATUS failed");
3156 tmp = pip -> prstatus.pr_who; /* Get thread id from prstatus_t */
3157 pip -> pid = (tmp << 16) | pid; /* Update pip */
3160 if ((pip -> fd = ioctl (tmpfd, PIOCOPENLWP, &tmp)) < 0)
3166 #ifdef PIOCSET /* New method */
3169 pr_flags = PR_ASYNC;
3170 ioctl (pip -> fd, PIOCSET, &pr_flags);
3174 close (tmpfd); /* All done with main pid */
3175 #endif /* PIOCOPENLWP */
3181 mappingflags (flags)
3184 static char asciiflags[8];
3186 strcpy (asciiflags, "-------");
3187 #if defined (MA_PHYS)
3188 if (flags & MA_PHYS) asciiflags[0] = 'd';
3190 if (flags & MA_STACK) asciiflags[1] = 's';
3191 if (flags & MA_BREAK) asciiflags[2] = 'b';
3192 if (flags & MA_SHARED) asciiflags[3] = 's';
3193 if (flags & MA_READ) asciiflags[4] = 'r';
3194 if (flags & MA_WRITE) asciiflags[5] = 'w';
3195 if (flags & MA_EXEC) asciiflags[6] = 'x';
3196 return (asciiflags);
3200 info_proc_flags (pip, summary)
3201 struct procinfo *pip;
3204 struct trans *transp;
3206 printf_filtered ("%-32s", "Process status flags:");
3209 printf_filtered ("\n\n");
3211 for (transp = pr_flag_table; transp -> name != NULL; transp++)
3213 if (pip -> prstatus.pr_flags & transp -> value)
3217 printf_filtered ("%s ", transp -> name);
3221 printf_filtered ("\t%-16s %s.\n", transp -> name, transp -> desc);
3225 printf_filtered ("\n");
3229 info_proc_stop (pip, summary)
3230 struct procinfo *pip;
3233 struct trans *transp;
3237 why = pip -> prstatus.pr_why;
3238 what = pip -> prstatus.pr_what;
3240 if (pip -> prstatus.pr_flags & PR_STOPPED)
3242 printf_filtered ("%-32s", "Reason for stopping:");
3245 printf_filtered ("\n\n");
3247 for (transp = pr_why_table; transp -> name != NULL; transp++)
3249 if (why == transp -> value)
3253 printf_filtered ("%s ", transp -> name);
3257 printf_filtered ("\t%-16s %s.\n",
3258 transp -> name, transp -> desc);
3264 /* Use the pr_why field to determine what the pr_what field means, and
3265 print more information. */
3270 /* pr_what is unused for this case */
3276 printf_filtered ("%s ", signalname (what));
3280 printf_filtered ("\t%-16s %s.\n", signalname (what),
3281 safe_strsignal (what));
3287 printf_filtered ("%s ", syscallname (what));
3291 printf_filtered ("\t%-16s %s.\n", syscallname (what),
3292 "Entered this system call");
3298 printf_filtered ("%s ", syscallname (what));
3302 printf_filtered ("\t%-16s %s.\n", syscallname (what),
3303 "Returned from this system call");
3309 printf_filtered ("%s ",
3310 lookupname (faults_table, what, "fault"));
3314 printf_filtered ("\t%-16s %s.\n",
3315 lookupname (faults_table, what, "fault"),
3316 lookupdesc (faults_table, what));
3320 printf_filtered ("\n");
3325 info_proc_siginfo (pip, summary)
3326 struct procinfo *pip;
3329 struct siginfo *sip;
3331 if ((pip -> prstatus.pr_flags & PR_STOPPED) &&
3332 (pip -> prstatus.pr_why == PR_SIGNALLED ||
3333 pip -> prstatus.pr_why == PR_FAULTED))
3335 printf_filtered ("%-32s", "Additional signal/fault info:");
3336 sip = &pip -> prstatus.pr_info;
3339 printf_filtered ("%s ", signalname (sip -> si_signo));
3340 if (sip -> si_errno > 0)
3342 printf_filtered ("%s ", errnoname (sip -> si_errno));
3344 if (sip -> si_code <= 0)
3346 printf_filtered ("sent by %s, uid %d ",
3347 target_pid_to_str (sip -> si_pid),
3352 printf_filtered ("%s ", sigcodename (sip));
3353 if ((sip -> si_signo == SIGILL) ||
3354 (sip -> si_signo == SIGFPE) ||
3355 (sip -> si_signo == SIGSEGV) ||
3356 (sip -> si_signo == SIGBUS))
3358 printf_filtered ("addr=%#lx ",
3359 (unsigned long) sip -> si_addr);
3361 else if ((sip -> si_signo == SIGCHLD))
3363 printf_filtered ("child %s, status %u ",
3364 target_pid_to_str (sip -> si_pid),
3367 else if ((sip -> si_signo == SIGPOLL))
3369 printf_filtered ("band %u ", sip -> si_band);
3375 printf_filtered ("\n\n");
3376 printf_filtered ("\t%-16s %s.\n", signalname (sip -> si_signo),
3377 safe_strsignal (sip -> si_signo));
3378 if (sip -> si_errno > 0)
3380 printf_filtered ("\t%-16s %s.\n",
3381 errnoname (sip -> si_errno),
3382 safe_strerror (sip -> si_errno));
3384 if (sip -> si_code <= 0)
3386 printf_filtered ("\t%-16u %s\n", sip -> si_pid, /* XXX need target_pid_to_str() */
3387 "PID of process sending signal");
3388 printf_filtered ("\t%-16u %s\n", sip -> si_uid,
3389 "UID of process sending signal");
3393 printf_filtered ("\t%-16s %s.\n", sigcodename (sip),
3395 if ((sip -> si_signo == SIGILL) ||
3396 (sip -> si_signo == SIGFPE))
3398 printf_filtered ("\t%#-16lx %s.\n",
3399 (unsigned long) sip -> si_addr,
3400 "Address of faulting instruction");
3402 else if ((sip -> si_signo == SIGSEGV) ||
3403 (sip -> si_signo == SIGBUS))
3405 printf_filtered ("\t%#-16lx %s.\n",
3406 (unsigned long) sip -> si_addr,
3407 "Address of faulting memory reference");
3409 else if ((sip -> si_signo == SIGCHLD))
3411 printf_filtered ("\t%-16u %s.\n", sip -> si_pid, /* XXX need target_pid_to_str() */
3412 "Child process ID");
3413 printf_filtered ("\t%-16u %s.\n", sip -> si_status,
3414 "Child process exit value or signal");
3416 else if ((sip -> si_signo == SIGPOLL))
3418 printf_filtered ("\t%-16u %s.\n", sip -> si_band,
3419 "Band event for POLL_{IN,OUT,MSG}");
3423 printf_filtered ("\n");
3428 info_proc_syscalls (pip, summary)
3429 struct procinfo *pip;
3437 #if 0 /* FIXME: Needs to use gdb-wide configured info about system calls. */
3438 if (pip -> prstatus.pr_flags & PR_ASLEEP)
3440 int syscallnum = pip -> prstatus.pr_reg[R_D0];
3443 printf_filtered ("%-32s", "Sleeping in system call:");
3444 printf_filtered ("%s", syscallname (syscallnum));
3448 printf_filtered ("Sleeping in system call '%s'.\n",
3449 syscallname (syscallnum));
3454 if (ioctl (pip -> fd, PIOCGENTRY, &pip -> entryset) < 0)
3456 print_sys_errmsg (pip -> pathname, errno);
3457 error ("PIOCGENTRY failed");
3460 if (ioctl (pip -> fd, PIOCGEXIT, &pip -> exitset) < 0)
3462 print_sys_errmsg (pip -> pathname, errno);
3463 error ("PIOCGEXIT failed");
3466 printf_filtered ("System call tracing information:\n\n");
3468 printf_filtered ("\t%-12s %-8s %-8s\n",
3472 for (syscallnum = 0; syscallnum < MAX_SYSCALLS; syscallnum++)
3475 if (syscall_table[syscallnum] != NULL)
3476 printf_filtered ("\t%-12s ", syscall_table[syscallnum]);
3478 printf_filtered ("\t%-12d ", syscallnum);
3480 printf_filtered ("%-8s ",
3481 prismember (&pip -> entryset, syscallnum)
3483 printf_filtered ("%-8s ",
3484 prismember (&pip -> exitset, syscallnum)
3486 printf_filtered ("\n");
3488 printf_filtered ("\n");
3497 static char locbuf[32];
3499 name = strsigno (signo);
3502 sprintf (locbuf, "Signal %d", signo);
3506 sprintf (locbuf, "%s (%d)", name, signo);
3516 static char locbuf[32];
3518 name = strerrno (errnum);
3521 sprintf (locbuf, "Errno %d", errnum);
3525 sprintf (locbuf, "%s (%d)", name, errnum);
3531 info_proc_signals (pip, summary)
3532 struct procinfo *pip;
3539 if (ioctl (pip -> fd, PIOCGTRACE, &pip -> trace) < 0)
3541 print_sys_errmsg (pip -> pathname, errno);
3542 error ("PIOCGTRACE failed");
3545 printf_filtered ("Disposition of signals:\n\n");
3546 printf_filtered ("\t%-15s %-8s %-8s %-8s %s\n\n",
3547 "Signal", "Trace", "Hold", "Pending", "Description");
3548 for (signo = 0; signo < NSIG; signo++)
3551 printf_filtered ("\t%-15s ", signalname (signo));
3552 printf_filtered ("%-8s ",
3553 prismember (&pip -> trace, signo)
3555 printf_filtered ("%-8s ",
3556 prismember (&pip -> prstatus.pr_sighold, signo)
3559 #ifdef PROCFS_SIGPEND_OFFSET
3560 /* Alpha OSF/1 numbers the pending signals from 1. */
3561 printf_filtered ("%-8s ",
3562 (signo ? prismember (&pip -> prstatus.pr_sigpend,
3567 printf_filtered ("%-8s ",
3568 prismember (&pip -> prstatus.pr_sigpend, signo)
3571 printf_filtered (" %s\n", safe_strsignal (signo));
3573 printf_filtered ("\n");
3578 info_proc_faults (pip, summary)
3579 struct procinfo *pip;
3582 struct trans *transp;
3586 if (ioctl (pip -> fd, PIOCGFAULT, &pip -> fltset) < 0)
3588 print_sys_errmsg (pip -> pathname, errno);
3589 error ("PIOCGFAULT failed");
3592 printf_filtered ("Current traced hardware fault set:\n\n");
3593 printf_filtered ("\t%-12s %-8s\n", "Fault", "Trace");
3595 for (transp = faults_table; transp -> name != NULL; transp++)
3598 printf_filtered ("\t%-12s ", transp -> name);
3599 printf_filtered ("%-8s", prismember (&pip -> fltset, transp -> value)
3601 printf_filtered ("\n");
3603 printf_filtered ("\n");
3608 info_proc_mappings (pip, summary)
3609 struct procinfo *pip;
3613 struct prmap *prmaps;
3614 struct prmap *prmap;
3618 printf_filtered ("Mapped address spaces:\n\n");
3619 #ifdef BFD_HOST_64_BIT
3620 printf_filtered (" %18s %18s %10s %10s %7s\n",
3622 printf_filtered ("\t%10s %10s %10s %10s %7s\n",
3629 if (ioctl (pip -> fd, PIOCNMAP, &nmap) == 0)
3631 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
3632 if (ioctl (pip -> fd, PIOCMAP, prmaps) == 0)
3634 for (prmap = prmaps; prmap -> pr_size; ++prmap)
3636 #ifdef BFD_HOST_64_BIT
3637 printf_filtered (" %#18lx %#18lx %#10x %#10x %7s\n",
3639 printf_filtered ("\t%#10lx %#10lx %#10x %#10x %7s\n",
3641 (unsigned long)prmap -> pr_vaddr,
3642 (unsigned long)prmap -> pr_vaddr
3643 + prmap -> pr_size - 1,
3646 mappingflags (prmap -> pr_mflags));
3650 printf_filtered ("\n");
3658 info_proc -- implement the "info proc" command
3662 void info_proc (char *args, int from_tty)
3666 Implement gdb's "info proc" command by using the /proc interface
3667 to print status information about any currently running process.
3669 Examples of the use of "info proc" are:
3671 info proc (prints summary info for current inferior)
3672 info proc 123 (prints summary info for process with pid 123)
3673 info proc mappings (prints address mappings)
3674 info proc times (prints process/children times)
3675 info proc id (prints pid, ppid, gid, sid, etc)
3676 FIXME: i proc id not implemented.
3677 info proc status (prints general process state info)
3678 FIXME: i proc status not implemented.
3679 info proc signals (prints info about signal handling)
3680 info proc all (prints all info)
3685 info_proc (args, from_tty)
3689 int pid = inferior_pid;
3690 struct procinfo *pip;
3691 struct cleanup *old_chain;
3707 old_chain = make_cleanup (null_cleanup, 0);
3709 /* Default to using the current inferior if no pid specified. Note
3710 that inferior_pid may be 0, hence we set okerr. */
3712 pip = find_procinfo (inferior_pid, 1);
3716 if ((argv = buildargv (args)) == NULL)
3720 make_cleanup (freeargv, (char *) argv);
3722 while (*argv != NULL)
3724 argsize = strlen (*argv);
3725 if (argsize >= 1 && strncmp (*argv, "all", argsize) == 0)
3730 else if (argsize >= 2 && strncmp (*argv, "faults", argsize) == 0)
3735 else if (argsize >= 2 && strncmp (*argv, "flags", argsize) == 0)
3740 else if (argsize >= 1 && strncmp (*argv, "id", argsize) == 0)
3745 else if (argsize >= 1 && strncmp (*argv, "mappings", argsize) == 0)
3750 else if (argsize >= 2 && strncmp (*argv, "signals", argsize) == 0)
3755 else if (argsize >= 2 && strncmp (*argv, "status", argsize) == 0)
3760 else if (argsize >= 2 && strncmp (*argv, "syscalls", argsize) == 0)
3765 else if (argsize >= 1 && strncmp (*argv, "times", argsize) == 0)
3770 else if ((pid = atoi (*argv)) > 0)
3772 pip = (struct procinfo *) xmalloc (sizeof (struct procinfo));
3773 memset (pip, 0, sizeof (*pip));
3776 if (!open_proc_file (pid, pip, O_RDONLY))
3778 perror_with_name (pip -> pathname);
3782 make_cleanup (close_proc_file, pip);
3784 else if (**argv != '\000')
3786 error ("Unrecognized or ambiguous keyword `%s'.", *argv);
3792 /* If we don't have a valid open process at this point, then we have no
3793 inferior or didn't specify a specific pid. */
3798 No process. Start debugging a program or specify an explicit process ID.");
3800 if (ioctl (pip -> fd, PIOCSTATUS, &(pip -> prstatus)) < 0)
3802 print_sys_errmsg (pip -> pathname, errno);
3803 error ("PIOCSTATUS failed");
3807 nlwp = pip->prstatus.pr_nlwp;
3808 lwps = alloca ((2 * nlwp + 2) * sizeof (id_t));
3810 if (ioctl (pip->fd, PIOCLWPIDS, lwps))
3812 print_sys_errmsg (pip -> pathname, errno);
3813 error ("PIOCSTATUS failed");
3815 #else /* PIOCLWPIDS */
3817 lwps = alloca ((2 * nlwp + 2) * sizeof *lwps);
3819 #endif /* PIOCLWPIDS */
3821 for (; nlwp > 0; nlwp--, lwps++)
3823 pip = find_procinfo ((*lwps << 16) | pid, 1);
3827 pip = (struct procinfo *) xmalloc (sizeof (struct procinfo));
3828 memset (pip, 0, sizeof (*pip));
3829 if (!open_proc_file ((*lwps << 16) | pid, pip, O_RDONLY))
3832 make_cleanup (close_proc_file, pip);
3834 if (ioctl (pip -> fd, PIOCSTATUS, &(pip -> prstatus)) < 0)
3836 print_sys_errmsg (pip -> pathname, errno);
3837 error ("PIOCSTATUS failed");
3841 /* Print verbose information of the requested type(s), or just a summary
3842 of the information for all types. */
3844 printf_filtered ("\nInformation for %s.%d:\n\n", pip -> pathname, *lwps);
3845 if (summary || all || flags)
3847 info_proc_flags (pip, summary);
3851 info_proc_stop (pip, summary);
3853 if (summary || all || signals || faults)
3855 info_proc_siginfo (pip, summary);
3857 if (summary || all || syscalls)
3859 info_proc_syscalls (pip, summary);
3861 if (summary || all || mappings)
3863 info_proc_mappings (pip, summary);
3865 if (summary || all || signals)
3867 info_proc_signals (pip, summary);
3869 if (summary || all || faults)
3871 info_proc_faults (pip, summary);
3873 printf_filtered ("\n");
3875 /* All done, deal with closing any temporary process info structure,
3876 freeing temporary memory , etc. */
3878 do_cleanups (old_chain);
3886 modify_inherit_on_fork_flag - Change the inherit-on-fork flag
3890 void modify_inherit_on_fork_flag (fd, flag)
3894 Call this routine to modify the inherit-on-fork flag. This routine is
3895 just a nice wrapper to hide the #ifdefs needed by various systems to
3901 modify_inherit_on_fork_flag (fd, flag)
3910 #ifdef PIOCSET /* New method */
3913 retval = ioctl (fd, PIOCSET, &pr_flags);
3915 retval = ioctl (fd, PIOCRESET, &pr_flags);
3918 #ifdef PIOCSFORK /* Original method */
3920 retval = ioctl (fd, PIOCSFORK, NULL);
3922 retval = ioctl (fd, PIOCRFORK, NULL);
3924 Neither PR_FORK nor PIOCSFORK exist!!!
3931 print_sys_errmsg ("modify_inherit_on_fork_flag", errno);
3932 error ("PIOCSFORK or PR_FORK modification failed");
3939 modify_run_on_last_close_flag - Change the run-on-last-close flag
3943 void modify_run_on_last_close_flag (fd, flag)
3947 Call this routine to modify the run-on-last-close flag. This routine
3948 is just a nice wrapper to hide the #ifdefs needed by various systems to
3954 modify_run_on_last_close_flag (fd, flag)
3963 #ifdef PIOCSET /* New method */
3966 retval = ioctl (fd, PIOCSET, &pr_flags);
3968 retval = ioctl (fd, PIOCRESET, &pr_flags);
3971 #ifdef PIOCSRLC /* Original method */
3973 retval = ioctl (fd, PIOCSRLC, NULL);
3975 retval = ioctl (fd, PIOCRRLC, NULL);
3977 Neither PR_RLC nor PIOCSRLC exist!!!
3984 print_sys_errmsg ("modify_run_on_last_close_flag", errno);
3985 error ("PIOCSRLC or PR_RLC modification failed");
3992 procfs_clear_syscall_trap -- Deletes the trap for the specified system call.
3996 void procfs_clear_syscall_trap (struct procinfo *, int syscall_num, int errok)
4000 This function function disables traps for the specified system call.
4001 errok is non-zero if errors should be ignored.
4005 procfs_clear_syscall_trap (pi, syscall_num, errok)
4006 struct procinfo *pi;
4013 goterr = ioctl (pi->fd, PIOCGENTRY, &sysset) < 0;
4015 if (goterr && !errok)
4017 print_sys_errmsg (pi->pathname, errno);
4018 error ("PIOCGENTRY failed");
4023 prdelset (&sysset, syscall_num);
4025 if ((ioctl (pi->fd, PIOCSENTRY, &sysset) < 0) && !errok)
4027 print_sys_errmsg (pi->pathname, errno);
4028 error ("PIOCSENTRY failed");
4032 goterr = ioctl (pi->fd, PIOCGEXIT, &sysset) < 0;
4034 if (goterr && !errok)
4036 procfs_clear_syscall_trap (pi, syscall_num, 1);
4037 print_sys_errmsg (pi->pathname, errno);
4038 error ("PIOCGEXIT failed");
4043 praddset (&sysset, syscall_num);
4045 if ((ioctl (pi->fd, PIOCSEXIT, &sysset) < 0) && !errok)
4047 procfs_clear_syscall_trap (pi, syscall_num, 1);
4048 print_sys_errmsg (pi->pathname, errno);
4049 error ("PIOCSEXIT failed");
4053 if (!pi->syscall_handlers)
4056 error ("procfs_clear_syscall_trap: syscall_handlers is empty");
4060 /* Remove handler func from the handler list */
4062 for (i = 0; i < pi->num_syscall_handlers; i++)
4063 if (pi->syscall_handlers[i].syscall_num == syscall_num)
4065 if (i + 1 != pi->num_syscall_handlers)
4066 { /* Not the last entry.
4067 Move subsequent entries fwd. */
4068 memcpy (&pi->syscall_handlers[i], &pi->syscall_handlers[i + 1],
4069 (pi->num_syscall_handlers - i - 1)
4070 * sizeof (struct procfs_syscall_handler));
4073 pi->syscall_handlers = xrealloc (pi->syscall_handlers,
4074 (pi->num_syscall_handlers - 1)
4075 * sizeof (struct procfs_syscall_handler));
4076 pi->num_syscall_handlers--;
4081 error ("procfs_clear_syscall_trap: Couldn't find handler for sys call %d",
4089 procfs_set_syscall_trap -- arrange for a function to be called when the
4090 child executes the specified system call.
4094 void procfs_set_syscall_trap (struct procinfo *, int syscall_num, int flags,
4095 syscall_func_t *function)
4099 This function sets up an entry and/or exit trap for the specified system
4100 call. When the child executes the specified system call, your function
4101 will be called with the call #, a flag that indicates entry or exit, and
4102 pointers to rtnval and statval (which are used by procfs_wait). The
4103 function should return non-zero if something interesting happened, zero
4108 procfs_set_syscall_trap (pi, syscall_num, flags, func)
4109 struct procinfo *pi;
4112 syscall_func_t *func;
4116 if (flags & PROCFS_SYSCALL_ENTRY)
4118 if (ioctl (pi->fd, PIOCGENTRY, &sysset) < 0)
4120 print_sys_errmsg (pi->pathname, errno);
4121 error ("PIOCGENTRY failed");
4124 praddset (&sysset, syscall_num);
4126 if (ioctl (pi->fd, PIOCSENTRY, &sysset) < 0)
4128 print_sys_errmsg (pi->pathname, errno);
4129 error ("PIOCSENTRY failed");
4133 if (flags & PROCFS_SYSCALL_EXIT)
4135 if (ioctl (pi->fd, PIOCGEXIT, &sysset) < 0)
4137 procfs_clear_syscall_trap (pi, syscall_num, 1);
4138 print_sys_errmsg (pi->pathname, errno);
4139 error ("PIOCGEXIT failed");
4142 praddset (&sysset, syscall_num);
4144 if (ioctl (pi->fd, PIOCSEXIT, &sysset) < 0)
4146 procfs_clear_syscall_trap (pi, syscall_num, 1);
4147 print_sys_errmsg (pi->pathname, errno);
4148 error ("PIOCSEXIT failed");
4152 if (!pi->syscall_handlers)
4154 pi->syscall_handlers = xmalloc (sizeof (struct procfs_syscall_handler));
4155 pi->syscall_handlers[0].syscall_num = syscall_num;
4156 pi->syscall_handlers[0].func = func;
4157 pi->num_syscall_handlers = 1;
4163 for (i = 0; i < pi->num_syscall_handlers; i++)
4164 if (pi->syscall_handlers[i].syscall_num == syscall_num)
4166 pi->syscall_handlers[i].func = func;
4170 pi->syscall_handlers = xrealloc (pi->syscall_handlers, (i + 1)
4171 * sizeof (struct procfs_syscall_handler));
4172 pi->syscall_handlers[i].syscall_num = syscall_num;
4173 pi->syscall_handlers[i].func = func;
4174 pi->num_syscall_handlers++;
4178 #ifdef SYS_lwp_create
4184 procfs_lwp_creation_handler - handle exit from the _lwp_create syscall
4188 int procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
4192 This routine is called both when an inferior process and it's new lwp
4193 are about to finish a _lwp_create() system call. This is the system
4194 call that Solaris uses to create a lightweight process. When the
4195 target process gets this event, we can look at sysarg[2] to find the
4196 new childs lwp ID, and create a procinfo struct from that. After that,
4197 we pretend that we got a SIGTRAP, and return non-zero to tell
4198 procfs_wait to wake up. Subsequently, wait_for_inferior gets woken up,
4199 sees the new process and continues it.
4201 When we see the child exiting from lwp_create, we just contine it,
4202 since everything was handled when the parent trapped.
4205 In effect, we are only paying attention to the parent's completion of
4206 the lwp_create syscall. If we only paid attention to the child
4207 instead, then we wouldn't detect the creation of a suspended thread.
4211 procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
4212 struct procinfo *pi;
4219 struct procinfo *childpi;
4221 /* We've just detected the completion of an lwp_create system call. Now we
4222 need to setup a procinfo struct for this thread, and notify the thread
4223 system of the new arrival. */
4225 /* If lwp_create failed, then nothing interesting happened. Continue the
4226 process and go back to sleep. */
4228 if (pi->prstatus.pr_reg[R_PSR] & PS_FLAG_CARRY)
4229 { /* _lwp_create failed */
4230 pi->prrun.pr_flags &= PRSTEP;
4231 pi->prrun.pr_flags |= PRCFAULT;
4233 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
4234 perror_with_name (pi->pathname);
4239 /* At this point, the new thread is stopped at it's first instruction, and
4240 the parent is stopped at the exit from lwp_create. */
4242 if (pi->new_child) /* Child? */
4243 { /* Yes, just continue it */
4244 pi->prrun.pr_flags &= PRSTEP;
4245 pi->prrun.pr_flags |= PRCFAULT;
4247 if ((pi->prstatus.pr_flags & PR_ISTOP)
4248 && ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
4249 perror_with_name (pi->pathname);
4251 pi->new_child = 0; /* No longer new */
4256 /* We're the proud parent of a new thread. Setup an exit trap for lwp_create
4257 in the child and continue the parent. */
4259 /* Third arg is pointer to new thread id. */
4260 lwp_id = read_memory_integer (pi->prstatus.pr_sysarg[2], sizeof (int));
4262 lwp_id = (lwp_id << 16) | PIDGET (pi->pid);
4264 childpi = create_procinfo (lwp_id);
4266 /* The new process has actually inherited the lwp_create syscall trap from
4267 it's parent, but we still have to call this to register a handler for
4270 procfs_set_syscall_trap (childpi, SYS_lwp_create, PROCFS_SYSCALL_EXIT,
4271 procfs_lwp_creation_handler);
4273 childpi->new_child = 1; /* Flag this as an unseen child process */
4275 *rtnvalp = lwp_id; /* the new arrival. */
4276 *statvalp = (SIGTRAP << 8) | 0177;
4280 #endif /* SYS_lwp_create */
4282 /* Fork an inferior process, and start debugging it with /proc. */
4285 procfs_create_inferior (exec_file, allargs, env)
4290 char *shell_file = getenv ("SHELL");
4292 if (shell_file != NULL && strchr (shell_file, '/') == NULL)
4295 /* We will be looking down the PATH to find shell_file. If we
4296 just do this the normal way (via execlp, which operates by
4297 attempting an exec for each element of the PATH until it
4298 finds one which succeeds), then there will be an exec for
4299 each failed attempt, each of which will cause a PR_SYSEXIT
4300 stop, and we won't know how to distinguish the PR_SYSEXIT's
4301 for these failed execs with the ones for successful execs
4302 (whether the exec has succeeded is stored at that time in the
4303 carry bit or some such architecture-specific and
4304 non-ABI-specified place).
4306 So I can't think of anything better than to search the PATH
4307 now. This has several disadvantages: (1) There is a race
4308 condition; if we find a file now and it is deleted before we
4309 exec it, we lose, even if the deletion leaves a valid file
4310 further down in the PATH, (2) there is no way to know exactly
4311 what an executable (in the sense of "capable of being
4312 exec'd") file is. Using access() loses because it may lose
4313 if the caller is the superuser; failing to use it loses if
4314 there are ACLs or some such. */
4318 /* FIXME-maybe: might want "set path" command so user can change what
4319 path is used from within GDB. */
4320 char *path = getenv ("PATH");
4322 struct stat statbuf;
4325 path = "/bin:/usr/bin";
4327 tryname = alloca (strlen (path) + strlen (shell_file) + 2);
4328 for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
4330 p1 = strchr (p, ':');
4335 strncpy (tryname, p, len);
4336 tryname[len] = '\0';
4337 strcat (tryname, "/");
4338 strcat (tryname, shell_file);
4339 if (access (tryname, X_OK) < 0)
4341 if (stat (tryname, &statbuf) < 0)
4343 if (!S_ISREG (statbuf.st_mode))
4344 /* We certainly need to reject directories. I'm not quite
4345 as sure about FIFOs, sockets, etc., but I kind of doubt
4346 that people want to exec() these things. */
4351 /* Not found. This must be an error rather than merely passing
4352 the file to execlp(), because execlp() would try all the
4353 exec()s, causing GDB to get confused. */
4354 error ("Can't find shell %s in PATH", shell_file);
4356 shell_file = tryname;
4359 fork_inferior (exec_file, allargs, env,
4360 proc_set_exec_trap, procfs_init_inferior, shell_file);
4362 /* We are at the first instruction we care about. */
4363 /* Pedal to the metal... */
4365 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
4368 /* Clean up after the inferior dies. */
4371 procfs_mourn_inferior ()
4373 struct procinfo *pi;
4374 struct procinfo *next_pi;
4376 for (pi = procinfo_list; pi; pi = next_pi)
4379 unconditionally_kill_inferior (pi);
4382 unpush_target (&procfs_ops);
4383 generic_mourn_inferior ();
4387 /* Mark our target-struct as eligible for stray "run" and "attach" commands. */
4391 /* This variable is controlled by modules that sit atop procfs that may layer
4392 their own process structure atop that provided here. sol-thread.c does
4393 this because of the Solaris two-level thread model. */
4395 return !procfs_suppress_run;
4397 #ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
4399 /* Insert a watchpoint */
4401 procfs_set_watchpoint(pid, addr, len, rw)
4407 struct procinfo *pi;
4410 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
4411 wpt.pr_vaddr = (caddr_t)addr;
4413 wpt.pr_wflags = ((rw & 1) ? MA_READ : 0) | ((rw & 2) ? MA_WRITE : 0);
4414 if (ioctl (pi->fd, PIOCSWATCH, &wpt) < 0)
4418 /* Currently it sometimes happens that the same watchpoint gets
4419 deleted twice - don't die in this case (FIXME please) */
4420 if (errno == ESRCH && len == 0)
4422 print_sys_errmsg (pi->pathname, errno);
4423 error ("PIOCSWATCH failed");
4429 procfs_stopped_by_watchpoint(pid)
4432 struct procinfo *pi;
4436 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
4437 if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
4439 why = pi->prstatus.pr_why;
4440 what = pi->prstatus.pr_what;
4441 if (why == PR_FAULTED
4442 #if defined (FLTWATCH) && defined (FLTKWATCH)
4443 && (what == FLTWATCH || what == FLTKWATCH)
4446 && (what == FLTWATCH)
4449 && (what == FLTKWATCH)
4459 /* Why is this necessary? Shouldn't dead threads just be removed from the
4463 procfs_thread_alive (pid)
4469 /* Send a SIGINT to the process group. This acts just like the user typed a
4470 ^C on the controlling terminal.
4472 XXX - This may not be correct for all systems. Some may want to use
4473 killpg() instead of kill (-pgrp). */
4478 extern pid_t inferior_process_group;
4480 kill (-inferior_process_group, SIGINT);
4483 /* Convert a pid to printable form. */
4487 procfs_pid_to_str (pid)
4490 static char buf[100];
4492 sprintf (buf, "Kernel thread %d", TIDGET (pid));
4498 struct target_ops procfs_ops = {
4499 "procfs", /* to_shortname */
4500 "Unix /proc child process", /* to_longname */
4501 "Unix /proc child process (started by the \"run\" command).", /* to_doc */
4502 procfs_open, /* to_open */
4504 procfs_attach, /* to_attach */
4505 procfs_detach, /* to_detach */
4506 procfs_resume, /* to_resume */
4507 procfs_wait, /* to_wait */
4508 procfs_fetch_registers, /* to_fetch_registers */
4509 procfs_store_registers, /* to_store_registers */
4510 procfs_prepare_to_store, /* to_prepare_to_store */
4511 procfs_xfer_memory, /* to_xfer_memory */
4512 procfs_files_info, /* to_files_info */
4513 memory_insert_breakpoint, /* to_insert_breakpoint */
4514 memory_remove_breakpoint, /* to_remove_breakpoint */
4515 terminal_init_inferior, /* to_terminal_init */
4516 terminal_inferior, /* to_terminal_inferior */
4517 terminal_ours_for_output, /* to_terminal_ours_for_output */
4518 terminal_ours, /* to_terminal_ours */
4519 child_terminal_info, /* to_terminal_info */
4520 procfs_kill_inferior, /* to_kill */
4522 0, /* to_lookup_symbol */
4523 procfs_create_inferior, /* to_create_inferior */
4524 procfs_mourn_inferior, /* to_mourn_inferior */
4525 procfs_can_run, /* to_can_run */
4526 procfs_notice_signals, /* to_notice_signals */
4527 procfs_thread_alive, /* to_thread_alive */
4528 procfs_stop, /* to_stop */
4529 process_stratum, /* to_stratum */
4531 1, /* to_has_all_memory */
4532 1, /* to_has_memory */
4533 1, /* to_has_stack */
4534 1, /* to_has_registers */
4535 1, /* to_has_execution */
4537 0, /* sections_end */
4538 OPS_MAGIC /* to_magic */
4542 _initialize_procfs ()
4544 #ifdef HAVE_OPTIONAL_PROC_FS
4548 /* If we have an optional /proc filesystem (e.g. under OSF/1),
4549 don't add procfs support if we cannot access the running
4551 sprintf (procname, PROC_NAME_FMT, getpid ());
4552 if ((fd = open (procname, O_RDONLY)) < 0)
4557 add_target (&procfs_ops);
4559 add_info ("proc", info_proc,
4560 "Show process status information using /proc entry.\n\
4561 Specify process id or use current inferior by default.\n\
4562 Specify keywords for detailed information; default is summary.\n\
4563 Keywords are: `all', `faults', `flags', `id', `mappings', `signals',\n\
4564 `status', `syscalls', and `times'.\n\
4565 Unambiguous abbreviations may be used.");
4567 init_syscall_table ();