1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
2 Copyright 1991, 1992, 1993, 1994 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., 675 Mass Ave, Cambridge, MA 02139, 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/procfs.h>
53 #define MAX_SYSCALLS 256 /* Maximum number of syscalls for table */
56 #define PROC_NAME_FMT "/proc/%05d"
59 extern struct target_ops procfs_ops; /* Forward declaration */
61 #if 1 /* FIXME: Gross and ugly hack to resolve coredep.c global */
62 CORE_ADDR kernel_u_addr;
65 #ifdef BROKEN_SIGINFO_H /* Workaround broken SGS <sys/siginfo.h> */
67 #define si_pid _data._proc.pid
69 #define si_uid _data._proc._pdata._kill.uid
70 #endif /* BROKEN_SIGINFO_H */
72 /* All access to the inferior, either one started by gdb or one that has
73 been attached to, is controlled by an instance of a procinfo structure,
74 defined below. Since gdb currently only handles one inferior at a time,
75 the procinfo structure for the inferior is statically allocated and
76 only one exists at any given time. There is a separate procinfo
77 structure for use by the "info proc" command, so that we can print
78 useful information about any random process without interfering with
79 the inferior's procinfo information. */
82 struct procinfo *next;
83 int pid; /* Process ID of inferior */
84 int fd; /* File descriptor for /proc entry */
85 char *pathname; /* Pathname to /proc entry */
86 int had_event; /* poll/select says something happened */
87 int was_stopped; /* Nonzero if was stopped prior to attach */
88 int nopass_next_sigstop; /* Don't pass a sigstop on next resume */
89 prrun_t prrun; /* Control state when it is run */
90 prstatus_t prstatus; /* Current process status info */
91 gregset_t gregset; /* General register set */
92 fpregset_t fpregset; /* Floating point register set */
93 fltset_t fltset; /* Current traced hardware fault set */
94 sigset_t trace; /* Current traced signal set */
95 sysset_t exitset; /* Current traced system call exit set */
96 sysset_t entryset; /* Current traced system call entry set */
97 fltset_t saved_fltset; /* Saved traced hardware fault set */
98 sigset_t saved_trace; /* Saved traced signal set */
99 sigset_t saved_sighold; /* Saved held signal set */
100 sysset_t saved_exitset; /* Saved traced system call exit set */
101 sysset_t saved_entryset; /* Saved traced system call entry set */
104 /* List of inferior process information */
105 static struct procinfo *procinfo_list = NULL;
107 static struct pollfd *poll_list; /* pollfds used for waiting on /proc */
109 static int num_poll_list = 0; /* Number of entries in poll_list */
111 static int last_resume_pid = -1; /* Last pid used with procfs_resume */
113 /* Much of the information used in the /proc interface, particularly for
114 printing status information, is kept as tables of structures of the
115 following form. These tables can be used to map numeric values to
116 their symbolic names and to a string that describes their specific use. */
119 int value; /* The numeric value */
120 char *name; /* The equivalent symbolic value */
121 char *desc; /* Short description of value */
124 /* Translate bits in the pr_flags member of the prstatus structure, into the
125 names and desc information. */
127 static struct trans pr_flag_table[] =
129 #if defined (PR_STOPPED)
130 PR_STOPPED, "PR_STOPPED", "Process is stopped",
132 #if defined (PR_ISTOP)
133 PR_ISTOP, "PR_ISTOP", "Stopped on an event of interest",
135 #if defined (PR_DSTOP)
136 PR_DSTOP, "PR_DSTOP", "A stop directive is in effect",
138 #if defined (PR_ASLEEP)
139 PR_ASLEEP, "PR_ASLEEP", "Sleeping in an interruptible system call",
141 #if defined (PR_FORK)
142 PR_FORK, "PR_FORK", "Inherit-on-fork is in effect",
145 PR_RLC, "PR_RLC", "Run-on-last-close is in effect",
147 #if defined (PR_PTRACE)
148 PR_PTRACE, "PR_PTRACE", "Process is being controlled by ptrace",
150 #if defined (PR_PCINVAL)
151 PR_PCINVAL, "PR_PCINVAL", "PC refers to an invalid virtual address",
153 #if defined (PR_ISSYS)
154 PR_ISSYS, "PR_ISSYS", "Is a system process",
156 #if defined (PR_STEP)
157 PR_STEP, "PR_STEP", "Process has single step pending",
160 PR_KLC, "PR_KLC", "Kill-on-last-close is in effect",
162 #if defined (PR_ASYNC)
163 PR_ASYNC, "PR_ASYNC", "Asynchronous stop is in effect",
165 #if defined (PR_PCOMPAT)
166 PR_PCOMPAT, "PR_PCOMPAT", "Ptrace compatibility mode in effect",
171 /* Translate values in the pr_why field of the prstatus struct. */
173 static struct trans pr_why_table[] =
175 #if defined (PR_REQUESTED)
176 PR_REQUESTED, "PR_REQUESTED", "Directed to stop via PIOCSTOP/PIOCWSTOP",
178 #if defined (PR_SIGNALLED)
179 PR_SIGNALLED, "PR_SIGNALLED", "Receipt of a traced signal",
181 #if defined (PR_FAULTED)
182 PR_FAULTED, "PR_FAULTED", "Incurred a traced hardware fault",
184 #if defined (PR_SYSENTRY)
185 PR_SYSENTRY, "PR_SYSENTRY", "Entry to a traced system call",
187 #if defined (PR_SYSEXIT)
188 PR_SYSEXIT, "PR_SYSEXIT", "Exit from a traced system call",
190 #if defined (PR_JOBCONTROL)
191 PR_JOBCONTROL, "PR_JOBCONTROL", "Default job control stop signal action",
193 #if defined (PR_SUSPENDED)
194 PR_SUSPENDED, "PR_SUSPENDED", "Process suspended",
199 /* Hardware fault translation table. */
201 static struct trans faults_table[] =
204 FLTILL, "FLTILL", "Illegal instruction",
206 #if defined (FLTPRIV)
207 FLTPRIV, "FLTPRIV", "Privileged instruction",
210 FLTBPT, "FLTBPT", "Breakpoint trap",
212 #if defined (FLTTRACE)
213 FLTTRACE, "FLTTRACE", "Trace trap",
215 #if defined (FLTACCESS)
216 FLTACCESS, "FLTACCESS", "Memory access fault",
218 #if defined (FLTBOUNDS)
219 FLTBOUNDS, "FLTBOUNDS", "Memory bounds violation",
221 #if defined (FLTIOVF)
222 FLTIOVF, "FLTIOVF", "Integer overflow",
224 #if defined (FLTIZDIV)
225 FLTIZDIV, "FLTIZDIV", "Integer zero divide",
228 FLTFPE, "FLTFPE", "Floating-point exception",
230 #if defined (FLTSTACK)
231 FLTSTACK, "FLTSTACK", "Unrecoverable stack fault",
233 #if defined (FLTPAGE)
234 FLTPAGE, "FLTPAGE", "Recoverable page fault",
239 /* Translation table for signal generation information. See UNIX System
240 V Release 4 Programmer's Reference Manual, siginfo(5). */
242 static struct sigcode {
247 } siginfo_table[] = {
248 #if defined (SIGILL) && defined (ILL_ILLOPC)
249 SIGILL, ILL_ILLOPC, "ILL_ILLOPC", "Illegal opcode",
251 #if defined (SIGILL) && defined (ILL_ILLOPN)
252 SIGILL, ILL_ILLOPN, "ILL_ILLOPN", "Illegal operand",
254 #if defined (SIGILL) && defined (ILL_ILLADR)
255 SIGILL, ILL_ILLADR, "ILL_ILLADR", "Illegal addressing mode",
257 #if defined (SIGILL) && defined (ILL_ILLTRP)
258 SIGILL, ILL_ILLTRP, "ILL_ILLTRP", "Illegal trap",
260 #if defined (SIGILL) && defined (ILL_PRVOPC)
261 SIGILL, ILL_PRVOPC, "ILL_PRVOPC", "Privileged opcode",
263 #if defined (SIGILL) && defined (ILL_PRVREG)
264 SIGILL, ILL_PRVREG, "ILL_PRVREG", "Privileged register",
266 #if defined (SIGILL) && defined (ILL_COPROC)
267 SIGILL, ILL_COPROC, "ILL_COPROC", "Coprocessor error",
269 #if defined (SIGILL) && defined (ILL_BADSTK)
270 SIGILL, ILL_BADSTK, "ILL_BADSTK", "Internal stack error",
272 #if defined (SIGFPE) && defined (FPE_INTDIV)
273 SIGFPE, FPE_INTDIV, "FPE_INTDIV", "Integer divide by zero",
275 #if defined (SIGFPE) && defined (FPE_INTOVF)
276 SIGFPE, FPE_INTOVF, "FPE_INTOVF", "Integer overflow",
278 #if defined (SIGFPE) && defined (FPE_FLTDIV)
279 SIGFPE, FPE_FLTDIV, "FPE_FLTDIV", "Floating point divide by zero",
281 #if defined (SIGFPE) && defined (FPE_FLTOVF)
282 SIGFPE, FPE_FLTOVF, "FPE_FLTOVF", "Floating point overflow",
284 #if defined (SIGFPE) && defined (FPE_FLTUND)
285 SIGFPE, FPE_FLTUND, "FPE_FLTUND", "Floating point underflow",
287 #if defined (SIGFPE) && defined (FPE_FLTRES)
288 SIGFPE, FPE_FLTRES, "FPE_FLTRES", "Floating point inexact result",
290 #if defined (SIGFPE) && defined (FPE_FLTINV)
291 SIGFPE, FPE_FLTINV, "FPE_FLTINV", "Invalid floating point operation",
293 #if defined (SIGFPE) && defined (FPE_FLTSUB)
294 SIGFPE, FPE_FLTSUB, "FPE_FLTSUB", "Subscript out of range",
296 #if defined (SIGSEGV) && defined (SEGV_MAPERR)
297 SIGSEGV, SEGV_MAPERR, "SEGV_MAPERR", "Address not mapped to object",
299 #if defined (SIGSEGV) && defined (SEGV_ACCERR)
300 SIGSEGV, SEGV_ACCERR, "SEGV_ACCERR", "Invalid permissions for object",
302 #if defined (SIGBUS) && defined (BUS_ADRALN)
303 SIGBUS, BUS_ADRALN, "BUS_ADRALN", "Invalid address alignment",
305 #if defined (SIGBUS) && defined (BUS_ADRERR)
306 SIGBUS, BUS_ADRERR, "BUS_ADRERR", "Non-existent physical address",
308 #if defined (SIGBUS) && defined (BUS_OBJERR)
309 SIGBUS, BUS_OBJERR, "BUS_OBJERR", "Object specific hardware error",
311 #if defined (SIGTRAP) && defined (TRAP_BRKPT)
312 SIGTRAP, TRAP_BRKPT, "TRAP_BRKPT", "Process breakpoint",
314 #if defined (SIGTRAP) && defined (TRAP_TRACE)
315 SIGTRAP, TRAP_TRACE, "TRAP_TRACE", "Process trace trap",
317 #if defined (SIGCLD) && defined (CLD_EXITED)
318 SIGCLD, CLD_EXITED, "CLD_EXITED", "Child has exited",
320 #if defined (SIGCLD) && defined (CLD_KILLED)
321 SIGCLD, CLD_KILLED, "CLD_KILLED", "Child was killed",
323 #if defined (SIGCLD) && defined (CLD_DUMPED)
324 SIGCLD, CLD_DUMPED, "CLD_DUMPED", "Child has terminated abnormally",
326 #if defined (SIGCLD) && defined (CLD_TRAPPED)
327 SIGCLD, CLD_TRAPPED, "CLD_TRAPPED", "Traced child has trapped",
329 #if defined (SIGCLD) && defined (CLD_STOPPED)
330 SIGCLD, CLD_STOPPED, "CLD_STOPPED", "Child has stopped",
332 #if defined (SIGCLD) && defined (CLD_CONTINUED)
333 SIGCLD, CLD_CONTINUED, "CLD_CONTINUED", "Stopped child had continued",
335 #if defined (SIGPOLL) && defined (POLL_IN)
336 SIGPOLL, POLL_IN, "POLL_IN", "Input input available",
338 #if defined (SIGPOLL) && defined (POLL_OUT)
339 SIGPOLL, POLL_OUT, "POLL_OUT", "Output buffers available",
341 #if defined (SIGPOLL) && defined (POLL_MSG)
342 SIGPOLL, POLL_MSG, "POLL_MSG", "Input message available",
344 #if defined (SIGPOLL) && defined (POLL_ERR)
345 SIGPOLL, POLL_ERR, "POLL_ERR", "I/O error",
347 #if defined (SIGPOLL) && defined (POLL_PRI)
348 SIGPOLL, POLL_PRI, "POLL_PRI", "High priority input available",
350 #if defined (SIGPOLL) && defined (POLL_HUP)
351 SIGPOLL, POLL_HUP, "POLL_HUP", "Device disconnected",
356 static char *syscall_table[MAX_SYSCALLS];
358 /* Prototypes for local functions */
361 set_proc_siginfo PARAMS ((struct procinfo *, int));
364 init_syscall_table PARAMS ((void));
367 syscallname PARAMS ((int));
370 signalname PARAMS ((int));
373 errnoname PARAMS ((int));
376 proc_address_to_fd PARAMS ((struct procinfo *, CORE_ADDR, int));
379 open_proc_file PARAMS ((int, struct procinfo *, int));
382 close_proc_file PARAMS ((struct procinfo *));
385 unconditionally_kill_inferior PARAMS ((struct procinfo *));
388 proc_init_failed PARAMS ((struct procinfo *, char *)) ATTR_NORETURN;
391 info_proc PARAMS ((char *, int));
394 info_proc_flags PARAMS ((struct procinfo *, int));
397 info_proc_stop PARAMS ((struct procinfo *, int));
400 info_proc_siginfo PARAMS ((struct procinfo *, int));
403 info_proc_syscalls PARAMS ((struct procinfo *, int));
406 info_proc_mappings PARAMS ((struct procinfo *, int));
409 info_proc_signals PARAMS ((struct procinfo *, int));
412 info_proc_faults PARAMS ((struct procinfo *, int));
415 mappingflags PARAMS ((long));
418 lookupname PARAMS ((struct trans *, unsigned int, char *));
421 lookupdesc PARAMS ((struct trans *, unsigned int));
424 do_attach PARAMS ((int pid));
427 do_detach PARAMS ((int siggnal));
430 procfs_create_inferior PARAMS ((char *, char *, char **));
433 procfs_notice_signals PARAMS ((int pid));
435 static struct procinfo *
436 find_procinfo PARAMS ((pid_t pid, int okfail));
438 /* External function prototypes that can't be easily included in any
439 header file because the args are typedefs in system include files. */
442 supply_gregset PARAMS ((gregset_t *));
445 fill_gregset PARAMS ((gregset_t *, int));
448 supply_fpregset PARAMS ((fpregset_t *));
451 fill_fpregset PARAMS ((fpregset_t *, int));
457 find_procinfo -- convert a process id to a struct procinfo
461 static struct procinfo * find_procinfo (pid_t pid, int okfail);
465 Given a process id, look it up in the procinfo chain. Returns
466 a struct procinfo *. If can't find pid, then call error(),
467 unless okfail is set, in which case, return NULL;
470 static struct procinfo *
471 find_procinfo (pid, okfail)
475 struct procinfo *procinfo;
477 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
478 if (procinfo->pid == pid)
484 error ("procfs (find_procinfo): Couldn't locate pid %d", pid);
491 current_procinfo -- convert inferior_pid to a struct procinfo
495 static struct procinfo * current_procinfo;
499 Looks up inferior_pid in the procinfo chain. Always returns a
500 struct procinfo *. If process can't be found, we error() out.
503 #define current_procinfo find_procinfo (inferior_pid, 0)
509 add_fd -- Add the fd to the poll/select list
513 static void add_fd (struct procinfo *);
517 Add the fd of the supplied procinfo to the list of fds used for
518 poll/select operations.
525 if (num_poll_list <= 0)
526 poll_list = (struct pollfd *) xmalloc (sizeof (struct pollfd));
528 poll_list = (struct pollfd *) xrealloc (poll_list,
530 * sizeof (struct pollfd));
531 poll_list[num_poll_list].fd = pi->fd;
532 poll_list[num_poll_list].events = POLLPRI;
543 for (i = 0; i < num_poll_list; i++)
545 if (poll_list[i].fd == pi->fd)
547 if (i != num_poll_list - 1)
548 memcpy (poll_list, poll_list + i + 1,
549 (num_poll_list - i - 1) * sizeof (struct pollfd));
553 if (num_poll_list == 0)
556 poll_list = (struct pollfd *) xrealloc (poll_list,
558 * sizeof (struct pollfd));
564 #define LOSING_POLL unixware_sux
566 static struct procinfo *
574 set_sigint_trap (); /* Causes SIGINT to be passed on to the
579 num_fds = poll (poll_list, num_poll_list, -1);
581 pi = current_procinfo;
583 while (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
587 /* Process exited. */
588 pi->prstatus.pr_flags = 0;
591 else if (errno != EINTR)
593 print_sys_errmsg (pi->pathname, errno);
594 error ("PIOCWSTOP failed");
608 print_sys_errmsg ("poll failed\n", errno);
609 error ("Poll failed, returned %d", num_fds);
612 for (i = 0; i < num_poll_list && num_fds > 0; i++)
614 if ((poll_list[i].revents & (POLLPRI|POLLERR|POLLHUP|POLLNVAL)) == 0)
616 for (pi = procinfo_list; pi; pi = pi->next)
618 if (poll_list[i].fd == pi->fd)
620 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
622 print_sys_errmsg (pi->pathname, errno);
623 error ("PIOCSTATUS failed");
631 error ("procfs_wait: Couldn't find procinfo for fd %d\n",
634 #endif /* LOSING_POLL */
643 lookupdesc -- translate a value to a summary desc string
647 static char *lookupdesc (struct trans *transp, unsigned int val);
651 Given a pointer to a translation table and a value to be translated,
652 lookup the desc string and return it.
656 lookupdesc (transp, val)
657 struct trans *transp;
662 for (desc = NULL; transp -> name != NULL; transp++)
664 if (transp -> value == val)
666 desc = transp -> desc;
671 /* Didn't find a translation for the specified value, set a default one. */
684 lookupname -- translate a value to symbolic name
688 static char *lookupname (struct trans *transp, unsigned int val,
693 Given a pointer to a translation table, a value to be translated,
694 and a default prefix to return if the value can't be translated,
695 match the value with one of the translation table entries and
696 return a pointer to the symbolic name.
698 If no match is found it just returns the value as a printable string,
699 with the given prefix. The previous such value, if any, is freed
704 lookupname (transp, val, prefix)
705 struct trans *transp;
712 for (name = NULL; transp -> name != NULL; transp++)
714 if (transp -> value == val)
716 name = transp -> name;
721 /* Didn't find a translation for the specified value, build a default
722 one using the specified prefix and return it. The lifetime of
723 the value is only until the next one is needed. */
731 locbuf = xmalloc (strlen (prefix) + 16);
732 sprintf (locbuf, "%s %u", prefix, val);
744 static char locbuf[32];
746 for (scp = siginfo_table; scp -> codename != NULL; scp++)
748 if ((scp -> signo == sip -> si_signo) &&
749 (scp -> code == sip -> si_code))
751 name = scp -> codename;
757 sprintf (locbuf, "sigcode %u", sip -> si_signo);
770 for (scp = siginfo_table; scp -> codename != NULL; scp++)
772 if ((scp -> signo == sip -> si_signo) &&
773 (scp -> code == sip -> si_code))
781 desc = "Unrecognized signal or trap use";
790 syscallname - translate a system call number into a system call name
794 char *syscallname (int syscallnum)
798 Given a system call number, translate it into the printable name
799 of a system call, or into "syscall <num>" if it is an unknown
804 syscallname (syscallnum)
807 static char locbuf[32];
810 if (syscallnum >= 0 && syscallnum < MAX_SYSCALLS)
812 rtnval = syscall_table[syscallnum];
816 sprintf (locbuf, "syscall %u", syscallnum);
826 init_syscall_table - initialize syscall translation table
830 void init_syscall_table (void)
834 Dynamically initialize the translation table to convert system
835 call numbers into printable system call names. Done once per
836 gdb run, on initialization.
840 This is awfully ugly, but preprocessor tricks to make it prettier
841 tend to be nonportable.
845 init_syscall_table ()
847 #if defined (SYS_exit)
848 syscall_table[SYS_exit] = "exit";
850 #if defined (SYS_fork)
851 syscall_table[SYS_fork] = "fork";
853 #if defined (SYS_read)
854 syscall_table[SYS_read] = "read";
856 #if defined (SYS_write)
857 syscall_table[SYS_write] = "write";
859 #if defined (SYS_open)
860 syscall_table[SYS_open] = "open";
862 #if defined (SYS_close)
863 syscall_table[SYS_close] = "close";
865 #if defined (SYS_wait)
866 syscall_table[SYS_wait] = "wait";
868 #if defined (SYS_creat)
869 syscall_table[SYS_creat] = "creat";
871 #if defined (SYS_link)
872 syscall_table[SYS_link] = "link";
874 #if defined (SYS_unlink)
875 syscall_table[SYS_unlink] = "unlink";
877 #if defined (SYS_exec)
878 syscall_table[SYS_exec] = "exec";
880 #if defined (SYS_execv)
881 syscall_table[SYS_execv] = "execv";
883 #if defined (SYS_execve)
884 syscall_table[SYS_execve] = "execve";
886 #if defined (SYS_chdir)
887 syscall_table[SYS_chdir] = "chdir";
889 #if defined (SYS_time)
890 syscall_table[SYS_time] = "time";
892 #if defined (SYS_mknod)
893 syscall_table[SYS_mknod] = "mknod";
895 #if defined (SYS_chmod)
896 syscall_table[SYS_chmod] = "chmod";
898 #if defined (SYS_chown)
899 syscall_table[SYS_chown] = "chown";
901 #if defined (SYS_brk)
902 syscall_table[SYS_brk] = "brk";
904 #if defined (SYS_stat)
905 syscall_table[SYS_stat] = "stat";
907 #if defined (SYS_lseek)
908 syscall_table[SYS_lseek] = "lseek";
910 #if defined (SYS_getpid)
911 syscall_table[SYS_getpid] = "getpid";
913 #if defined (SYS_mount)
914 syscall_table[SYS_mount] = "mount";
916 #if defined (SYS_umount)
917 syscall_table[SYS_umount] = "umount";
919 #if defined (SYS_setuid)
920 syscall_table[SYS_setuid] = "setuid";
922 #if defined (SYS_getuid)
923 syscall_table[SYS_getuid] = "getuid";
925 #if defined (SYS_stime)
926 syscall_table[SYS_stime] = "stime";
928 #if defined (SYS_ptrace)
929 syscall_table[SYS_ptrace] = "ptrace";
931 #if defined (SYS_alarm)
932 syscall_table[SYS_alarm] = "alarm";
934 #if defined (SYS_fstat)
935 syscall_table[SYS_fstat] = "fstat";
937 #if defined (SYS_pause)
938 syscall_table[SYS_pause] = "pause";
940 #if defined (SYS_utime)
941 syscall_table[SYS_utime] = "utime";
943 #if defined (SYS_stty)
944 syscall_table[SYS_stty] = "stty";
946 #if defined (SYS_gtty)
947 syscall_table[SYS_gtty] = "gtty";
949 #if defined (SYS_access)
950 syscall_table[SYS_access] = "access";
952 #if defined (SYS_nice)
953 syscall_table[SYS_nice] = "nice";
955 #if defined (SYS_statfs)
956 syscall_table[SYS_statfs] = "statfs";
958 #if defined (SYS_sync)
959 syscall_table[SYS_sync] = "sync";
961 #if defined (SYS_kill)
962 syscall_table[SYS_kill] = "kill";
964 #if defined (SYS_fstatfs)
965 syscall_table[SYS_fstatfs] = "fstatfs";
967 #if defined (SYS_pgrpsys)
968 syscall_table[SYS_pgrpsys] = "pgrpsys";
970 #if defined (SYS_xenix)
971 syscall_table[SYS_xenix] = "xenix";
973 #if defined (SYS_dup)
974 syscall_table[SYS_dup] = "dup";
976 #if defined (SYS_pipe)
977 syscall_table[SYS_pipe] = "pipe";
979 #if defined (SYS_times)
980 syscall_table[SYS_times] = "times";
982 #if defined (SYS_profil)
983 syscall_table[SYS_profil] = "profil";
985 #if defined (SYS_plock)
986 syscall_table[SYS_plock] = "plock";
988 #if defined (SYS_setgid)
989 syscall_table[SYS_setgid] = "setgid";
991 #if defined (SYS_getgid)
992 syscall_table[SYS_getgid] = "getgid";
994 #if defined (SYS_signal)
995 syscall_table[SYS_signal] = "signal";
997 #if defined (SYS_msgsys)
998 syscall_table[SYS_msgsys] = "msgsys";
1000 #if defined (SYS_sys3b)
1001 syscall_table[SYS_sys3b] = "sys3b";
1003 #if defined (SYS_acct)
1004 syscall_table[SYS_acct] = "acct";
1006 #if defined (SYS_shmsys)
1007 syscall_table[SYS_shmsys] = "shmsys";
1009 #if defined (SYS_semsys)
1010 syscall_table[SYS_semsys] = "semsys";
1012 #if defined (SYS_ioctl)
1013 syscall_table[SYS_ioctl] = "ioctl";
1015 #if defined (SYS_uadmin)
1016 syscall_table[SYS_uadmin] = "uadmin";
1018 #if defined (SYS_utssys)
1019 syscall_table[SYS_utssys] = "utssys";
1021 #if defined (SYS_fsync)
1022 syscall_table[SYS_fsync] = "fsync";
1024 #if defined (SYS_umask)
1025 syscall_table[SYS_umask] = "umask";
1027 #if defined (SYS_chroot)
1028 syscall_table[SYS_chroot] = "chroot";
1030 #if defined (SYS_fcntl)
1031 syscall_table[SYS_fcntl] = "fcntl";
1033 #if defined (SYS_ulimit)
1034 syscall_table[SYS_ulimit] = "ulimit";
1036 #if defined (SYS_rfsys)
1037 syscall_table[SYS_rfsys] = "rfsys";
1039 #if defined (SYS_rmdir)
1040 syscall_table[SYS_rmdir] = "rmdir";
1042 #if defined (SYS_mkdir)
1043 syscall_table[SYS_mkdir] = "mkdir";
1045 #if defined (SYS_getdents)
1046 syscall_table[SYS_getdents] = "getdents";
1048 #if defined (SYS_sysfs)
1049 syscall_table[SYS_sysfs] = "sysfs";
1051 #if defined (SYS_getmsg)
1052 syscall_table[SYS_getmsg] = "getmsg";
1054 #if defined (SYS_putmsg)
1055 syscall_table[SYS_putmsg] = "putmsg";
1057 #if defined (SYS_poll)
1058 syscall_table[SYS_poll] = "poll";
1060 #if defined (SYS_lstat)
1061 syscall_table[SYS_lstat] = "lstat";
1063 #if defined (SYS_symlink)
1064 syscall_table[SYS_symlink] = "symlink";
1066 #if defined (SYS_readlink)
1067 syscall_table[SYS_readlink] = "readlink";
1069 #if defined (SYS_setgroups)
1070 syscall_table[SYS_setgroups] = "setgroups";
1072 #if defined (SYS_getgroups)
1073 syscall_table[SYS_getgroups] = "getgroups";
1075 #if defined (SYS_fchmod)
1076 syscall_table[SYS_fchmod] = "fchmod";
1078 #if defined (SYS_fchown)
1079 syscall_table[SYS_fchown] = "fchown";
1081 #if defined (SYS_sigprocmask)
1082 syscall_table[SYS_sigprocmask] = "sigprocmask";
1084 #if defined (SYS_sigsuspend)
1085 syscall_table[SYS_sigsuspend] = "sigsuspend";
1087 #if defined (SYS_sigaltstack)
1088 syscall_table[SYS_sigaltstack] = "sigaltstack";
1090 #if defined (SYS_sigaction)
1091 syscall_table[SYS_sigaction] = "sigaction";
1093 #if defined (SYS_sigpending)
1094 syscall_table[SYS_sigpending] = "sigpending";
1096 #if defined (SYS_context)
1097 syscall_table[SYS_context] = "context";
1099 #if defined (SYS_evsys)
1100 syscall_table[SYS_evsys] = "evsys";
1102 #if defined (SYS_evtrapret)
1103 syscall_table[SYS_evtrapret] = "evtrapret";
1105 #if defined (SYS_statvfs)
1106 syscall_table[SYS_statvfs] = "statvfs";
1108 #if defined (SYS_fstatvfs)
1109 syscall_table[SYS_fstatvfs] = "fstatvfs";
1111 #if defined (SYS_nfssys)
1112 syscall_table[SYS_nfssys] = "nfssys";
1114 #if defined (SYS_waitsys)
1115 syscall_table[SYS_waitsys] = "waitsys";
1117 #if defined (SYS_sigsendsys)
1118 syscall_table[SYS_sigsendsys] = "sigsendsys";
1120 #if defined (SYS_hrtsys)
1121 syscall_table[SYS_hrtsys] = "hrtsys";
1123 #if defined (SYS_acancel)
1124 syscall_table[SYS_acancel] = "acancel";
1126 #if defined (SYS_async)
1127 syscall_table[SYS_async] = "async";
1129 #if defined (SYS_priocntlsys)
1130 syscall_table[SYS_priocntlsys] = "priocntlsys";
1132 #if defined (SYS_pathconf)
1133 syscall_table[SYS_pathconf] = "pathconf";
1135 #if defined (SYS_mincore)
1136 syscall_table[SYS_mincore] = "mincore";
1138 #if defined (SYS_mmap)
1139 syscall_table[SYS_mmap] = "mmap";
1141 #if defined (SYS_mprotect)
1142 syscall_table[SYS_mprotect] = "mprotect";
1144 #if defined (SYS_munmap)
1145 syscall_table[SYS_munmap] = "munmap";
1147 #if defined (SYS_fpathconf)
1148 syscall_table[SYS_fpathconf] = "fpathconf";
1150 #if defined (SYS_vfork)
1151 syscall_table[SYS_vfork] = "vfork";
1153 #if defined (SYS_fchdir)
1154 syscall_table[SYS_fchdir] = "fchdir";
1156 #if defined (SYS_readv)
1157 syscall_table[SYS_readv] = "readv";
1159 #if defined (SYS_writev)
1160 syscall_table[SYS_writev] = "writev";
1162 #if defined (SYS_xstat)
1163 syscall_table[SYS_xstat] = "xstat";
1165 #if defined (SYS_lxstat)
1166 syscall_table[SYS_lxstat] = "lxstat";
1168 #if defined (SYS_fxstat)
1169 syscall_table[SYS_fxstat] = "fxstat";
1171 #if defined (SYS_xmknod)
1172 syscall_table[SYS_xmknod] = "xmknod";
1174 #if defined (SYS_clocal)
1175 syscall_table[SYS_clocal] = "clocal";
1177 #if defined (SYS_setrlimit)
1178 syscall_table[SYS_setrlimit] = "setrlimit";
1180 #if defined (SYS_getrlimit)
1181 syscall_table[SYS_getrlimit] = "getrlimit";
1183 #if defined (SYS_lchown)
1184 syscall_table[SYS_lchown] = "lchown";
1186 #if defined (SYS_memcntl)
1187 syscall_table[SYS_memcntl] = "memcntl";
1189 #if defined (SYS_getpmsg)
1190 syscall_table[SYS_getpmsg] = "getpmsg";
1192 #if defined (SYS_putpmsg)
1193 syscall_table[SYS_putpmsg] = "putpmsg";
1195 #if defined (SYS_rename)
1196 syscall_table[SYS_rename] = "rename";
1198 #if defined (SYS_uname)
1199 syscall_table[SYS_uname] = "uname";
1201 #if defined (SYS_setegid)
1202 syscall_table[SYS_setegid] = "setegid";
1204 #if defined (SYS_sysconfig)
1205 syscall_table[SYS_sysconfig] = "sysconfig";
1207 #if defined (SYS_adjtime)
1208 syscall_table[SYS_adjtime] = "adjtime";
1210 #if defined (SYS_systeminfo)
1211 syscall_table[SYS_systeminfo] = "systeminfo";
1213 #if defined (SYS_seteuid)
1214 syscall_table[SYS_seteuid] = "seteuid";
1216 #if defined (SYS_sproc)
1217 syscall_table[SYS_sproc] = "sproc";
1225 procfs_kill_inferior - kill any currently inferior
1229 void procfs_kill_inferior (void)
1233 Kill any current inferior.
1237 Kills even attached inferiors. Presumably the user has already
1238 been prompted that the inferior is an attached one rather than
1239 one started by gdb. (FIXME?)
1244 procfs_kill_inferior ()
1246 target_mourn_inferior ();
1253 unconditionally_kill_inferior - terminate the inferior
1257 static void unconditionally_kill_inferior (struct procinfo *)
1261 Kill the specified inferior.
1265 A possibly useful enhancement would be to first try sending
1266 the inferior a terminate signal, politely asking it to commit
1267 suicide, before we murder it (we could call that
1268 politely_kill_inferior()).
1273 unconditionally_kill_inferior (pi)
1274 struct procinfo *pi;
1279 ppid = pi->prstatus.pr_ppid;
1282 ioctl (pi->fd, PIOCKILL, &signo);
1283 close_proc_file (pi);
1285 /* Only wait() for our direct children. Our grandchildren zombies are killed
1286 by the death of their parents. */
1288 if (ppid == getpid())
1296 procfs_xfer_memory -- copy data to or from inferior memory space
1300 int procfs_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
1301 int dowrite, struct target_ops target)
1305 Copy LEN bytes to/from inferior's memory starting at MEMADDR
1306 from/to debugger memory starting at MYADDR. Copy from inferior
1307 if DOWRITE is zero or to inferior if DOWRITE is nonzero.
1309 Returns the length copied, which is either the LEN argument or
1310 zero. This xfer function does not do partial moves, since procfs_ops
1311 doesn't allow memory operations to cross below us in the target stack
1316 The /proc interface makes this an almost trivial task.
1320 procfs_xfer_memory (memaddr, myaddr, len, dowrite, target)
1325 struct target_ops *target; /* ignored */
1328 struct procinfo *pi;
1330 pi = current_procinfo;
1332 if (lseek(pi->fd, (off_t) memaddr, 0) == (off_t) memaddr)
1336 nbytes = write (pi->fd, myaddr, len);
1340 nbytes = read (pi->fd, myaddr, len);
1354 procfs_store_registers -- copy register values back to inferior
1358 void procfs_store_registers (int regno)
1362 Store our current register values back into the inferior. If
1363 REGNO is -1 then store all the register, otherwise store just
1364 the value specified by REGNO.
1368 If we are storing only a single register, we first have to get all
1369 the current values from the process, overwrite the desired register
1370 in the gregset with the one we want from gdb's registers, and then
1371 send the whole set back to the process. For writing all the
1372 registers, all we have to do is generate the gregset and send it to
1375 Also note that the process has to be stopped on an event of interest
1376 for this to work, which basically means that it has to have been
1377 run under the control of one of the other /proc ioctl calls and not
1378 ptrace. Since we don't use ptrace anyway, we don't worry about this
1379 fine point, but it is worth noting for future reference.
1381 Gdb is confused about what this function is supposed to return.
1382 Some versions return a value, others return nothing. Some are
1383 declared to return a value and actually return nothing. Gdb ignores
1384 anything returned. (FIXME)
1389 procfs_store_registers (regno)
1392 struct procinfo *pi;
1394 pi = current_procinfo;
1398 ioctl (pi->fd, PIOCGREG, &pi->gregset);
1400 fill_gregset (&pi->gregset, regno);
1401 ioctl (pi->fd, PIOCSREG, &pi->gregset);
1403 #if defined (FP0_REGNUM)
1405 /* Now repeat everything using the floating point register set, if the
1406 target has floating point hardware. Since we ignore the returned value,
1407 we'll never know whether it worked or not anyway. */
1411 ioctl (pi->fd, PIOCGFPREG, &pi->fpregset);
1413 fill_fpregset (&pi->fpregset, regno);
1414 ioctl (pi->fd, PIOCSFPREG, &pi->fpregset);
1416 #endif /* FP0_REGNUM */
1424 create_procinfo - initialize access to a /proc entry
1428 void create_procinfo (int pid)
1432 Allocate a procinfo structure, open the /proc file and then sets up
1433 the set of signals and faults that are to be traced.
1437 If proc_init_failed ever gets called, control returns to the command
1438 processing loop via the standard error handling code.
1443 create_procinfo (pid)
1446 struct procinfo *pi;
1448 if (find_procinfo (pid, 1))
1449 return; /* All done! It already exists */
1451 pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
1453 if (!open_proc_file (pid, pi, O_RDWR))
1454 proc_init_failed (pi, "can't open process file");
1456 /* Add new process to process info list */
1458 pi->next = procinfo_list;
1461 add_fd (pi); /* Add to list for poll/select */
1463 memset ((char *) &pi->prrun, 0, sizeof (pi->prrun));
1464 prfillset (&pi->prrun.pr_trace);
1465 procfs_notice_signals (pid);
1466 prfillset (&pi->prrun.pr_fault);
1467 prdelset (&pi->prrun.pr_fault, FLTPAGE);
1469 if (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
1470 proc_init_failed (pi, "PIOCWSTOP failed");
1472 if (ioctl (pi->fd, PIOCSFAULT, &pi->prrun.pr_fault) < 0)
1473 proc_init_failed (pi, "PIOCSFAULT failed");
1480 procfs_init_inferior - initialize target vector and access to a
1485 void procfs_init_inferior (int pid)
1489 When gdb starts an inferior, this function is called in the parent
1490 process immediately after the fork. It waits for the child to stop
1491 on the return from the exec system call (the child itself takes care
1492 of ensuring that this is set up), then sets up the set of signals
1493 and faults that are to be traced.
1497 If proc_init_failed ever gets called, control returns to the command
1498 processing loop via the standard error handling code.
1503 procfs_init_inferior (pid)
1506 push_target (&procfs_ops);
1508 create_procinfo (pid);
1509 add_thread (pid); /* Setup initial thread */
1511 /* One trap to exec the shell, one to exec the program being debugged. */
1512 startup_inferior (2);
1519 procfs_notice_signals
1523 static void procfs_notice_signals (int pid);
1527 When the user changes the state of gdb's signal handling via the
1528 "handle" command, this function gets called to see if any change
1529 in the /proc interface is required. It is also called internally
1530 by other /proc interface functions to initialize the state of
1531 the traced signal set.
1533 One thing it does is that signals for which the state is "nostop",
1534 "noprint", and "pass", have their trace bits reset in the pr_trace
1535 field, so that they are no longer traced. This allows them to be
1536 delivered directly to the inferior without the debugger ever being
1541 procfs_notice_signals (pid)
1545 struct procinfo *pi;
1547 pi = find_procinfo (pid, 0);
1549 for (signo = 0; signo < NSIG; signo++)
1551 if (signal_stop_state (target_signal_from_host (signo)) == 0 &&
1552 signal_print_state (target_signal_from_host (signo)) == 0 &&
1553 signal_pass_state (target_signal_from_host (signo)) == 1)
1555 prdelset (&pi->prrun.pr_trace, signo);
1559 praddset (&pi->prrun.pr_trace, signo);
1562 if (ioctl (pi->fd, PIOCSTRACE, &pi->prrun.pr_trace))
1564 print_sys_errmsg ("PIOCSTRACE failed", errno);
1572 proc_set_exec_trap -- arrange for exec'd child to halt at startup
1576 void proc_set_exec_trap (void)
1580 This function is called in the child process when starting up
1581 an inferior, prior to doing the exec of the actual inferior.
1582 It sets the child process's exitset to make exit from the exec
1583 system call an event of interest to stop on, and then simply
1584 returns. The child does the exec, the system call returns, and
1585 the child stops at the first instruction, ready for the gdb
1586 parent process to take control of it.
1590 We need to use all local variables since the child may be sharing
1591 it's data space with the parent, if vfork was used rather than
1594 Also note that we want to turn off the inherit-on-fork flag in
1595 the child process so that any grand-children start with all
1596 tracing flags cleared.
1600 proc_set_exec_trap ()
1604 auto char procname[32];
1607 sprintf (procname, PROC_NAME_FMT, getpid ());
1608 if ((fd = open (procname, O_RDWR)) < 0)
1611 gdb_flush (gdb_stderr);
1614 premptyset (&exitset);
1615 premptyset (&entryset);
1618 Not all systems with /proc have all the exec* syscalls with the same
1619 names. On the SGI, for example, there is no SYS_exec, but there
1620 *is* a SYS_execv. So, we try to account for that. */
1623 praddset (&exitset, SYS_exec);
1626 praddset (&exitset, SYS_execve);
1629 praddset (&exitset, SYS_execv);
1632 if (ioctl (fd, PIOCSEXIT, &exitset) < 0)
1635 gdb_flush (gdb_stderr);
1639 praddset (&entryset, SYS_exit);
1641 if (ioctl (fd, PIOCSENTRY, &entryset) < 0)
1644 gdb_flush (gdb_stderr);
1648 /* Turn off inherit-on-fork flag so that all grand-children of gdb
1649 start with tracing flags cleared. */
1651 #if defined (PIOCRESET) /* New method */
1655 ioctl (fd, PIOCRESET, &pr_flags);
1658 #if defined (PIOCRFORK) /* Original method */
1659 ioctl (fd, PIOCRFORK, NULL);
1663 /* Turn on run-on-last-close flag so that this process will not hang
1664 if GDB goes away for some reason. */
1666 #if defined (PIOCSET) /* New method */
1670 (void) ioctl (fd, PIOCSET, &pr_flags);
1673 #if defined (PIOCSRLC) /* Original method */
1674 (void) ioctl (fd, PIOCSRLC, 0);
1683 proc_iterate_over_mappings -- call function for every mapped space
1687 int proc_iterate_over_mappings (int (*func)())
1691 Given a pointer to a function, call that function for every
1692 mapped address space, passing it an open file descriptor for
1693 the file corresponding to that mapped address space (if any)
1694 and the base address of the mapped space. Quit when we hit
1695 the end of the mappings or the function returns nonzero.
1699 proc_iterate_over_mappings (func)
1700 int (*func) PARAMS ((int, CORE_ADDR));
1705 struct prmap *prmaps;
1706 struct prmap *prmap;
1707 struct procinfo *pi;
1709 pi = current_procinfo;
1711 if (ioctl (pi->fd, PIOCNMAP, &nmap) == 0)
1713 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
1714 if (ioctl (pi->fd, PIOCMAP, prmaps) == 0)
1716 for (prmap = prmaps; prmap -> pr_size && funcstat == 0; ++prmap)
1718 fd = proc_address_to_fd (pi, (CORE_ADDR) prmap -> pr_vaddr, 0);
1719 funcstat = (*func) (fd, (CORE_ADDR) prmap -> pr_vaddr);
1727 #if 0 /* Currently unused */
1732 proc_base_address -- find base address for segment containing address
1736 CORE_ADDR proc_base_address (CORE_ADDR addr)
1740 Given an address of a location in the inferior, find and return
1741 the base address of the mapped segment containing that address.
1743 This is used for example, by the shared library support code,
1744 where we have the pc value for some location in the shared library
1745 where we are stopped, and need to know the base address of the
1746 segment containing that address.
1750 proc_base_address (addr)
1754 struct prmap *prmaps;
1755 struct prmap *prmap;
1756 CORE_ADDR baseaddr = 0;
1757 struct procinfo *pi;
1759 pi = current_procinfo;
1761 if (ioctl (pi->fd, PIOCNMAP, &nmap) == 0)
1763 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
1764 if (ioctl (pi->fd, PIOCMAP, prmaps) == 0)
1766 for (prmap = prmaps; prmap -> pr_size; ++prmap)
1768 if ((prmap -> pr_vaddr <= (caddr_t) addr) &&
1769 (prmap -> pr_vaddr + prmap -> pr_size > (caddr_t) addr))
1771 baseaddr = (CORE_ADDR) prmap -> pr_vaddr;
1786 proc_address_to_fd -- return open fd for file mapped to address
1790 int proc_address_to_fd (struct procinfo *pi, CORE_ADDR addr, complain)
1794 Given an address in the current inferior's address space, use the
1795 /proc interface to find an open file descriptor for the file that
1796 this address was mapped in from. Return -1 if there is no current
1797 inferior. Print a warning message if there is an inferior but
1798 the address corresponds to no file (IE a bogus address).
1803 proc_address_to_fd (pi, addr, complain)
1804 struct procinfo *pi;
1810 if ((fd = ioctl (pi->fd, PIOCOPENM, (caddr_t *) &addr)) < 0)
1814 print_sys_errmsg (pi->pathname, errno);
1815 warning ("can't find mapped file for address 0x%x", addr);
1822 /* Attach to process PID, then initialize for debugging it
1823 and wait for the trace-trap that results from attaching. */
1826 procfs_attach (args, from_tty)
1834 error_no_arg ("process-id to attach");
1838 if (pid == getpid()) /* Trying to masturbate? */
1839 error ("I refuse to debug myself!");
1843 exec_file = (char *) get_exec_file (0);
1846 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file, target_pid_to_str (pid));
1848 printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid));
1850 gdb_flush (gdb_stdout);
1855 push_target (&procfs_ops);
1859 /* Take a program previously attached to and detaches it.
1860 The program resumes execution and will no longer stop
1861 on signals, etc. We'd better not have left any breakpoints
1862 in the program or it'll die when it hits one. For this
1863 to work, it may be necessary for the process to have been
1864 previously attached. It *might* work if the program was
1865 started via the normal ptrace (PTRACE_TRACEME). */
1868 procfs_detach (args, from_tty)
1876 char *exec_file = get_exec_file (0);
1879 printf_unfiltered ("Detaching from program: %s %s\n",
1880 exec_file, target_pid_to_str (inferior_pid));
1881 gdb_flush (gdb_stdout);
1884 siggnal = atoi (args);
1886 do_detach (siggnal);
1888 unpush_target (&procfs_ops); /* Pop out of handling an inferior */
1891 /* Get ready to modify the registers array. On machines which store
1892 individual registers, this doesn't need to do anything. On machines
1893 which store all the registers in one fell swoop, this makes sure
1894 that registers contains all the registers from the program being
1898 procfs_prepare_to_store ()
1900 #ifdef CHILD_PREPARE_TO_STORE
1901 CHILD_PREPARE_TO_STORE ();
1905 /* Print status information about what we're accessing. */
1908 procfs_files_info (ignore)
1909 struct target_ops *ignore;
1911 printf_unfiltered ("\tUsing the running image of %s %s via /proc.\n",
1912 attach_flag? "attached": "child", target_pid_to_str (inferior_pid));
1917 procfs_open (arg, from_tty)
1921 error ("Use the \"run\" command to start a Unix child process.");
1928 do_attach -- attach to an already existing process
1932 int do_attach (int pid)
1936 Attach to an already existing process with the specified process
1937 id. If the process is not already stopped, query whether to
1942 The option of stopping at attach time is specific to the /proc
1943 versions of gdb. Versions using ptrace force the attachee
1944 to stop. (I have changed this version to do so, too. All you
1945 have to do is "continue" to make it go on. -- gnu@cygnus.com)
1954 struct procinfo *pi;
1956 pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
1958 if (!open_proc_file (pid, pi, O_RDWR))
1961 perror_with_name (pi->pathname);
1965 /* Add new process to process info list */
1967 pi->next = procinfo_list;
1970 add_fd (pi); /* Add to list for poll/select */
1972 /* Get current status of process and if it is not already stopped,
1973 then stop it. Remember whether or not it was stopped when we first
1976 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
1978 print_sys_errmsg (pi->pathname, errno);
1979 close_proc_file (pi);
1980 error ("PIOCSTATUS failed");
1982 if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
1984 pi->was_stopped = 1;
1988 pi->was_stopped = 0;
1989 if (1 || query ("Process is currently running, stop it? "))
1991 /* Make it run again when we close it. */
1992 #if defined (PIOCSET) /* New method */
1996 result = ioctl (pi->fd, PIOCSET, &pr_flags);
1999 #if defined (PIOCSRLC) /* Original method */
2000 result = ioctl (pi->fd, PIOCSRLC, 0);
2005 print_sys_errmsg (pi->pathname, errno);
2006 close_proc_file (pi);
2007 error ("PIOCSRLC or PIOCSET failed");
2009 if (ioctl (pi->fd, PIOCSTOP, &pi->prstatus) < 0)
2011 print_sys_errmsg (pi->pathname, errno);
2012 close_proc_file (pi);
2013 error ("PIOCSTOP failed");
2015 pi->nopass_next_sigstop = 1;
2019 printf_unfiltered ("Ok, gdb will wait for %s to stop.\n", target_pid_to_str (pid));
2023 /* Remember some things about the inferior that we will, or might, change
2024 so that we can restore them when we detach. */
2026 ioctl (pi->fd, PIOCGTRACE, &pi->saved_trace);
2027 ioctl (pi->fd, PIOCGHOLD, &pi->saved_sighold);
2028 ioctl (pi->fd, PIOCGFAULT, &pi->saved_fltset);
2029 ioctl (pi->fd, PIOCGENTRY, &pi->saved_entryset);
2030 ioctl (pi->fd, PIOCGEXIT, &pi->saved_exitset);
2032 /* Set up trace and fault sets, as gdb expects them. */
2034 memset (&pi->prrun, 0, sizeof (pi->prrun));
2035 prfillset (&pi->prrun.pr_trace);
2036 procfs_notice_signals (pid);
2037 prfillset (&pi->prrun.pr_fault);
2038 prdelset (&pi->prrun.pr_fault, FLTPAGE);
2039 if (ioctl (pi->fd, PIOCSFAULT, &pi->prrun.pr_fault))
2041 print_sys_errmsg ("PIOCSFAULT failed", errno);
2043 if (ioctl (pi->fd, PIOCSTRACE, &pi->prrun.pr_trace))
2045 print_sys_errmsg ("PIOCSTRACE failed", errno);
2055 do_detach -- detach from an attached-to process
2059 void do_detach (int signal)
2063 Detach from the current attachee.
2065 If signal is non-zero, the attachee is started running again and sent
2066 the specified signal.
2068 If signal is zero and the attachee was not already stopped when we
2069 attached to it, then we make it runnable again when we detach.
2071 Otherwise, we query whether or not to make the attachee runnable
2072 again, since we may simply want to leave it in the state it was in
2075 We report any problems, but do not consider them errors, since we
2076 MUST detach even if some things don't seem to go right. This may not
2077 be the ideal situation. (FIXME).
2085 struct procinfo *pi;
2087 pi = current_procinfo;
2091 set_proc_siginfo (pi, signal);
2093 if (ioctl (pi->fd, PIOCSEXIT, &pi->saved_exitset) < 0)
2095 print_sys_errmsg (pi->pathname, errno);
2096 printf_unfiltered ("PIOCSEXIT failed.\n");
2098 if (ioctl (pi->fd, PIOCSENTRY, &pi->saved_entryset) < 0)
2100 print_sys_errmsg (pi->pathname, errno);
2101 printf_unfiltered ("PIOCSENTRY failed.\n");
2103 if (ioctl (pi->fd, PIOCSTRACE, &pi->saved_trace) < 0)
2105 print_sys_errmsg (pi->pathname, errno);
2106 printf_unfiltered ("PIOCSTRACE failed.\n");
2108 if (ioctl (pi->fd, PIOCSHOLD, &pi->saved_sighold) < 0)
2110 print_sys_errmsg (pi->pathname, errno);
2111 printf_unfiltered ("PIOSCHOLD failed.\n");
2113 if (ioctl (pi->fd, PIOCSFAULT, &pi->saved_fltset) < 0)
2115 print_sys_errmsg (pi->pathname, errno);
2116 printf_unfiltered ("PIOCSFAULT failed.\n");
2118 if (ioctl (pi->fd, PIOCSTATUS, &pi->prstatus) < 0)
2120 print_sys_errmsg (pi->pathname, errno);
2121 printf_unfiltered ("PIOCSTATUS failed.\n");
2125 if (signal || (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
2127 if (signal || !pi->was_stopped ||
2128 query ("Was stopped when attached, make it runnable again? "))
2130 /* Clear any fault that might have stopped it. */
2131 if (ioctl (pi->fd, PIOCCFAULT, 0))
2133 print_sys_errmsg (pi->pathname, errno);
2134 printf_unfiltered ("PIOCCFAULT failed.\n");
2137 /* Make it run again when we close it. */
2138 #if defined (PIOCSET) /* New method */
2142 result = ioctl (pi->fd, PIOCSET, &pr_flags);
2145 #if defined (PIOCSRLC) /* Original method */
2146 result = ioctl (pi->fd, PIOCSRLC, 0);
2151 print_sys_errmsg (pi->pathname, errno);
2152 printf_unfiltered ("PIOCSRLC or PIOCSET failed.\n");
2157 close_proc_file (pi);
2161 /* emulate wait() as much as possible.
2162 Wait for child to do something. Return pid of child, or -1 in case
2163 of error; store status in *OURSTATUS.
2165 Not sure why we can't
2166 just use wait(), but it seems to have problems when applied to a
2167 process being controlled with the /proc interface.
2169 We have a race problem here with no obvious solution. We need to let
2170 the inferior run until it stops on an event of interest, which means
2171 that we need to use the PIOCWSTOP ioctl. However, we cannot use this
2172 ioctl if the process is already stopped on something that is not an
2173 event of interest, or the call will hang indefinitely. Thus we first
2174 use PIOCSTATUS to see if the process is not stopped. If not, then we
2175 use PIOCWSTOP. But during the window between the two, if the process
2176 stops for any reason that is not an event of interest (such as a job
2177 control signal) then gdb will hang. One possible workaround is to set
2178 an alarm to wake up every minute of so and check to see if the process
2179 is still running, and if so, then reissue the PIOCWSTOP. But this is
2180 a real kludge, so has not been implemented. FIXME: investigate
2183 FIXME: Investigate why wait() seems to have problems with programs
2184 being control by /proc routines. */
2187 procfs_wait (pid, ourstatus)
2189 struct target_waitstatus *ourstatus;
2196 struct procinfo *pi;
2198 if (pid != -1) /* Non-specific process? */
2201 for (pi = procinfo_list; pi; pi = pi->next)
2211 for (pi = procinfo_list; pi; pi = pi->next)
2212 if (pi->pid == pid && pi->had_event)
2215 if (!pi && !checkerr)
2218 if (!checkerr && !(pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP)))
2220 if (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
2227 if (errno == ENOENT)
2229 rtnval = wait (&statval);
2230 if (rtnval != inferior_pid)
2232 print_sys_errmsg (pi->pathname, errno);
2233 error ("PIOCWSTOP, wait failed, returned %d", rtnval);
2239 print_sys_errmsg (pi->pathname, errno);
2240 error ("PIOCSTATUS or PIOCWSTOP failed.");
2244 else if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
2246 rtnval = pi->prstatus.pr_pid;
2247 why = pi->prstatus.pr_why;
2248 what = pi->prstatus.pr_what;
2253 statval = (what << 8) | 0177;
2256 if (what != SYS_exit)
2257 error ("PR_SYSENTRY, unknown system call %d", what);
2259 pi->prrun.pr_flags = PRCFAULT;
2261 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
2262 perror_with_name (pi->pathname);
2264 rtnval = wait (&statval);
2279 statval = (SIGTRAP << 8) | 0177;
2283 /* We've just detected the completion of an sproc system call. Now we need to
2284 setup a procinfo struct for this thread, and notify the thread system of the
2287 /* If sproc failed, then nothing interesting happened. Continue the process and
2288 go back to sleep. */
2290 if (pi->prstatus.pr_errno != 0)
2292 pi->prrun.pr_flags &= PRSTEP;
2293 pi->prrun.pr_flags |= PRCFAULT;
2295 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
2296 perror_with_name (pi->pathname);
2301 /* At this point, the new thread is stopped at it's first instruction, and
2302 the parent is stopped at the exit from sproc. */
2304 /* Notify the caller of the arrival of a new thread. */
2305 create_procinfo (pi->prstatus.pr_rval1);
2307 rtnval = pi->prstatus.pr_rval1;
2308 statval = (SIGTRAP << 8) | 0177;
2311 #endif /* SYS_sproc */
2314 error ("PIOCSTATUS (PR_SYSEXIT): Unknown system call %d", what);
2318 statval = (SIGSTOP << 8) | 0177;
2321 statval = (what << 8) | 0177;
2328 statval = (SIGTRAP << 8) | 0177;
2333 statval = (SIGTRAP << 8) | 0177;
2336 #ifndef FAULTED_USE_SIGINFO
2337 /* Irix, contrary to the documentation, fills in 0 for si_signo.
2338 Solaris fills in si_signo. I'm not sure about others. */
2341 statval = (SIGILL << 8) | 0177;
2345 statval = (SIGTRAP << 8) | 0177;
2350 statval = (SIGSEGV << 8) | 0177;
2355 statval = (SIGFPE << 8) | 0177;
2357 case FLTPAGE: /* Recoverable page fault */
2358 #endif /* not FAULTED_USE_SIGINFO */
2360 /* Use the signal which the kernel assigns. This is better than
2361 trying to second-guess it from the fault. In fact, I suspect
2362 that FLTACCESS can be either SIGSEGV or SIGBUS. */
2363 statval = ((pi->prstatus.pr_info.si_signo) << 8) | 0177;
2368 error ("PIOCWSTOP, unknown why %d, what %d", why, what);
2370 /* Stop all the other threads when any of them stops. */
2373 struct procinfo *procinfo;
2375 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
2377 if (!procinfo->had_event)
2378 if (ioctl (procinfo->fd, PIOCSTOP, &procinfo->prstatus) < 0)
2380 print_sys_errmsg (procinfo->pathname, errno);
2381 error ("PIOCSTOP failed");
2388 error ("PIOCWSTOP, stopped for unknown/unhandled reason, flags %#x",
2389 pi->prstatus.pr_flags);
2392 store_waitstatus (ourstatus, statval);
2394 if (rtnval == -1) /* No more children to wait for */
2396 fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing.\n");
2397 /* Claim it exited with unknown signal. */
2398 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
2399 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
2403 pi->had_event = 0; /* Indicate that we've seen this one */
2411 set_proc_siginfo - set a process's current signal info
2415 void set_proc_siginfo (struct procinfo *pip, int signo);
2419 Given a pointer to a process info struct in PIP and a signal number
2420 in SIGNO, set the process's current signal and its associated signal
2421 information. The signal will be delivered to the process immediately
2422 after execution is resumed, even if it is being held. In addition,
2423 this particular delivery will not cause another PR_SIGNALLED stop
2424 even if the signal is being traced.
2426 If we are not delivering the same signal that the prstatus siginfo
2427 struct contains information about, then synthesize a siginfo struct
2428 to match the signal we are doing to deliver, make it of the type
2429 "generated by a user process", and send this synthesized copy. When
2430 used to set the inferior's signal state, this will be required if we
2431 are not currently stopped because of a traced signal, or if we decide
2432 to continue with a different signal.
2434 Note that when continuing the inferior from a stop due to receipt
2435 of a traced signal, we either have set PRCSIG to clear the existing
2436 signal, or we have to call this function to do a PIOCSSIG with either
2437 the existing siginfo struct from pr_info, or one we have synthesized
2438 appropriately for the signal we want to deliver. Otherwise if the
2439 signal is still being traced, the inferior will immediately stop
2442 See siginfo(5) for more details.
2446 set_proc_siginfo (pip, signo)
2447 struct procinfo *pip;
2450 struct siginfo newsiginfo;
2451 struct siginfo *sip;
2453 if (signo == pip -> prstatus.pr_info.si_signo)
2455 sip = &pip -> prstatus.pr_info;
2459 memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
2461 sip -> si_signo = signo;
2463 sip -> si_errno = 0;
2464 sip -> si_pid = getpid ();
2465 sip -> si_uid = getuid ();
2467 if (ioctl (pip -> fd, PIOCSSIG, sip) < 0)
2469 print_sys_errmsg (pip -> pathname, errno);
2470 warning ("PIOCSSIG failed");
2474 /* Resume execution of process PID. If STEP is nozero, then
2475 just single step it. If SIGNAL is nonzero, restart it with that
2476 signal activated. */
2479 procfs_resume (pid, step, signo)
2482 enum target_signal signo;
2485 struct procinfo *pi, *procinfo;
2487 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
2490 pi->prrun.pr_flags = PRSTRACE | PRSFAULT | PRCFAULT;
2493 /* It should not be necessary. If the user explicitly changes the value,
2494 value_assign calls write_register_bytes, which writes it. */
2495 /* It may not be absolutely necessary to specify the PC value for
2496 restarting, but to be safe we use the value that gdb considers
2497 to be current. One case where this might be necessary is if the
2498 user explicitly changes the PC value that gdb considers to be
2499 current. FIXME: Investigate if this is necessary or not. */
2501 #ifdef PRSVADDR_BROKEN
2502 /* Can't do this under Solaris running on a Sparc, as there seems to be no
2503 place to put nPC. In fact, if you use this, nPC seems to be set to some
2504 random garbage. We have to rely on the fact that PC and nPC have been
2505 written previously via PIOCSREG during a register flush. */
2507 pi->prrun.pr_vaddr = (caddr_t) *(int *) ®isters[REGISTER_BYTE (PC_REGNUM)];
2508 pi->prrun.pr_flags != PRSVADDR;
2512 if (signo == TARGET_SIGNAL_STOP && pi->nopass_next_sigstop)
2513 /* When attaching to a child process, if we forced it to stop with
2514 a PIOCSTOP, then we will have set the nopass_next_sigstop flag.
2515 Upon resuming the first time after such a stop, we explicitly
2516 inhibit sending it another SIGSTOP, which would be the normal
2517 result of default signal handling. One potential drawback to
2518 this is that we will also ignore any attempt to by the user
2519 to explicitly continue after the attach with a SIGSTOP. Ultimately
2520 this problem should be dealt with by making the routines that
2521 deal with the inferior a little smarter, and possibly even allow
2522 an inferior to continue running at the same time as gdb. (FIXME?) */
2524 else if (signo == TARGET_SIGNAL_TSTP
2525 && pi->prstatus.pr_cursig == SIGTSTP
2526 && pi->prstatus.pr_action.sa_handler == SIG_DFL)
2528 /* We are about to pass the inferior a SIGTSTP whose action is
2529 SIG_DFL. The SIG_DFL action for a SIGTSTP is to stop
2530 (notifying the parent via wait()), and then keep going from the
2531 same place when the parent is ready for you to keep going. So
2532 under the debugger, it should do nothing (as if the program had
2533 been stopped and then later resumed. Under ptrace, this
2534 happens for us, but under /proc, the system obligingly stops
2535 the process, and wait_for_inferior would have no way of
2536 distinguishing that type of stop (which indicates that we
2537 should just start it again), with a stop due to the pr_trace
2538 field of the prrun_t struct.
2540 Note that if the SIGTSTP is being caught, we *do* need to pass it,
2541 because the handler needs to get executed. */
2544 signal_to_pass = target_signal_to_host (signo);
2548 set_proc_siginfo (pi, signal_to_pass);
2552 pi->prrun.pr_flags |= PRCSIG;
2554 pi->nopass_next_sigstop = 0;
2557 pi->prrun.pr_flags |= PRSTEP;
2559 if (ioctl (pi->fd, PIOCRUN, &pi->prrun) != 0)
2561 perror_with_name (pi->pathname);
2567 /* Continue all the other threads that haven't had an event of
2571 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
2573 if (pi != procinfo && !procinfo->had_event)
2575 procinfo->prrun.pr_flags &= PRSTEP;
2576 procinfo->prrun.pr_flags |= PRCFAULT | PRCSIG;
2577 ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus);
2578 if (ioctl (procinfo->fd, PIOCRUN, &procinfo->prrun) < 0)
2580 if (ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus) < 0)
2582 fprintf_unfiltered(gdb_stderr, "PIOCSTATUS failed, errno=%d\n", errno);
2584 print_sys_errmsg (procinfo->pathname, errno);
2585 error ("PIOCRUN failed");
2587 ioctl (procinfo->fd, PIOCSTATUS, &procinfo->prstatus);
2596 procfs_fetch_registers -- fetch current registers from inferior
2600 void procfs_fetch_registers (int regno)
2604 Read the current values of the inferior's registers, both the
2605 general register set and floating point registers (if supported)
2606 and update gdb's idea of their current values.
2611 procfs_fetch_registers (regno)
2614 struct procinfo *pi;
2616 pi = current_procinfo;
2618 if (ioctl (pi->fd, PIOCGREG, &pi->gregset) != -1)
2620 supply_gregset (&pi->gregset);
2622 #if defined (FP0_REGNUM)
2623 if (ioctl (pi->fd, PIOCGFPREG, &pi->fpregset) != -1)
2625 supply_fpregset (&pi->fpregset);
2634 proc_init_failed - called whenever /proc access initialization
2639 static void proc_init_failed (struct procinfo *pi, char *why)
2643 This function is called whenever initialization of access to a /proc
2644 entry fails. It prints a suitable error message, does some cleanup,
2645 and then invokes the standard error processing routine which dumps
2646 us back into the command loop.
2650 proc_init_failed (pi, why)
2651 struct procinfo *pi;
2654 print_sys_errmsg (pi->pathname, errno);
2655 kill (pi->pid, SIGKILL);
2656 close_proc_file (pi);
2665 close_proc_file - close any currently open /proc entry
2669 static void close_proc_file (struct procinfo *pip)
2673 Close any currently open /proc entry and mark the process information
2674 entry as invalid. In order to ensure that we don't try to reuse any
2675 stale information, the pid, fd, and pathnames are explicitly
2676 invalidated, which may be overkill.
2681 close_proc_file (pip)
2682 struct procinfo *pip;
2684 struct procinfo *procinfo;
2686 remove_fd (pip); /* Remove fd from poll/select list */
2690 free (pip -> pathname);
2692 /* Unlink pip from the procinfo chain. Note pip might not be on the list. */
2694 if (procinfo_list == pip)
2695 procinfo_list = pip->next;
2697 for (procinfo = procinfo_list; procinfo; procinfo = procinfo->next)
2698 if (procinfo->next == pip)
2699 procinfo->next = pip->next;
2708 open_proc_file - open a /proc entry for a given process id
2712 static int open_proc_file (int pid, struct procinfo *pip, int mode)
2716 Given a process id and a mode, close the existing open /proc
2717 entry (if any) and open one for the new process id, in the
2718 specified mode. Once it is open, then mark the local process
2719 information structure as valid, which guarantees that the pid,
2720 fd, and pathname fields match an open /proc entry. Returns
2721 zero if the open fails, nonzero otherwise.
2723 Note that the pathname is left intact, even when the open fails,
2724 so that callers can use it to construct meaningful error messages
2725 rather than just "file open failed".
2729 open_proc_file (pid, pip, mode)
2731 struct procinfo *pip;
2735 pip -> had_event = 0;
2736 pip -> pathname = xmalloc (32);
2739 sprintf (pip -> pathname, PROC_NAME_FMT, pid);
2740 if ((pip -> fd = open (pip -> pathname, mode)) < 0)
2747 mappingflags (flags)
2750 static char asciiflags[8];
2752 strcpy (asciiflags, "-------");
2753 #if defined (MA_PHYS)
2754 if (flags & MA_PHYS) asciiflags[0] = 'd';
2756 if (flags & MA_STACK) asciiflags[1] = 's';
2757 if (flags & MA_BREAK) asciiflags[2] = 'b';
2758 if (flags & MA_SHARED) asciiflags[3] = 's';
2759 if (flags & MA_READ) asciiflags[4] = 'r';
2760 if (flags & MA_WRITE) asciiflags[5] = 'w';
2761 if (flags & MA_EXEC) asciiflags[6] = 'x';
2762 return (asciiflags);
2766 info_proc_flags (pip, summary)
2767 struct procinfo *pip;
2770 struct trans *transp;
2772 printf_filtered ("%-32s", "Process status flags:");
2775 printf_filtered ("\n\n");
2777 for (transp = pr_flag_table; transp -> name != NULL; transp++)
2779 if (pip -> prstatus.pr_flags & transp -> value)
2783 printf_filtered ("%s ", transp -> name);
2787 printf_filtered ("\t%-16s %s.\n", transp -> name, transp -> desc);
2791 printf_filtered ("\n");
2795 info_proc_stop (pip, summary)
2796 struct procinfo *pip;
2799 struct trans *transp;
2803 why = pip -> prstatus.pr_why;
2804 what = pip -> prstatus.pr_what;
2806 if (pip -> prstatus.pr_flags & PR_STOPPED)
2808 printf_filtered ("%-32s", "Reason for stopping:");
2811 printf_filtered ("\n\n");
2813 for (transp = pr_why_table; transp -> name != NULL; transp++)
2815 if (why == transp -> value)
2819 printf_filtered ("%s ", transp -> name);
2823 printf_filtered ("\t%-16s %s.\n",
2824 transp -> name, transp -> desc);
2830 /* Use the pr_why field to determine what the pr_what field means, and
2831 print more information. */
2836 /* pr_what is unused for this case */
2842 printf_filtered ("%s ", signalname (what));
2846 printf_filtered ("\t%-16s %s.\n", signalname (what),
2847 safe_strsignal (what));
2853 printf_filtered ("%s ", syscallname (what));
2857 printf_filtered ("\t%-16s %s.\n", syscallname (what),
2858 "Entered this system call");
2864 printf_filtered ("%s ", syscallname (what));
2868 printf_filtered ("\t%-16s %s.\n", syscallname (what),
2869 "Returned from this system call");
2875 printf_filtered ("%s ",
2876 lookupname (faults_table, what, "fault"));
2880 printf_filtered ("\t%-16s %s.\n",
2881 lookupname (faults_table, what, "fault"),
2882 lookupdesc (faults_table, what));
2886 printf_filtered ("\n");
2891 info_proc_siginfo (pip, summary)
2892 struct procinfo *pip;
2895 struct siginfo *sip;
2897 if ((pip -> prstatus.pr_flags & PR_STOPPED) &&
2898 (pip -> prstatus.pr_why == PR_SIGNALLED ||
2899 pip -> prstatus.pr_why == PR_FAULTED))
2901 printf_filtered ("%-32s", "Additional signal/fault info:");
2902 sip = &pip -> prstatus.pr_info;
2905 printf_filtered ("%s ", signalname (sip -> si_signo));
2906 if (sip -> si_errno > 0)
2908 printf_filtered ("%s ", errnoname (sip -> si_errno));
2910 if (sip -> si_code <= 0)
2912 printf_filtered ("sent by %s, uid %d ",
2913 target_pid_to_str (sip -> si_pid),
2918 printf_filtered ("%s ", sigcodename (sip));
2919 if ((sip -> si_signo == SIGILL) ||
2920 (sip -> si_signo == SIGFPE) ||
2921 (sip -> si_signo == SIGSEGV) ||
2922 (sip -> si_signo == SIGBUS))
2924 printf_filtered ("addr=%#x ", sip -> si_addr);
2926 else if ((sip -> si_signo == SIGCHLD))
2928 printf_filtered ("child %s, status %u ",
2929 target_pid_to_str (sip -> si_pid),
2932 else if ((sip -> si_signo == SIGPOLL))
2934 printf_filtered ("band %u ", sip -> si_band);
2940 printf_filtered ("\n\n");
2941 printf_filtered ("\t%-16s %s.\n", signalname (sip -> si_signo),
2942 safe_strsignal (sip -> si_signo));
2943 if (sip -> si_errno > 0)
2945 printf_filtered ("\t%-16s %s.\n",
2946 errnoname (sip -> si_errno),
2947 safe_strerror (sip -> si_errno));
2949 if (sip -> si_code <= 0)
2951 printf_filtered ("\t%-16u %s\n", sip -> si_pid, /* XXX need target_pid_to_str() */
2952 "PID of process sending signal");
2953 printf_filtered ("\t%-16u %s\n", sip -> si_uid,
2954 "UID of process sending signal");
2958 printf_filtered ("\t%-16s %s.\n", sigcodename (sip),
2960 if ((sip -> si_signo == SIGILL) ||
2961 (sip -> si_signo == SIGFPE))
2963 printf_filtered ("\t%-16#x %s.\n", sip -> si_addr,
2964 "Address of faulting instruction");
2966 else if ((sip -> si_signo == SIGSEGV) ||
2967 (sip -> si_signo == SIGBUS))
2969 printf_filtered ("\t%-16#x %s.\n", sip -> si_addr,
2970 "Address of faulting memory reference");
2972 else if ((sip -> si_signo == SIGCHLD))
2974 printf_filtered ("\t%-16u %s.\n", sip -> si_pid, /* XXX need target_pid_to_str() */
2975 "Child process ID");
2976 printf_filtered ("\t%-16u %s.\n", sip -> si_status,
2977 "Child process exit value or signal");
2979 else if ((sip -> si_signo == SIGPOLL))
2981 printf_filtered ("\t%-16u %s.\n", sip -> si_band,
2982 "Band event for POLL_{IN,OUT,MSG}");
2986 printf_filtered ("\n");
2991 info_proc_syscalls (pip, summary)
2992 struct procinfo *pip;
3000 #if 0 /* FIXME: Needs to use gdb-wide configured info about system calls. */
3001 if (pip -> prstatus.pr_flags & PR_ASLEEP)
3003 int syscallnum = pip -> prstatus.pr_reg[R_D0];
3006 printf_filtered ("%-32s", "Sleeping in system call:");
3007 printf_filtered ("%s", syscallname (syscallnum));
3011 printf_filtered ("Sleeping in system call '%s'.\n",
3012 syscallname (syscallnum));
3017 if (ioctl (pip -> fd, PIOCGENTRY, &pip -> entryset) < 0)
3019 print_sys_errmsg (pip -> pathname, errno);
3020 error ("PIOCGENTRY failed");
3023 if (ioctl (pip -> fd, PIOCGEXIT, &pip -> exitset) < 0)
3025 print_sys_errmsg (pip -> pathname, errno);
3026 error ("PIOCGEXIT failed");
3029 printf_filtered ("System call tracing information:\n\n");
3031 printf_filtered ("\t%-12s %-8s %-8s\n",
3035 for (syscallnum = 0; syscallnum < MAX_SYSCALLS; syscallnum++)
3038 if (syscall_table[syscallnum] != NULL)
3040 printf_filtered ("\t%-12s ", syscall_table[syscallnum]);
3041 printf_filtered ("%-8s ",
3042 prismember (&pip -> entryset, syscallnum)
3044 printf_filtered ("%-8s ",
3045 prismember (&pip -> exitset, syscallnum)
3047 printf_filtered ("\n");
3050 printf_filtered ("\n");
3059 static char locbuf[32];
3061 name = strsigno (signo);
3064 sprintf (locbuf, "Signal %d", signo);
3068 sprintf (locbuf, "%s (%d)", name, signo);
3078 static char locbuf[32];
3080 name = strerrno (errnum);
3083 sprintf (locbuf, "Errno %d", errnum);
3087 sprintf (locbuf, "%s (%d)", name, errnum);
3093 info_proc_signals (pip, summary)
3094 struct procinfo *pip;
3101 if (ioctl (pip -> fd, PIOCGTRACE, &pip -> trace) < 0)
3103 print_sys_errmsg (pip -> pathname, errno);
3104 error ("PIOCGTRACE failed");
3107 printf_filtered ("Disposition of signals:\n\n");
3108 printf_filtered ("\t%-15s %-8s %-8s %-8s %s\n\n",
3109 "Signal", "Trace", "Hold", "Pending", "Description");
3110 for (signo = 0; signo < NSIG; signo++)
3113 printf_filtered ("\t%-15s ", signalname (signo));
3114 printf_filtered ("%-8s ",
3115 prismember (&pip -> trace, signo)
3117 printf_filtered ("%-8s ",
3118 prismember (&pip -> prstatus.pr_sighold, signo)
3120 printf_filtered ("%-8s ",
3121 prismember (&pip -> prstatus.pr_sigpend, signo)
3123 printf_filtered (" %s\n", safe_strsignal (signo));
3125 printf_filtered ("\n");
3130 info_proc_faults (pip, summary)
3131 struct procinfo *pip;
3134 struct trans *transp;
3138 if (ioctl (pip -> fd, PIOCGFAULT, &pip -> fltset) < 0)
3140 print_sys_errmsg (pip -> pathname, errno);
3141 error ("PIOCGFAULT failed");
3144 printf_filtered ("Current traced hardware fault set:\n\n");
3145 printf_filtered ("\t%-12s %-8s\n", "Fault", "Trace");
3147 for (transp = faults_table; transp -> name != NULL; transp++)
3150 printf_filtered ("\t%-12s ", transp -> name);
3151 printf_filtered ("%-8s", prismember (&pip -> fltset, transp -> value)
3153 printf_filtered ("\n");
3155 printf_filtered ("\n");
3160 info_proc_mappings (pip, summary)
3161 struct procinfo *pip;
3165 struct prmap *prmaps;
3166 struct prmap *prmap;
3170 printf_filtered ("Mapped address spaces:\n\n");
3171 printf_filtered ("\t%10s %10s %10s %10s %7s\n",
3177 if (ioctl (pip -> fd, PIOCNMAP, &nmap) == 0)
3179 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
3180 if (ioctl (pip -> fd, PIOCMAP, prmaps) == 0)
3182 for (prmap = prmaps; prmap -> pr_size; ++prmap)
3184 printf_filtered ("\t%#10x %#10x %#10x %#10x %7s\n",
3186 prmap -> pr_vaddr + prmap -> pr_size - 1,
3189 mappingflags (prmap -> pr_mflags));
3193 printf_filtered ("\n");
3201 info_proc -- implement the "info proc" command
3205 void info_proc (char *args, int from_tty)
3209 Implement gdb's "info proc" command by using the /proc interface
3210 to print status information about any currently running process.
3212 Examples of the use of "info proc" are:
3214 info proc (prints summary info for current inferior)
3215 info proc 123 (prints summary info for process with pid 123)
3216 info proc mappings (prints address mappings)
3217 info proc times (prints process/children times)
3218 info proc id (prints pid, ppid, gid, sid, etc)
3219 FIXME: i proc id not implemented.
3220 info proc status (prints general process state info)
3221 FIXME: i proc status not implemented.
3222 info proc signals (prints info about signal handling)
3223 info proc all (prints all info)
3228 info_proc (args, from_tty)
3233 struct procinfo *pip;
3234 struct cleanup *old_chain;
3248 old_chain = make_cleanup (null_cleanup, 0);
3250 /* Default to using the current inferior if no pid specified. Note
3251 that inferior_pid may be 0, hence we set okerr. */
3253 pip = find_procinfo (inferior_pid, 1);
3257 if ((argv = buildargv (args)) == NULL)
3261 make_cleanup (freeargv, (char *) argv);
3263 while (*argv != NULL)
3265 argsize = strlen (*argv);
3266 if (argsize >= 1 && strncmp (*argv, "all", argsize) == 0)
3271 else if (argsize >= 2 && strncmp (*argv, "faults", argsize) == 0)
3276 else if (argsize >= 2 && strncmp (*argv, "flags", argsize) == 0)
3281 else if (argsize >= 1 && strncmp (*argv, "id", argsize) == 0)
3286 else if (argsize >= 1 && strncmp (*argv, "mappings", argsize) == 0)
3291 else if (argsize >= 2 && strncmp (*argv, "signals", argsize) == 0)
3296 else if (argsize >= 2 && strncmp (*argv, "status", argsize) == 0)
3301 else if (argsize >= 2 && strncmp (*argv, "syscalls", argsize) == 0)
3306 else if (argsize >= 1 && strncmp (*argv, "times", argsize) == 0)
3311 else if ((pid = atoi (*argv)) > 0)
3313 pip = (struct procinfo *) xmalloc (sizeof (struct procinfo));
3314 memset (pip, 0, sizeof (*pip));
3317 if (!open_proc_file (pid, pip, O_RDONLY))
3319 perror_with_name (pip -> pathname);
3322 make_cleanup (close_proc_file, pip);
3324 else if (**argv != '\000')
3326 error ("Unrecognized or ambiguous keyword `%s'.", *argv);
3332 /* If we don't have a valid open process at this point, then we have no
3333 inferior or didn't specify a specific pid. */
3338 No process. Start debugging a program or specify an explicit process ID.");
3340 if (ioctl (pip -> fd, PIOCSTATUS, &(pip -> prstatus)) < 0)
3342 print_sys_errmsg (pip -> pathname, errno);
3343 error ("PIOCSTATUS failed");
3346 /* Print verbose information of the requested type(s), or just a summary
3347 of the information for all types. */
3349 printf_filtered ("\nInformation for %s:\n\n", pip -> pathname);
3350 if (summary || all || flags)
3352 info_proc_flags (pip, summary);
3356 info_proc_stop (pip, summary);
3358 if (summary || all || signals || faults)
3360 info_proc_siginfo (pip, summary);
3362 if (summary || all || syscalls)
3364 info_proc_syscalls (pip, summary);
3366 if (summary || all || mappings)
3368 info_proc_mappings (pip, summary);
3370 if (summary || all || signals)
3372 info_proc_signals (pip, summary);
3374 if (summary || all || faults)
3376 info_proc_faults (pip, summary);
3378 printf_filtered ("\n");
3380 /* All done, deal with closing any temporary process info structure,
3381 freeing temporary memory , etc. */
3383 do_cleanups (old_chain);
3390 procfs_set_sproc_trap -- arrange for exec'd child stop on sproc
3394 void procfs_set_sproc_trap (void)
3398 This function sets up a trap on sproc system call exits so that we can
3399 detect the arrival of a new thread. We are called with the child
3400 stopped prior to it's first instruction.
3402 Also note that we turn on the inherit-on-fork flag in the child process
3403 so that any grand-children start with all tracing flags set.
3409 procfs_set_sproc_trap (pi)
3410 struct procinfo *pi;
3414 if (ioctl (pi->fd, PIOCGEXIT, &exitset) < 0)
3416 print_sys_errmsg (pi->pathname, errno);
3417 error ("PIOCGEXIT failed");
3420 praddset (&exitset, SYS_sproc);
3422 if (ioctl (pi->fd, PIOCSEXIT, &exitset) < 0)
3424 print_sys_errmsg (pi->pathname, errno);
3425 error ("PIOCSEXIT failed");
3428 /* Turn on inherit-on-fork flag so that all grand-children of gdb start with
3429 tracing flags set. */
3431 #ifdef PIOCSET /* New method */
3435 ioctl (pi->fd, PIOCSET, &pr_flags);
3438 #ifdef PIOCSFORK /* Original method */
3439 ioctl (pi->fd, PIOCSFORK, NULL);
3443 #endif /* SYS_sproc */
3445 /* Fork an inferior process, and start debugging it with /proc. */
3448 procfs_create_inferior (exec_file, allargs, env)
3453 char *shell_file = getenv ("SHELL");
3455 if (shell_file != NULL && strchr (shell_file, '/') == NULL)
3458 /* We will be looking down the PATH to find shell_file. If we
3459 just do this the normal way (via execlp, which operates by
3460 attempting an exec for each element of the PATH until it
3461 finds one which succeeds), then there will be an exec for
3462 each failed attempt, each of which will cause a PR_SYSEXIT
3463 stop, and we won't know how to distinguish the PR_SYSEXIT's
3464 for these failed execs with the ones for successful execs
3465 (whether the exec has succeeded is stored at that time in the
3466 carry bit or some such architecture-specific and
3467 non-ABI-specified place).
3469 So I can't think of anything better than to search the PATH
3470 now. This has several disadvantages: (1) There is a race
3471 condition; if we find a file now and it is deleted before we
3472 exec it, we lose, even if the deletion leaves a valid file
3473 further down in the PATH, (2) there is no way to know exactly
3474 what an executable (in the sense of "capable of being
3475 exec'd") file is. Using access() loses because it may lose
3476 if the caller is the superuser; failing to use it loses if
3477 there are ACLs or some such. */
3481 /* FIXME-maybe: might want "set path" command so user can change what
3482 path is used from within GDB. */
3483 char *path = getenv ("PATH");
3485 struct stat statbuf;
3488 path = "/bin:/usr/bin";
3490 tryname = alloca (strlen (path) + strlen (shell_file) + 2);
3491 for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
3493 p1 = strchr (p, ':');
3498 strncpy (tryname, p, len);
3499 tryname[len] = '\0';
3500 strcat (tryname, "/");
3501 strcat (tryname, shell_file);
3502 if (access (tryname, X_OK) < 0)
3504 if (stat (tryname, &statbuf) < 0)
3506 if (!S_ISREG (statbuf.st_mode))
3507 /* We certainly need to reject directories. I'm not quite
3508 as sure about FIFOs, sockets, etc., but I kind of doubt
3509 that people want to exec() these things. */
3514 /* Not found. This must be an error rather than merely passing
3515 the file to execlp(), because execlp() would try all the
3516 exec()s, causing GDB to get confused. */
3517 error ("Can't find shell %s in PATH", shell_file);
3519 shell_file = tryname;
3522 fork_inferior (exec_file, allargs, env,
3523 proc_set_exec_trap, procfs_init_inferior, shell_file);
3525 /* We are at the first instruction we care about. */
3526 /* Pedal to the metal... */
3528 /* Setup traps on exit from sproc() */
3531 procfs_set_sproc_trap (current_procinfo);
3534 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
3537 /* Clean up after the inferior dies. */
3540 procfs_mourn_inferior ()
3542 struct procinfo *pi;
3543 struct procinfo *next_pi;
3545 for (pi = procinfo_list; pi; pi = next_pi)
3548 unconditionally_kill_inferior (pi);
3551 unpush_target (&procfs_ops);
3552 generic_mourn_inferior ();
3556 /* Mark our target-struct as eligible for stray "run" and "attach" commands. */
3562 #ifdef TARGET_CAN_USE_HARDWARE_WATCHPOINT
3564 /* Insert a watchpoint */
3566 procfs_set_watchpoint(pid, addr, len, rw)
3572 struct procinfo *pi;
3575 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
3576 wpt.pr_vaddr = (caddr_t)addr;
3578 wpt.pr_wflags = ((rw & 1) ? MA_READ : 0) | ((rw & 2) ? MA_WRITE : 0);
3579 if (ioctl (pi->fd, PIOCSWATCH, &wpt) < 0)
3583 /* Currently it sometimes happens that the same watchpoint gets
3584 deleted twice - don't die in this case (FIXME please) */
3585 if (errno == ESRCH && len == 0)
3587 print_sys_errmsg (pi->pathname, errno);
3588 error ("PIOCSWATCH failed");
3594 procfs_stopped_by_watchpoint(pid)
3597 struct procinfo *pi;
3601 pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
3602 if (pi->prstatus.pr_flags & (PR_STOPPED | PR_ISTOP))
3604 why = pi->prstatus.pr_why;
3605 what = pi->prstatus.pr_what;
3606 if (why == PR_FAULTED
3607 #if defined (FLTWATCH) && defined (FLTKWATCH)
3608 && (what == FLTWATCH) || (what == FLTKWATCH)
3611 && (what == FLTWATCH)
3614 && (what == FLTKWATCH)
3625 struct target_ops procfs_ops = {
3626 "procfs", /* to_shortname */
3627 "Unix /proc child process", /* to_longname */
3628 "Unix /proc child process (started by the \"run\" command).", /* to_doc */
3629 procfs_open, /* to_open */
3631 procfs_attach, /* to_attach */
3632 procfs_detach, /* to_detach */
3633 procfs_resume, /* to_resume */
3634 procfs_wait, /* to_wait */
3635 procfs_fetch_registers, /* to_fetch_registers */
3636 procfs_store_registers, /* to_store_registers */
3637 procfs_prepare_to_store, /* to_prepare_to_store */
3638 procfs_xfer_memory, /* to_xfer_memory */
3639 procfs_files_info, /* to_files_info */
3640 memory_insert_breakpoint, /* to_insert_breakpoint */
3641 memory_remove_breakpoint, /* to_remove_breakpoint */
3642 terminal_init_inferior, /* to_terminal_init */
3643 terminal_inferior, /* to_terminal_inferior */
3644 terminal_ours_for_output, /* to_terminal_ours_for_output */
3645 terminal_ours, /* to_terminal_ours */
3646 child_terminal_info, /* to_terminal_info */
3647 procfs_kill_inferior, /* to_kill */
3649 0, /* to_lookup_symbol */
3650 procfs_create_inferior, /* to_create_inferior */
3651 procfs_mourn_inferior, /* to_mourn_inferior */
3652 procfs_can_run, /* to_can_run */
3653 procfs_notice_signals, /* to_notice_signals */
3654 process_stratum, /* to_stratum */
3656 1, /* to_has_all_memory */
3657 1, /* to_has_memory */
3658 1, /* to_has_stack */
3659 1, /* to_has_registers */
3660 1, /* to_has_execution */
3662 0, /* sections_end */
3663 OPS_MAGIC /* to_magic */
3667 _initialize_procfs ()
3669 add_target (&procfs_ops);
3671 add_info ("proc", info_proc,
3672 "Show process status information using /proc entry.\n\
3673 Specify process id or use current inferior by default.\n\
3674 Specify keywords for detailed information; default is summary.\n\
3675 Keywords are: `all', `faults', `flags', `id', `mappings', `signals',\n\
3676 `status', `syscalls', and `times'.\n\
3677 Unambiguous abbreviations may be used.");
3679 init_syscall_table ();