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 struct procinfo * create_procinfo (int pid)
1432 Allocate a procinfo structure, open the /proc file and then set up the
1433 set of signals and faults that are to be traced. Returns a pointer to
1434 the new procinfo structure.
1438 If proc_init_failed ever gets called, control returns to the command
1439 processing loop via the standard error handling code.
1443 static struct procinfo
*
1444 create_procinfo (pid
)
1447 struct procinfo
*pi
;
1449 if (find_procinfo (pid
, 1))
1450 return; /* All done! It already exists */
1452 pi
= (struct procinfo
*) xmalloc (sizeof (struct procinfo
));
1454 if (!open_proc_file (pid
, pi
, O_RDWR
))
1455 proc_init_failed (pi
, "can't open process file");
1457 /* Add new process to process info list */
1459 pi
->next
= procinfo_list
;
1462 add_fd (pi
); /* Add to list for poll/select */
1464 memset ((char *) &pi
->prrun
, 0, sizeof (pi
->prrun
));
1465 prfillset (&pi
->prrun
.pr_trace
);
1466 procfs_notice_signals (pid
);
1467 prfillset (&pi
->prrun
.pr_fault
);
1468 prdelset (&pi
->prrun
.pr_fault
, FLTPAGE
);
1470 if (ioctl (pi
->fd
, PIOCWSTOP
, &pi
->prstatus
) < 0)
1471 proc_init_failed (pi
, "PIOCWSTOP failed");
1473 if (ioctl (pi
->fd
, PIOCSFAULT
, &pi
->prrun
.pr_fault
) < 0)
1474 proc_init_failed (pi
, "PIOCSFAULT failed");
1483 procfs_init_inferior - initialize target vector and access to a
1488 void procfs_init_inferior (int pid)
1492 When gdb starts an inferior, this function is called in the parent
1493 process immediately after the fork. It waits for the child to stop
1494 on the return from the exec system call (the child itself takes care
1495 of ensuring that this is set up), then sets up the set of signals
1496 and faults that are to be traced.
1500 If proc_init_failed ever gets called, control returns to the command
1501 processing loop via the standard error handling code.
1506 procfs_init_inferior (pid
)
1509 push_target (&procfs_ops
);
1511 create_procinfo (pid
);
1512 add_thread (pid
); /* Setup initial thread */
1514 /* One trap to exec the shell, one to exec the program being debugged. */
1515 startup_inferior (2);
1522 procfs_notice_signals
1526 static void procfs_notice_signals (int pid);
1530 When the user changes the state of gdb's signal handling via the
1531 "handle" command, this function gets called to see if any change
1532 in the /proc interface is required. It is also called internally
1533 by other /proc interface functions to initialize the state of
1534 the traced signal set.
1536 One thing it does is that signals for which the state is "nostop",
1537 "noprint", and "pass", have their trace bits reset in the pr_trace
1538 field, so that they are no longer traced. This allows them to be
1539 delivered directly to the inferior without the debugger ever being
1544 procfs_notice_signals (pid
)
1548 struct procinfo
*pi
;
1550 pi
= find_procinfo (pid
, 0);
1552 for (signo
= 0; signo
< NSIG
; signo
++)
1554 if (signal_stop_state (target_signal_from_host (signo
)) == 0 &&
1555 signal_print_state (target_signal_from_host (signo
)) == 0 &&
1556 signal_pass_state (target_signal_from_host (signo
)) == 1)
1558 prdelset (&pi
->prrun
.pr_trace
, signo
);
1562 praddset (&pi
->prrun
.pr_trace
, signo
);
1565 if (ioctl (pi
->fd
, PIOCSTRACE
, &pi
->prrun
.pr_trace
))
1567 print_sys_errmsg ("PIOCSTRACE failed", errno
);
1575 proc_set_exec_trap -- arrange for exec'd child to halt at startup
1579 void proc_set_exec_trap (void)
1583 This function is called in the child process when starting up
1584 an inferior, prior to doing the exec of the actual inferior.
1585 It sets the child process's exitset to make exit from the exec
1586 system call an event of interest to stop on, and then simply
1587 returns. The child does the exec, the system call returns, and
1588 the child stops at the first instruction, ready for the gdb
1589 parent process to take control of it.
1593 We need to use all local variables since the child may be sharing
1594 it's data space with the parent, if vfork was used rather than
1597 Also note that we want to turn off the inherit-on-fork flag in
1598 the child process so that any grand-children start with all
1599 tracing flags cleared.
1603 proc_set_exec_trap ()
1607 auto char procname
[32];
1610 sprintf (procname
, PROC_NAME_FMT
, getpid ());
1611 if ((fd
= open (procname
, O_RDWR
)) < 0)
1614 gdb_flush (gdb_stderr
);
1617 premptyset (&exitset
);
1618 premptyset (&entryset
);
1621 Not all systems with /proc have all the exec* syscalls with the same
1622 names. On the SGI, for example, there is no SYS_exec, but there
1623 *is* a SYS_execv. So, we try to account for that. */
1626 praddset (&exitset
, SYS_exec
);
1629 praddset (&exitset
, SYS_execve
);
1632 praddset (&exitset
, SYS_execv
);
1635 if (ioctl (fd
, PIOCSEXIT
, &exitset
) < 0)
1638 gdb_flush (gdb_stderr
);
1642 praddset (&entryset
, SYS_exit
);
1644 if (ioctl (fd
, PIOCSENTRY
, &entryset
) < 0)
1647 gdb_flush (gdb_stderr
);
1651 /* Turn off inherit-on-fork flag so that all grand-children of gdb
1652 start with tracing flags cleared. */
1654 #if defined (PIOCRESET) /* New method */
1658 ioctl (fd
, PIOCRESET
, &pr_flags
);
1661 #if defined (PIOCRFORK) /* Original method */
1662 ioctl (fd
, PIOCRFORK
, NULL
);
1666 /* Turn on run-on-last-close flag so that this process will not hang
1667 if GDB goes away for some reason. */
1669 #if defined (PIOCSET) /* New method */
1673 (void) ioctl (fd
, PIOCSET
, &pr_flags
);
1676 #if defined (PIOCSRLC) /* Original method */
1677 (void) ioctl (fd
, PIOCSRLC
, 0);
1686 proc_iterate_over_mappings -- call function for every mapped space
1690 int proc_iterate_over_mappings (int (*func)())
1694 Given a pointer to a function, call that function for every
1695 mapped address space, passing it an open file descriptor for
1696 the file corresponding to that mapped address space (if any)
1697 and the base address of the mapped space. Quit when we hit
1698 the end of the mappings or the function returns nonzero.
1702 proc_iterate_over_mappings (func
)
1703 int (*func
) PARAMS ((int, CORE_ADDR
));
1708 struct prmap
*prmaps
;
1709 struct prmap
*prmap
;
1710 struct procinfo
*pi
;
1712 pi
= current_procinfo
;
1714 if (ioctl (pi
->fd
, PIOCNMAP
, &nmap
) == 0)
1716 prmaps
= (struct prmap
*) alloca ((nmap
+ 1) * sizeof (*prmaps
));
1717 if (ioctl (pi
->fd
, PIOCMAP
, prmaps
) == 0)
1719 for (prmap
= prmaps
; prmap
-> pr_size
&& funcstat
== 0; ++prmap
)
1721 fd
= proc_address_to_fd (pi
, (CORE_ADDR
) prmap
-> pr_vaddr
, 0);
1722 funcstat
= (*func
) (fd
, (CORE_ADDR
) prmap
-> pr_vaddr
);
1730 #if 0 /* Currently unused */
1735 proc_base_address -- find base address for segment containing address
1739 CORE_ADDR proc_base_address (CORE_ADDR addr)
1743 Given an address of a location in the inferior, find and return
1744 the base address of the mapped segment containing that address.
1746 This is used for example, by the shared library support code,
1747 where we have the pc value for some location in the shared library
1748 where we are stopped, and need to know the base address of the
1749 segment containing that address.
1753 proc_base_address (addr
)
1757 struct prmap
*prmaps
;
1758 struct prmap
*prmap
;
1759 CORE_ADDR baseaddr
= 0;
1760 struct procinfo
*pi
;
1762 pi
= current_procinfo
;
1764 if (ioctl (pi
->fd
, PIOCNMAP
, &nmap
) == 0)
1766 prmaps
= (struct prmap
*) alloca ((nmap
+ 1) * sizeof (*prmaps
));
1767 if (ioctl (pi
->fd
, PIOCMAP
, prmaps
) == 0)
1769 for (prmap
= prmaps
; prmap
-> pr_size
; ++prmap
)
1771 if ((prmap
-> pr_vaddr
<= (caddr_t
) addr
) &&
1772 (prmap
-> pr_vaddr
+ prmap
-> pr_size
> (caddr_t
) addr
))
1774 baseaddr
= (CORE_ADDR
) prmap
-> pr_vaddr
;
1789 proc_address_to_fd -- return open fd for file mapped to address
1793 int proc_address_to_fd (struct procinfo *pi, CORE_ADDR addr, complain)
1797 Given an address in the current inferior's address space, use the
1798 /proc interface to find an open file descriptor for the file that
1799 this address was mapped in from. Return -1 if there is no current
1800 inferior. Print a warning message if there is an inferior but
1801 the address corresponds to no file (IE a bogus address).
1806 proc_address_to_fd (pi
, addr
, complain
)
1807 struct procinfo
*pi
;
1813 if ((fd
= ioctl (pi
->fd
, PIOCOPENM
, (caddr_t
*) &addr
)) < 0)
1817 print_sys_errmsg (pi
->pathname
, errno
);
1818 warning ("can't find mapped file for address 0x%x", addr
);
1825 /* Attach to process PID, then initialize for debugging it
1826 and wait for the trace-trap that results from attaching. */
1829 procfs_attach (args
, from_tty
)
1837 error_no_arg ("process-id to attach");
1841 if (pid
== getpid()) /* Trying to masturbate? */
1842 error ("I refuse to debug myself!");
1846 exec_file
= (char *) get_exec_file (0);
1849 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file
, target_pid_to_str (pid
));
1851 printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid
));
1853 gdb_flush (gdb_stdout
);
1858 push_target (&procfs_ops
);
1862 /* Take a program previously attached to and detaches it.
1863 The program resumes execution and will no longer stop
1864 on signals, etc. We'd better not have left any breakpoints
1865 in the program or it'll die when it hits one. For this
1866 to work, it may be necessary for the process to have been
1867 previously attached. It *might* work if the program was
1868 started via the normal ptrace (PTRACE_TRACEME). */
1871 procfs_detach (args
, from_tty
)
1879 char *exec_file
= get_exec_file (0);
1882 printf_unfiltered ("Detaching from program: %s %s\n",
1883 exec_file
, target_pid_to_str (inferior_pid
));
1884 gdb_flush (gdb_stdout
);
1887 siggnal
= atoi (args
);
1889 do_detach (siggnal
);
1891 unpush_target (&procfs_ops
); /* Pop out of handling an inferior */
1894 /* Get ready to modify the registers array. On machines which store
1895 individual registers, this doesn't need to do anything. On machines
1896 which store all the registers in one fell swoop, this makes sure
1897 that registers contains all the registers from the program being
1901 procfs_prepare_to_store ()
1903 #ifdef CHILD_PREPARE_TO_STORE
1904 CHILD_PREPARE_TO_STORE ();
1908 /* Print status information about what we're accessing. */
1911 procfs_files_info (ignore
)
1912 struct target_ops
*ignore
;
1914 printf_unfiltered ("\tUsing the running image of %s %s via /proc.\n",
1915 attach_flag
? "attached": "child", target_pid_to_str (inferior_pid
));
1920 procfs_open (arg
, from_tty
)
1924 error ("Use the \"run\" command to start a Unix child process.");
1931 do_attach -- attach to an already existing process
1935 int do_attach (int pid)
1939 Attach to an already existing process with the specified process
1940 id. If the process is not already stopped, query whether to
1945 The option of stopping at attach time is specific to the /proc
1946 versions of gdb. Versions using ptrace force the attachee
1947 to stop. (I have changed this version to do so, too. All you
1948 have to do is "continue" to make it go on. -- gnu@cygnus.com)
1957 struct procinfo
*pi
;
1959 pi
= (struct procinfo
*) xmalloc (sizeof (struct procinfo
));
1961 if (!open_proc_file (pid
, pi
, O_RDWR
))
1964 perror_with_name (pi
->pathname
);
1968 /* Add new process to process info list */
1970 pi
->next
= procinfo_list
;
1973 add_fd (pi
); /* Add to list for poll/select */
1975 /* Get current status of process and if it is not already stopped,
1976 then stop it. Remember whether or not it was stopped when we first
1979 if (ioctl (pi
->fd
, PIOCSTATUS
, &pi
->prstatus
) < 0)
1981 print_sys_errmsg (pi
->pathname
, errno
);
1982 close_proc_file (pi
);
1983 error ("PIOCSTATUS failed");
1985 if (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
))
1987 pi
->was_stopped
= 1;
1991 pi
->was_stopped
= 0;
1992 if (1 || query ("Process is currently running, stop it? "))
1994 /* Make it run again when we close it. */
1995 #if defined (PIOCSET) /* New method */
1999 result
= ioctl (pi
->fd
, PIOCSET
, &pr_flags
);
2002 #if defined (PIOCSRLC) /* Original method */
2003 result
= ioctl (pi
->fd
, PIOCSRLC
, 0);
2008 print_sys_errmsg (pi
->pathname
, errno
);
2009 close_proc_file (pi
);
2010 error ("PIOCSRLC or PIOCSET failed");
2012 if (ioctl (pi
->fd
, PIOCSTOP
, &pi
->prstatus
) < 0)
2014 print_sys_errmsg (pi
->pathname
, errno
);
2015 close_proc_file (pi
);
2016 error ("PIOCSTOP failed");
2018 pi
->nopass_next_sigstop
= 1;
2022 printf_unfiltered ("Ok, gdb will wait for %s to stop.\n", target_pid_to_str (pid
));
2026 /* Remember some things about the inferior that we will, or might, change
2027 so that we can restore them when we detach. */
2029 ioctl (pi
->fd
, PIOCGTRACE
, &pi
->saved_trace
);
2030 ioctl (pi
->fd
, PIOCGHOLD
, &pi
->saved_sighold
);
2031 ioctl (pi
->fd
, PIOCGFAULT
, &pi
->saved_fltset
);
2032 ioctl (pi
->fd
, PIOCGENTRY
, &pi
->saved_entryset
);
2033 ioctl (pi
->fd
, PIOCGEXIT
, &pi
->saved_exitset
);
2035 /* Set up trace and fault sets, as gdb expects them. */
2037 memset (&pi
->prrun
, 0, sizeof (pi
->prrun
));
2038 prfillset (&pi
->prrun
.pr_trace
);
2039 procfs_notice_signals (pid
);
2040 prfillset (&pi
->prrun
.pr_fault
);
2041 prdelset (&pi
->prrun
.pr_fault
, FLTPAGE
);
2042 if (ioctl (pi
->fd
, PIOCSFAULT
, &pi
->prrun
.pr_fault
))
2044 print_sys_errmsg ("PIOCSFAULT failed", errno
);
2046 if (ioctl (pi
->fd
, PIOCSTRACE
, &pi
->prrun
.pr_trace
))
2048 print_sys_errmsg ("PIOCSTRACE failed", errno
);
2058 do_detach -- detach from an attached-to process
2062 void do_detach (int signal)
2066 Detach from the current attachee.
2068 If signal is non-zero, the attachee is started running again and sent
2069 the specified signal.
2071 If signal is zero and the attachee was not already stopped when we
2072 attached to it, then we make it runnable again when we detach.
2074 Otherwise, we query whether or not to make the attachee runnable
2075 again, since we may simply want to leave it in the state it was in
2078 We report any problems, but do not consider them errors, since we
2079 MUST detach even if some things don't seem to go right. This may not
2080 be the ideal situation. (FIXME).
2088 struct procinfo
*pi
;
2090 pi
= current_procinfo
;
2094 set_proc_siginfo (pi
, signal
);
2096 if (ioctl (pi
->fd
, PIOCSEXIT
, &pi
->saved_exitset
) < 0)
2098 print_sys_errmsg (pi
->pathname
, errno
);
2099 printf_unfiltered ("PIOCSEXIT failed.\n");
2101 if (ioctl (pi
->fd
, PIOCSENTRY
, &pi
->saved_entryset
) < 0)
2103 print_sys_errmsg (pi
->pathname
, errno
);
2104 printf_unfiltered ("PIOCSENTRY failed.\n");
2106 if (ioctl (pi
->fd
, PIOCSTRACE
, &pi
->saved_trace
) < 0)
2108 print_sys_errmsg (pi
->pathname
, errno
);
2109 printf_unfiltered ("PIOCSTRACE failed.\n");
2111 if (ioctl (pi
->fd
, PIOCSHOLD
, &pi
->saved_sighold
) < 0)
2113 print_sys_errmsg (pi
->pathname
, errno
);
2114 printf_unfiltered ("PIOSCHOLD failed.\n");
2116 if (ioctl (pi
->fd
, PIOCSFAULT
, &pi
->saved_fltset
) < 0)
2118 print_sys_errmsg (pi
->pathname
, errno
);
2119 printf_unfiltered ("PIOCSFAULT failed.\n");
2121 if (ioctl (pi
->fd
, PIOCSTATUS
, &pi
->prstatus
) < 0)
2123 print_sys_errmsg (pi
->pathname
, errno
);
2124 printf_unfiltered ("PIOCSTATUS failed.\n");
2128 if (signal
|| (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
)))
2130 if (signal
|| !pi
->was_stopped
||
2131 query ("Was stopped when attached, make it runnable again? "))
2133 /* Clear any fault that might have stopped it. */
2134 if (ioctl (pi
->fd
, PIOCCFAULT
, 0))
2136 print_sys_errmsg (pi
->pathname
, errno
);
2137 printf_unfiltered ("PIOCCFAULT failed.\n");
2140 /* Make it run again when we close it. */
2141 #if defined (PIOCSET) /* New method */
2145 result
= ioctl (pi
->fd
, PIOCSET
, &pr_flags
);
2148 #if defined (PIOCSRLC) /* Original method */
2149 result
= ioctl (pi
->fd
, PIOCSRLC
, 0);
2154 print_sys_errmsg (pi
->pathname
, errno
);
2155 printf_unfiltered ("PIOCSRLC or PIOCSET failed.\n");
2160 close_proc_file (pi
);
2164 /* emulate wait() as much as possible.
2165 Wait for child to do something. Return pid of child, or -1 in case
2166 of error; store status in *OURSTATUS.
2168 Not sure why we can't
2169 just use wait(), but it seems to have problems when applied to a
2170 process being controlled with the /proc interface.
2172 We have a race problem here with no obvious solution. We need to let
2173 the inferior run until it stops on an event of interest, which means
2174 that we need to use the PIOCWSTOP ioctl. However, we cannot use this
2175 ioctl if the process is already stopped on something that is not an
2176 event of interest, or the call will hang indefinitely. Thus we first
2177 use PIOCSTATUS to see if the process is not stopped. If not, then we
2178 use PIOCWSTOP. But during the window between the two, if the process
2179 stops for any reason that is not an event of interest (such as a job
2180 control signal) then gdb will hang. One possible workaround is to set
2181 an alarm to wake up every minute of so and check to see if the process
2182 is still running, and if so, then reissue the PIOCWSTOP. But this is
2183 a real kludge, so has not been implemented. FIXME: investigate
2186 FIXME: Investigate why wait() seems to have problems with programs
2187 being control by /proc routines. */
2190 procfs_wait (pid
, ourstatus
)
2192 struct target_waitstatus
*ourstatus
;
2199 struct procinfo
*pi
;
2201 if (pid
!= -1) /* Non-specific process? */
2204 for (pi
= procinfo_list
; pi
; pi
= pi
->next
)
2216 for (pi
= procinfo_list
; pi
; pi
= pi
->next
)
2217 if (pi
->pid
== pid
&& pi
->had_event
)
2220 if (!pi
&& !checkerr
)
2223 if (!checkerr
&& !(pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
)))
2225 if (ioctl (pi
->fd
, PIOCWSTOP
, &pi
->prstatus
) < 0)
2232 if (errno
== ENOENT
)
2234 rtnval
= wait (&statval
);
2235 if (rtnval
!= inferior_pid
)
2237 print_sys_errmsg (pi
->pathname
, errno
);
2238 error ("PIOCWSTOP, wait failed, returned %d", rtnval
);
2244 print_sys_errmsg (pi
->pathname
, errno
);
2245 error ("PIOCSTATUS or PIOCWSTOP failed.");
2249 else if (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
))
2251 rtnval
= pi
->prstatus
.pr_pid
;
2252 why
= pi
->prstatus
.pr_why
;
2253 what
= pi
->prstatus
.pr_what
;
2258 statval
= (what
<< 8) | 0177;
2261 if (what
!= SYS_exit
)
2262 error ("PR_SYSENTRY, unknown system call %d", what
);
2264 pi
->prrun
.pr_flags
= PRCFAULT
;
2266 if (ioctl (pi
->fd
, PIOCRUN
, &pi
->prrun
) != 0)
2267 perror_with_name (pi
->pathname
);
2269 rtnval
= wait (&statval
);
2284 statval
= (SIGTRAP
<< 8) | 0177;
2288 /* We've just detected the completion of an sproc system call. Now we need to
2289 setup a procinfo struct for this thread, and notify the thread system of the
2292 /* If sproc failed, then nothing interesting happened. Continue the process and
2293 go back to sleep. */
2295 if (pi
->prstatus
.pr_errno
!= 0)
2297 pi
->prrun
.pr_flags
&= PRSTEP
;
2298 pi
->prrun
.pr_flags
|= PRCFAULT
;
2300 if (ioctl (pi
->fd
, PIOCRUN
, &pi
->prrun
) != 0)
2301 perror_with_name (pi
->pathname
);
2306 /* At this point, the new thread is stopped at it's first instruction, and
2307 the parent is stopped at the exit from sproc. */
2309 /* Notify the caller of the arrival of a new thread. */
2310 create_procinfo (pi
->prstatus
.pr_rval1
);
2312 rtnval
= pi
->prstatus
.pr_rval1
;
2313 statval
= (SIGTRAP
<< 8) | 0177;
2320 /* At this point, we've detected the completion of a fork (or vfork) call in
2321 our child. The grandchild is also stopped because we set inherit-on-fork
2322 earlier. (Note that nobody has the grandchilds' /proc file open at this
2323 point.) We will release the grandchild from the debugger by opening it's
2324 /proc file and then closing it. Since run-on-last-close is set, the
2325 grandchild continues on its' merry way. */
2328 struct procinfo
*pitemp
;
2330 pitemp
= create_procinfo (pi
->prstatus
.pr_rval1
);
2332 close_proc_file (pitemp
);
2334 if (ioctl (pi
->fd
, PIOCRUN
, &pi
->prrun
) != 0)
2335 perror_with_name (pi
->pathname
);
2338 #endif /* SYS_sproc */
2341 error ("PIOCSTATUS (PR_SYSEXIT): Unknown system call %d", what
);
2345 statval
= (SIGSTOP
<< 8) | 0177;
2348 statval
= (what
<< 8) | 0177;
2355 statval
= (SIGTRAP
<< 8) | 0177;
2360 statval
= (SIGTRAP
<< 8) | 0177;
2363 #ifndef FAULTED_USE_SIGINFO
2364 /* Irix, contrary to the documentation, fills in 0 for si_signo.
2365 Solaris fills in si_signo. I'm not sure about others. */
2368 statval
= (SIGILL
<< 8) | 0177;
2372 statval
= (SIGTRAP
<< 8) | 0177;
2377 statval
= (SIGSEGV
<< 8) | 0177;
2382 statval
= (SIGFPE
<< 8) | 0177;
2384 case FLTPAGE
: /* Recoverable page fault */
2385 #endif /* not FAULTED_USE_SIGINFO */
2387 /* Use the signal which the kernel assigns. This is better than
2388 trying to second-guess it from the fault. In fact, I suspect
2389 that FLTACCESS can be either SIGSEGV or SIGBUS. */
2390 statval
= ((pi
->prstatus
.pr_info
.si_signo
) << 8) | 0177;
2395 error ("PIOCWSTOP, unknown why %d, what %d", why
, what
);
2397 /* Stop all the other threads when any of them stops. */
2400 struct procinfo
*procinfo
;
2402 for (procinfo
= procinfo_list
; procinfo
; procinfo
= procinfo
->next
)
2404 if (!procinfo
->had_event
)
2405 if (ioctl (procinfo
->fd
, PIOCSTOP
, &procinfo
->prstatus
) < 0)
2407 print_sys_errmsg (procinfo
->pathname
, errno
);
2408 error ("PIOCSTOP failed");
2415 error ("PIOCWSTOP, stopped for unknown/unhandled reason, flags %#x",
2416 pi
->prstatus
.pr_flags
);
2419 store_waitstatus (ourstatus
, statval
);
2421 if (rtnval
== -1) /* No more children to wait for */
2423 fprintf_unfiltered (gdb_stderr
, "Child process unexpectedly missing.\n");
2424 /* Claim it exited with unknown signal. */
2425 ourstatus
->kind
= TARGET_WAITKIND_SIGNALLED
;
2426 ourstatus
->value
.sig
= TARGET_SIGNAL_UNKNOWN
;
2430 pi
->had_event
= 0; /* Indicate that we've seen this one */
2438 set_proc_siginfo - set a process's current signal info
2442 void set_proc_siginfo (struct procinfo *pip, int signo);
2446 Given a pointer to a process info struct in PIP and a signal number
2447 in SIGNO, set the process's current signal and its associated signal
2448 information. The signal will be delivered to the process immediately
2449 after execution is resumed, even if it is being held. In addition,
2450 this particular delivery will not cause another PR_SIGNALLED stop
2451 even if the signal is being traced.
2453 If we are not delivering the same signal that the prstatus siginfo
2454 struct contains information about, then synthesize a siginfo struct
2455 to match the signal we are doing to deliver, make it of the type
2456 "generated by a user process", and send this synthesized copy. When
2457 used to set the inferior's signal state, this will be required if we
2458 are not currently stopped because of a traced signal, or if we decide
2459 to continue with a different signal.
2461 Note that when continuing the inferior from a stop due to receipt
2462 of a traced signal, we either have set PRCSIG to clear the existing
2463 signal, or we have to call this function to do a PIOCSSIG with either
2464 the existing siginfo struct from pr_info, or one we have synthesized
2465 appropriately for the signal we want to deliver. Otherwise if the
2466 signal is still being traced, the inferior will immediately stop
2469 See siginfo(5) for more details.
2473 set_proc_siginfo (pip
, signo
)
2474 struct procinfo
*pip
;
2477 struct siginfo newsiginfo
;
2478 struct siginfo
*sip
;
2480 if (signo
== pip
-> prstatus
.pr_info
.si_signo
)
2482 sip
= &pip
-> prstatus
.pr_info
;
2486 memset ((char *) &newsiginfo
, 0, sizeof (newsiginfo
));
2488 sip
-> si_signo
= signo
;
2490 sip
-> si_errno
= 0;
2491 sip
-> si_pid
= getpid ();
2492 sip
-> si_uid
= getuid ();
2494 if (ioctl (pip
-> fd
, PIOCSSIG
, sip
) < 0)
2496 print_sys_errmsg (pip
-> pathname
, errno
);
2497 warning ("PIOCSSIG failed");
2501 /* Resume execution of process PID. If STEP is nozero, then
2502 just single step it. If SIGNAL is nonzero, restart it with that
2503 signal activated. */
2506 procfs_resume (pid
, step
, signo
)
2509 enum target_signal signo
;
2512 struct procinfo
*pi
, *procinfo
;
2514 pi
= find_procinfo (pid
== -1 ? inferior_pid
: pid
, 0);
2517 pi
->prrun
.pr_flags
= PRSTRACE
| PRSFAULT
| PRCFAULT
;
2520 /* It should not be necessary. If the user explicitly changes the value,
2521 value_assign calls write_register_bytes, which writes it. */
2522 /* It may not be absolutely necessary to specify the PC value for
2523 restarting, but to be safe we use the value that gdb considers
2524 to be current. One case where this might be necessary is if the
2525 user explicitly changes the PC value that gdb considers to be
2526 current. FIXME: Investigate if this is necessary or not. */
2528 #ifdef PRSVADDR_BROKEN
2529 /* Can't do this under Solaris running on a Sparc, as there seems to be no
2530 place to put nPC. In fact, if you use this, nPC seems to be set to some
2531 random garbage. We have to rely on the fact that PC and nPC have been
2532 written previously via PIOCSREG during a register flush. */
2534 pi
->prrun
.pr_vaddr
= (caddr_t
) *(int *) ®isters
[REGISTER_BYTE (PC_REGNUM
)];
2535 pi
->prrun
.pr_flags
!= PRSVADDR
;
2539 if (signo
== TARGET_SIGNAL_STOP
&& pi
->nopass_next_sigstop
)
2540 /* When attaching to a child process, if we forced it to stop with
2541 a PIOCSTOP, then we will have set the nopass_next_sigstop flag.
2542 Upon resuming the first time after such a stop, we explicitly
2543 inhibit sending it another SIGSTOP, which would be the normal
2544 result of default signal handling. One potential drawback to
2545 this is that we will also ignore any attempt to by the user
2546 to explicitly continue after the attach with a SIGSTOP. Ultimately
2547 this problem should be dealt with by making the routines that
2548 deal with the inferior a little smarter, and possibly even allow
2549 an inferior to continue running at the same time as gdb. (FIXME?) */
2551 else if (signo
== TARGET_SIGNAL_TSTP
2552 && pi
->prstatus
.pr_cursig
== SIGTSTP
2553 && pi
->prstatus
.pr_action
.sa_handler
== SIG_DFL
)
2555 /* We are about to pass the inferior a SIGTSTP whose action is
2556 SIG_DFL. The SIG_DFL action for a SIGTSTP is to stop
2557 (notifying the parent via wait()), and then keep going from the
2558 same place when the parent is ready for you to keep going. So
2559 under the debugger, it should do nothing (as if the program had
2560 been stopped and then later resumed. Under ptrace, this
2561 happens for us, but under /proc, the system obligingly stops
2562 the process, and wait_for_inferior would have no way of
2563 distinguishing that type of stop (which indicates that we
2564 should just start it again), with a stop due to the pr_trace
2565 field of the prrun_t struct.
2567 Note that if the SIGTSTP is being caught, we *do* need to pass it,
2568 because the handler needs to get executed. */
2571 signal_to_pass
= target_signal_to_host (signo
);
2575 set_proc_siginfo (pi
, signal_to_pass
);
2579 pi
->prrun
.pr_flags
|= PRCSIG
;
2581 pi
->nopass_next_sigstop
= 0;
2584 pi
->prrun
.pr_flags
|= PRSTEP
;
2586 if (ioctl (pi
->fd
, PIOCRUN
, &pi
->prrun
) != 0)
2588 perror_with_name (pi
->pathname
);
2594 /* Continue all the other threads that haven't had an event of
2598 for (procinfo
= procinfo_list
; procinfo
; procinfo
= procinfo
->next
)
2600 if (pi
!= procinfo
&& !procinfo
->had_event
)
2602 procinfo
->prrun
.pr_flags
&= PRSTEP
;
2603 procinfo
->prrun
.pr_flags
|= PRCFAULT
| PRCSIG
;
2604 ioctl (procinfo
->fd
, PIOCSTATUS
, &procinfo
->prstatus
);
2605 if (ioctl (procinfo
->fd
, PIOCRUN
, &procinfo
->prrun
) < 0)
2607 if (ioctl (procinfo
->fd
, PIOCSTATUS
, &procinfo
->prstatus
) < 0)
2609 fprintf_unfiltered(gdb_stderr
, "PIOCSTATUS failed, errno=%d\n", errno
);
2611 print_sys_errmsg (procinfo
->pathname
, errno
);
2612 error ("PIOCRUN failed");
2614 ioctl (procinfo
->fd
, PIOCSTATUS
, &procinfo
->prstatus
);
2623 procfs_fetch_registers -- fetch current registers from inferior
2627 void procfs_fetch_registers (int regno)
2631 Read the current values of the inferior's registers, both the
2632 general register set and floating point registers (if supported)
2633 and update gdb's idea of their current values.
2638 procfs_fetch_registers (regno
)
2641 struct procinfo
*pi
;
2643 pi
= current_procinfo
;
2645 if (ioctl (pi
->fd
, PIOCGREG
, &pi
->gregset
) != -1)
2647 supply_gregset (&pi
->gregset
);
2649 #if defined (FP0_REGNUM)
2650 if (ioctl (pi
->fd
, PIOCGFPREG
, &pi
->fpregset
) != -1)
2652 supply_fpregset (&pi
->fpregset
);
2661 proc_init_failed - called whenever /proc access initialization
2666 static void proc_init_failed (struct procinfo *pi, char *why)
2670 This function is called whenever initialization of access to a /proc
2671 entry fails. It prints a suitable error message, does some cleanup,
2672 and then invokes the standard error processing routine which dumps
2673 us back into the command loop.
2677 proc_init_failed (pi
, why
)
2678 struct procinfo
*pi
;
2681 print_sys_errmsg (pi
->pathname
, errno
);
2682 kill (pi
->pid
, SIGKILL
);
2683 close_proc_file (pi
);
2692 close_proc_file - close any currently open /proc entry
2696 static void close_proc_file (struct procinfo *pip)
2700 Close any currently open /proc entry and mark the process information
2701 entry as invalid. In order to ensure that we don't try to reuse any
2702 stale information, the pid, fd, and pathnames are explicitly
2703 invalidated, which may be overkill.
2708 close_proc_file (pip
)
2709 struct procinfo
*pip
;
2711 struct procinfo
*procinfo
;
2713 remove_fd (pip
); /* Remove fd from poll/select list */
2717 free (pip
-> pathname
);
2719 /* Unlink pip from the procinfo chain. Note pip might not be on the list. */
2721 if (procinfo_list
== pip
)
2722 procinfo_list
= pip
->next
;
2724 for (procinfo
= procinfo_list
; procinfo
; procinfo
= procinfo
->next
)
2725 if (procinfo
->next
== pip
)
2726 procinfo
->next
= pip
->next
;
2735 open_proc_file - open a /proc entry for a given process id
2739 static int open_proc_file (int pid, struct procinfo *pip, int mode)
2743 Given a process id and a mode, close the existing open /proc
2744 entry (if any) and open one for the new process id, in the
2745 specified mode. Once it is open, then mark the local process
2746 information structure as valid, which guarantees that the pid,
2747 fd, and pathname fields match an open /proc entry. Returns
2748 zero if the open fails, nonzero otherwise.
2750 Note that the pathname is left intact, even when the open fails,
2751 so that callers can use it to construct meaningful error messages
2752 rather than just "file open failed".
2756 open_proc_file (pid
, pip
, mode
)
2758 struct procinfo
*pip
;
2762 pip
-> had_event
= 0;
2763 pip
-> pathname
= xmalloc (32);
2766 sprintf (pip
-> pathname
, PROC_NAME_FMT
, pid
);
2767 if ((pip
-> fd
= open (pip
-> pathname
, mode
)) < 0)
2774 mappingflags (flags
)
2777 static char asciiflags
[8];
2779 strcpy (asciiflags
, "-------");
2780 #if defined (MA_PHYS)
2781 if (flags
& MA_PHYS
) asciiflags
[0] = 'd';
2783 if (flags
& MA_STACK
) asciiflags
[1] = 's';
2784 if (flags
& MA_BREAK
) asciiflags
[2] = 'b';
2785 if (flags
& MA_SHARED
) asciiflags
[3] = 's';
2786 if (flags
& MA_READ
) asciiflags
[4] = 'r';
2787 if (flags
& MA_WRITE
) asciiflags
[5] = 'w';
2788 if (flags
& MA_EXEC
) asciiflags
[6] = 'x';
2789 return (asciiflags
);
2793 info_proc_flags (pip
, summary
)
2794 struct procinfo
*pip
;
2797 struct trans
*transp
;
2799 printf_filtered ("%-32s", "Process status flags:");
2802 printf_filtered ("\n\n");
2804 for (transp
= pr_flag_table
; transp
-> name
!= NULL
; transp
++)
2806 if (pip
-> prstatus
.pr_flags
& transp
-> value
)
2810 printf_filtered ("%s ", transp
-> name
);
2814 printf_filtered ("\t%-16s %s.\n", transp
-> name
, transp
-> desc
);
2818 printf_filtered ("\n");
2822 info_proc_stop (pip
, summary
)
2823 struct procinfo
*pip
;
2826 struct trans
*transp
;
2830 why
= pip
-> prstatus
.pr_why
;
2831 what
= pip
-> prstatus
.pr_what
;
2833 if (pip
-> prstatus
.pr_flags
& PR_STOPPED
)
2835 printf_filtered ("%-32s", "Reason for stopping:");
2838 printf_filtered ("\n\n");
2840 for (transp
= pr_why_table
; transp
-> name
!= NULL
; transp
++)
2842 if (why
== transp
-> value
)
2846 printf_filtered ("%s ", transp
-> name
);
2850 printf_filtered ("\t%-16s %s.\n",
2851 transp
-> name
, transp
-> desc
);
2857 /* Use the pr_why field to determine what the pr_what field means, and
2858 print more information. */
2863 /* pr_what is unused for this case */
2869 printf_filtered ("%s ", signalname (what
));
2873 printf_filtered ("\t%-16s %s.\n", signalname (what
),
2874 safe_strsignal (what
));
2880 printf_filtered ("%s ", syscallname (what
));
2884 printf_filtered ("\t%-16s %s.\n", syscallname (what
),
2885 "Entered this system call");
2891 printf_filtered ("%s ", syscallname (what
));
2895 printf_filtered ("\t%-16s %s.\n", syscallname (what
),
2896 "Returned from this system call");
2902 printf_filtered ("%s ",
2903 lookupname (faults_table
, what
, "fault"));
2907 printf_filtered ("\t%-16s %s.\n",
2908 lookupname (faults_table
, what
, "fault"),
2909 lookupdesc (faults_table
, what
));
2913 printf_filtered ("\n");
2918 info_proc_siginfo (pip
, summary
)
2919 struct procinfo
*pip
;
2922 struct siginfo
*sip
;
2924 if ((pip
-> prstatus
.pr_flags
& PR_STOPPED
) &&
2925 (pip
-> prstatus
.pr_why
== PR_SIGNALLED
||
2926 pip
-> prstatus
.pr_why
== PR_FAULTED
))
2928 printf_filtered ("%-32s", "Additional signal/fault info:");
2929 sip
= &pip
-> prstatus
.pr_info
;
2932 printf_filtered ("%s ", signalname (sip
-> si_signo
));
2933 if (sip
-> si_errno
> 0)
2935 printf_filtered ("%s ", errnoname (sip
-> si_errno
));
2937 if (sip
-> si_code
<= 0)
2939 printf_filtered ("sent by %s, uid %d ",
2940 target_pid_to_str (sip
-> si_pid
),
2945 printf_filtered ("%s ", sigcodename (sip
));
2946 if ((sip
-> si_signo
== SIGILL
) ||
2947 (sip
-> si_signo
== SIGFPE
) ||
2948 (sip
-> si_signo
== SIGSEGV
) ||
2949 (sip
-> si_signo
== SIGBUS
))
2951 printf_filtered ("addr=%#x ", sip
-> si_addr
);
2953 else if ((sip
-> si_signo
== SIGCHLD
))
2955 printf_filtered ("child %s, status %u ",
2956 target_pid_to_str (sip
-> si_pid
),
2959 else if ((sip
-> si_signo
== SIGPOLL
))
2961 printf_filtered ("band %u ", sip
-> si_band
);
2967 printf_filtered ("\n\n");
2968 printf_filtered ("\t%-16s %s.\n", signalname (sip
-> si_signo
),
2969 safe_strsignal (sip
-> si_signo
));
2970 if (sip
-> si_errno
> 0)
2972 printf_filtered ("\t%-16s %s.\n",
2973 errnoname (sip
-> si_errno
),
2974 safe_strerror (sip
-> si_errno
));
2976 if (sip
-> si_code
<= 0)
2978 printf_filtered ("\t%-16u %s\n", sip
-> si_pid
, /* XXX need target_pid_to_str() */
2979 "PID of process sending signal");
2980 printf_filtered ("\t%-16u %s\n", sip
-> si_uid
,
2981 "UID of process sending signal");
2985 printf_filtered ("\t%-16s %s.\n", sigcodename (sip
),
2987 if ((sip
-> si_signo
== SIGILL
) ||
2988 (sip
-> si_signo
== SIGFPE
))
2990 printf_filtered ("\t%-16#x %s.\n", sip
-> si_addr
,
2991 "Address of faulting instruction");
2993 else if ((sip
-> si_signo
== SIGSEGV
) ||
2994 (sip
-> si_signo
== SIGBUS
))
2996 printf_filtered ("\t%-16#x %s.\n", sip
-> si_addr
,
2997 "Address of faulting memory reference");
2999 else if ((sip
-> si_signo
== SIGCHLD
))
3001 printf_filtered ("\t%-16u %s.\n", sip
-> si_pid
, /* XXX need target_pid_to_str() */
3002 "Child process ID");
3003 printf_filtered ("\t%-16u %s.\n", sip
-> si_status
,
3004 "Child process exit value or signal");
3006 else if ((sip
-> si_signo
== SIGPOLL
))
3008 printf_filtered ("\t%-16u %s.\n", sip
-> si_band
,
3009 "Band event for POLL_{IN,OUT,MSG}");
3013 printf_filtered ("\n");
3018 info_proc_syscalls (pip
, summary
)
3019 struct procinfo
*pip
;
3027 #if 0 /* FIXME: Needs to use gdb-wide configured info about system calls. */
3028 if (pip
-> prstatus
.pr_flags
& PR_ASLEEP
)
3030 int syscallnum
= pip
-> prstatus
.pr_reg
[R_D0
];
3033 printf_filtered ("%-32s", "Sleeping in system call:");
3034 printf_filtered ("%s", syscallname (syscallnum
));
3038 printf_filtered ("Sleeping in system call '%s'.\n",
3039 syscallname (syscallnum
));
3044 if (ioctl (pip
-> fd
, PIOCGENTRY
, &pip
-> entryset
) < 0)
3046 print_sys_errmsg (pip
-> pathname
, errno
);
3047 error ("PIOCGENTRY failed");
3050 if (ioctl (pip
-> fd
, PIOCGEXIT
, &pip
-> exitset
) < 0)
3052 print_sys_errmsg (pip
-> pathname
, errno
);
3053 error ("PIOCGEXIT failed");
3056 printf_filtered ("System call tracing information:\n\n");
3058 printf_filtered ("\t%-12s %-8s %-8s\n",
3062 for (syscallnum
= 0; syscallnum
< MAX_SYSCALLS
; syscallnum
++)
3065 if (syscall_table
[syscallnum
] != NULL
)
3067 printf_filtered ("\t%-12s ", syscall_table
[syscallnum
]);
3068 printf_filtered ("%-8s ",
3069 prismember (&pip
-> entryset
, syscallnum
)
3071 printf_filtered ("%-8s ",
3072 prismember (&pip
-> exitset
, syscallnum
)
3074 printf_filtered ("\n");
3077 printf_filtered ("\n");
3086 static char locbuf
[32];
3088 name
= strsigno (signo
);
3091 sprintf (locbuf
, "Signal %d", signo
);
3095 sprintf (locbuf
, "%s (%d)", name
, signo
);
3105 static char locbuf
[32];
3107 name
= strerrno (errnum
);
3110 sprintf (locbuf
, "Errno %d", errnum
);
3114 sprintf (locbuf
, "%s (%d)", name
, errnum
);
3120 info_proc_signals (pip
, summary
)
3121 struct procinfo
*pip
;
3128 if (ioctl (pip
-> fd
, PIOCGTRACE
, &pip
-> trace
) < 0)
3130 print_sys_errmsg (pip
-> pathname
, errno
);
3131 error ("PIOCGTRACE failed");
3134 printf_filtered ("Disposition of signals:\n\n");
3135 printf_filtered ("\t%-15s %-8s %-8s %-8s %s\n\n",
3136 "Signal", "Trace", "Hold", "Pending", "Description");
3137 for (signo
= 0; signo
< NSIG
; signo
++)
3140 printf_filtered ("\t%-15s ", signalname (signo
));
3141 printf_filtered ("%-8s ",
3142 prismember (&pip
-> trace
, signo
)
3144 printf_filtered ("%-8s ",
3145 prismember (&pip
-> prstatus
.pr_sighold
, signo
)
3147 printf_filtered ("%-8s ",
3148 prismember (&pip
-> prstatus
.pr_sigpend
, signo
)
3150 printf_filtered (" %s\n", safe_strsignal (signo
));
3152 printf_filtered ("\n");
3157 info_proc_faults (pip
, summary
)
3158 struct procinfo
*pip
;
3161 struct trans
*transp
;
3165 if (ioctl (pip
-> fd
, PIOCGFAULT
, &pip
-> fltset
) < 0)
3167 print_sys_errmsg (pip
-> pathname
, errno
);
3168 error ("PIOCGFAULT failed");
3171 printf_filtered ("Current traced hardware fault set:\n\n");
3172 printf_filtered ("\t%-12s %-8s\n", "Fault", "Trace");
3174 for (transp
= faults_table
; transp
-> name
!= NULL
; transp
++)
3177 printf_filtered ("\t%-12s ", transp
-> name
);
3178 printf_filtered ("%-8s", prismember (&pip
-> fltset
, transp
-> value
)
3180 printf_filtered ("\n");
3182 printf_filtered ("\n");
3187 info_proc_mappings (pip
, summary
)
3188 struct procinfo
*pip
;
3192 struct prmap
*prmaps
;
3193 struct prmap
*prmap
;
3197 printf_filtered ("Mapped address spaces:\n\n");
3198 printf_filtered ("\t%10s %10s %10s %10s %7s\n",
3204 if (ioctl (pip
-> fd
, PIOCNMAP
, &nmap
) == 0)
3206 prmaps
= (struct prmap
*) alloca ((nmap
+ 1) * sizeof (*prmaps
));
3207 if (ioctl (pip
-> fd
, PIOCMAP
, prmaps
) == 0)
3209 for (prmap
= prmaps
; prmap
-> pr_size
; ++prmap
)
3211 printf_filtered ("\t%#10x %#10x %#10x %#10x %7s\n",
3213 prmap
-> pr_vaddr
+ prmap
-> pr_size
- 1,
3216 mappingflags (prmap
-> pr_mflags
));
3220 printf_filtered ("\n");
3228 info_proc -- implement the "info proc" command
3232 void info_proc (char *args, int from_tty)
3236 Implement gdb's "info proc" command by using the /proc interface
3237 to print status information about any currently running process.
3239 Examples of the use of "info proc" are:
3241 info proc (prints summary info for current inferior)
3242 info proc 123 (prints summary info for process with pid 123)
3243 info proc mappings (prints address mappings)
3244 info proc times (prints process/children times)
3245 info proc id (prints pid, ppid, gid, sid, etc)
3246 FIXME: i proc id not implemented.
3247 info proc status (prints general process state info)
3248 FIXME: i proc status not implemented.
3249 info proc signals (prints info about signal handling)
3250 info proc all (prints all info)
3255 info_proc (args
, from_tty
)
3260 struct procinfo
*pip
;
3261 struct cleanup
*old_chain
;
3275 old_chain
= make_cleanup (null_cleanup
, 0);
3277 /* Default to using the current inferior if no pid specified. Note
3278 that inferior_pid may be 0, hence we set okerr. */
3280 pip
= find_procinfo (inferior_pid
, 1);
3284 if ((argv
= buildargv (args
)) == NULL
)
3288 make_cleanup (freeargv
, (char *) argv
);
3290 while (*argv
!= NULL
)
3292 argsize
= strlen (*argv
);
3293 if (argsize
>= 1 && strncmp (*argv
, "all", argsize
) == 0)
3298 else if (argsize
>= 2 && strncmp (*argv
, "faults", argsize
) == 0)
3303 else if (argsize
>= 2 && strncmp (*argv
, "flags", argsize
) == 0)
3308 else if (argsize
>= 1 && strncmp (*argv
, "id", argsize
) == 0)
3313 else if (argsize
>= 1 && strncmp (*argv
, "mappings", argsize
) == 0)
3318 else if (argsize
>= 2 && strncmp (*argv
, "signals", argsize
) == 0)
3323 else if (argsize
>= 2 && strncmp (*argv
, "status", argsize
) == 0)
3328 else if (argsize
>= 2 && strncmp (*argv
, "syscalls", argsize
) == 0)
3333 else if (argsize
>= 1 && strncmp (*argv
, "times", argsize
) == 0)
3338 else if ((pid
= atoi (*argv
)) > 0)
3340 pip
= (struct procinfo
*) xmalloc (sizeof (struct procinfo
));
3341 memset (pip
, 0, sizeof (*pip
));
3344 if (!open_proc_file (pid
, pip
, O_RDONLY
))
3346 perror_with_name (pip
-> pathname
);
3349 make_cleanup (close_proc_file
, pip
);
3351 else if (**argv
!= '\000')
3353 error ("Unrecognized or ambiguous keyword `%s'.", *argv
);
3359 /* If we don't have a valid open process at this point, then we have no
3360 inferior or didn't specify a specific pid. */
3365 No process. Start debugging a program or specify an explicit process ID.");
3367 if (ioctl (pip
-> fd
, PIOCSTATUS
, &(pip
-> prstatus
)) < 0)
3369 print_sys_errmsg (pip
-> pathname
, errno
);
3370 error ("PIOCSTATUS failed");
3373 /* Print verbose information of the requested type(s), or just a summary
3374 of the information for all types. */
3376 printf_filtered ("\nInformation for %s:\n\n", pip
-> pathname
);
3377 if (summary
|| all
|| flags
)
3379 info_proc_flags (pip
, summary
);
3383 info_proc_stop (pip
, summary
);
3385 if (summary
|| all
|| signals
|| faults
)
3387 info_proc_siginfo (pip
, summary
);
3389 if (summary
|| all
|| syscalls
)
3391 info_proc_syscalls (pip
, summary
);
3393 if (summary
|| all
|| mappings
)
3395 info_proc_mappings (pip
, summary
);
3397 if (summary
|| all
|| signals
)
3399 info_proc_signals (pip
, summary
);
3401 if (summary
|| all
|| faults
)
3403 info_proc_faults (pip
, summary
);
3405 printf_filtered ("\n");
3407 /* All done, deal with closing any temporary process info structure,
3408 freeing temporary memory , etc. */
3410 do_cleanups (old_chain
);
3417 procfs_set_sproc_trap -- arrange for child to stop on sproc().
3421 void procfs_set_sproc_trap (struct procinfo *)
3425 This function sets up a trap on sproc system call exits so that we can
3426 detect the arrival of a new thread. We are called with the new thread
3427 stopped prior to it's first instruction.
3429 Also note that we turn on the inherit-on-fork flag in the child process
3430 so that any grand-children start with all tracing flags set.
3436 procfs_set_sproc_trap (pi
)
3437 struct procinfo
*pi
;
3441 if (ioctl (pi
->fd
, PIOCGEXIT
, &exitset
) < 0)
3443 print_sys_errmsg (pi
->pathname
, errno
);
3444 error ("PIOCGEXIT failed");
3447 praddset (&exitset
, SYS_sproc
);
3449 /* We trap on fork() and vfork() in order to disable debugging in our grand-
3450 children and descendant processes. At this time, GDB can only handle
3451 threads (multiple processes, one address space). forks (and execs) result
3452 in the creation of multiple address spaces, which GDB can't handle yet. */
3454 praddset (&exitset
, SYS_fork
);
3456 praddset (&exitset
, SYS_vfork
);
3459 if (ioctl (pi
->fd
, PIOCSEXIT
, &exitset
) < 0)
3461 print_sys_errmsg (pi
->pathname
, errno
);
3462 error ("PIOCSEXIT failed");
3465 /* Turn on inherit-on-fork flag so that all grand-children of gdb start with
3466 tracing flags set. */
3468 #ifdef PIOCSET /* New method */
3472 ioctl (pi
->fd
, PIOCSET
, &pr_flags
);
3475 #ifdef PIOCSFORK /* Original method */
3476 ioctl (pi
->fd
, PIOCSFORK
, NULL
);
3480 #endif /* SYS_sproc */
3482 /* Fork an inferior process, and start debugging it with /proc. */
3485 procfs_create_inferior (exec_file
, allargs
, env
)
3490 char *shell_file
= getenv ("SHELL");
3492 if (shell_file
!= NULL
&& strchr (shell_file
, '/') == NULL
)
3495 /* We will be looking down the PATH to find shell_file. If we
3496 just do this the normal way (via execlp, which operates by
3497 attempting an exec for each element of the PATH until it
3498 finds one which succeeds), then there will be an exec for
3499 each failed attempt, each of which will cause a PR_SYSEXIT
3500 stop, and we won't know how to distinguish the PR_SYSEXIT's
3501 for these failed execs with the ones for successful execs
3502 (whether the exec has succeeded is stored at that time in the
3503 carry bit or some such architecture-specific and
3504 non-ABI-specified place).
3506 So I can't think of anything better than to search the PATH
3507 now. This has several disadvantages: (1) There is a race
3508 condition; if we find a file now and it is deleted before we
3509 exec it, we lose, even if the deletion leaves a valid file
3510 further down in the PATH, (2) there is no way to know exactly
3511 what an executable (in the sense of "capable of being
3512 exec'd") file is. Using access() loses because it may lose
3513 if the caller is the superuser; failing to use it loses if
3514 there are ACLs or some such. */
3518 /* FIXME-maybe: might want "set path" command so user can change what
3519 path is used from within GDB. */
3520 char *path
= getenv ("PATH");
3522 struct stat statbuf
;
3525 path
= "/bin:/usr/bin";
3527 tryname
= alloca (strlen (path
) + strlen (shell_file
) + 2);
3528 for (p
= path
; p
!= NULL
; p
= p1
? p1
+ 1: NULL
)
3530 p1
= strchr (p
, ':');
3535 strncpy (tryname
, p
, len
);
3536 tryname
[len
] = '\0';
3537 strcat (tryname
, "/");
3538 strcat (tryname
, shell_file
);
3539 if (access (tryname
, X_OK
) < 0)
3541 if (stat (tryname
, &statbuf
) < 0)
3543 if (!S_ISREG (statbuf
.st_mode
))
3544 /* We certainly need to reject directories. I'm not quite
3545 as sure about FIFOs, sockets, etc., but I kind of doubt
3546 that people want to exec() these things. */
3551 /* Not found. This must be an error rather than merely passing
3552 the file to execlp(), because execlp() would try all the
3553 exec()s, causing GDB to get confused. */
3554 error ("Can't find shell %s in PATH", shell_file
);
3556 shell_file
= tryname
;
3559 fork_inferior (exec_file
, allargs
, env
,
3560 proc_set_exec_trap
, procfs_init_inferior
, shell_file
);
3562 /* We are at the first instruction we care about. */
3563 /* Pedal to the metal... */
3565 /* Setup traps on exit from sproc() */
3568 procfs_set_sproc_trap (current_procinfo
);
3571 proceed ((CORE_ADDR
) -1, TARGET_SIGNAL_0
, 0);
3574 /* Clean up after the inferior dies. */
3577 procfs_mourn_inferior ()
3579 struct procinfo
*pi
;
3580 struct procinfo
*next_pi
;
3582 for (pi
= procinfo_list
; pi
; pi
= next_pi
)
3585 unconditionally_kill_inferior (pi
);
3588 unpush_target (&procfs_ops
);
3589 generic_mourn_inferior ();
3593 /* Mark our target-struct as eligible for stray "run" and "attach" commands. */
3599 #ifdef TARGET_CAN_USE_HARDWARE_WATCHPOINT
3601 /* Insert a watchpoint */
3603 procfs_set_watchpoint(pid
, addr
, len
, rw
)
3609 struct procinfo
*pi
;
3612 pi
= find_procinfo (pid
== -1 ? inferior_pid
: pid
, 0);
3613 wpt
.pr_vaddr
= (caddr_t
)addr
;
3615 wpt
.pr_wflags
= ((rw
& 1) ? MA_READ
: 0) | ((rw
& 2) ? MA_WRITE
: 0);
3616 if (ioctl (pi
->fd
, PIOCSWATCH
, &wpt
) < 0)
3620 /* Currently it sometimes happens that the same watchpoint gets
3621 deleted twice - don't die in this case (FIXME please) */
3622 if (errno
== ESRCH
&& len
== 0)
3624 print_sys_errmsg (pi
->pathname
, errno
);
3625 error ("PIOCSWATCH failed");
3631 procfs_stopped_by_watchpoint(pid
)
3634 struct procinfo
*pi
;
3638 pi
= find_procinfo (pid
== -1 ? inferior_pid
: pid
, 0);
3639 if (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
))
3641 why
= pi
->prstatus
.pr_why
;
3642 what
= pi
->prstatus
.pr_what
;
3643 if (why
== PR_FAULTED
3644 #if defined (FLTWATCH) && defined (FLTKWATCH)
3645 && (what
== FLTWATCH
) || (what
== FLTKWATCH
)
3648 && (what
== FLTWATCH
)
3651 && (what
== FLTKWATCH
)
3662 struct target_ops procfs_ops
= {
3663 "procfs", /* to_shortname */
3664 "Unix /proc child process", /* to_longname */
3665 "Unix /proc child process (started by the \"run\" command).", /* to_doc */
3666 procfs_open
, /* to_open */
3668 procfs_attach
, /* to_attach */
3669 procfs_detach
, /* to_detach */
3670 procfs_resume
, /* to_resume */
3671 procfs_wait
, /* to_wait */
3672 procfs_fetch_registers
, /* to_fetch_registers */
3673 procfs_store_registers
, /* to_store_registers */
3674 procfs_prepare_to_store
, /* to_prepare_to_store */
3675 procfs_xfer_memory
, /* to_xfer_memory */
3676 procfs_files_info
, /* to_files_info */
3677 memory_insert_breakpoint
, /* to_insert_breakpoint */
3678 memory_remove_breakpoint
, /* to_remove_breakpoint */
3679 terminal_init_inferior
, /* to_terminal_init */
3680 terminal_inferior
, /* to_terminal_inferior */
3681 terminal_ours_for_output
, /* to_terminal_ours_for_output */
3682 terminal_ours
, /* to_terminal_ours */
3683 child_terminal_info
, /* to_terminal_info */
3684 procfs_kill_inferior
, /* to_kill */
3686 0, /* to_lookup_symbol */
3687 procfs_create_inferior
, /* to_create_inferior */
3688 procfs_mourn_inferior
, /* to_mourn_inferior */
3689 procfs_can_run
, /* to_can_run */
3690 procfs_notice_signals
, /* to_notice_signals */
3691 process_stratum
, /* to_stratum */
3693 1, /* to_has_all_memory */
3694 1, /* to_has_memory */
3695 1, /* to_has_stack */
3696 1, /* to_has_registers */
3697 1, /* to_has_execution */
3699 0, /* sections_end */
3700 OPS_MAGIC
/* to_magic */
3704 _initialize_procfs ()
3706 add_target (&procfs_ops
);
3708 add_info ("proc", info_proc
,
3709 "Show process status information using /proc entry.\n\
3710 Specify process id or use current inferior by default.\n\
3711 Specify keywords for detailed information; default is summary.\n\
3712 Keywords are: `all', `faults', `flags', `id', `mappings', `signals',\n\
3713 `status', `syscalls', and `times'.\n\
3714 Unambiguous abbreviations may be used.");
3716 init_syscall_table ();