1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
2 Copyright 1991, 1992-96, 1997 Free Software Foundation, Inc.
3 Written by Fred Fish at Cygnus Support. Changes for sysv4.2mp procfs
4 compatibility by Geoffrey Noer at Cygnus Solutions.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
25 For information on the details of using /proc consult section proc(4)
26 in the UNIX System V Release 4 System Administrator's Reference Manual.
28 The general register and floating point register sets are manipulated
29 separately. This file makes the assumption that if FP0_REGNUM is
30 defined, then support for the floating point register set is desired,
31 regardless of whether or not the actual target has floating point hardware.
38 #include <sys/types.h>
40 #include <sys/fault.h>
41 #include <sys/syscall.h>
42 #include <sys/procfs.h>
45 #include "gdb_string.h"
55 #include "gdbthread.h"
57 /* the name of the proc status struct depends on the implementation */
59 typedef pstatus_t gdb_prstatus_t
;
61 typedef prstatus_t gdb_prstatus_t
;
64 #define MAX_SYSCALLS 256 /* Maximum number of syscalls for table */
66 /* proc name formats may vary depending on the proc implementation */
67 #ifdef HAVE_MULTIPLE_PROC_FDS
68 # ifndef CTL_PROC_NAME_FMT
69 # define CTL_PROC_NAME_FMT "/proc/%d/ctl"
70 # define AS_PROC_NAME_FMT "/proc/%d/as"
71 # define MAP_PROC_NAME_FMT "/proc/%d/map"
72 # define STATUS_PROC_NAME_FMT "/proc/%d/status"
74 #else /* HAVE_MULTIPLE_PROC_FDS */
75 # ifndef CTL_PROC_NAME_FMT
76 # define CTL_PROC_NAME_FMT "/proc/%05d"
77 # define AS_PROC_NAME_FMT "/proc/%05d"
78 # define MAP_PROC_NAME_FMT "/proc/%05d"
79 # define STATUS_PROC_NAME_FMT "/proc/%05d"
81 #endif /* HAVE_MULTIPLE_PROC_FDS */
83 #define MAX_PROC_NAME_SIZE sizeof("/proc/1234567890/status")
85 extern struct target_ops procfs_ops
; /* Forward declaration */
87 int procfs_suppress_run
= 0; /* Non-zero if procfs should pretend not to
88 be a runnable target. Used by targets
89 that can sit atop procfs, such as solaris
92 #if 1 /* FIXME: Gross and ugly hack to resolve coredep.c global */
93 CORE_ADDR kernel_u_addr
;
96 #ifdef BROKEN_SIGINFO_H /* Workaround broken SGS <sys/siginfo.h> */
98 #define si_pid _data._proc.pid
100 #define si_uid _data._proc._pdata._kill.uid
101 #endif /* BROKEN_SIGINFO_H */
103 /* Define structures for passing commands to /proc/pid/ctl file. Note that
104 while we create these for the PROCFS_USE_READ_WRITE world, we use them
105 and ignore the extra cmd int in other proc schemes.
107 /* generic ctl msg */
113 /* set general registers */
119 /* set fp registers */
125 /* set signals to be traced */
131 /* set faults to be traced */
137 /* set system calls to be traced */
143 /* set current signal to be traced */
149 /* All access to the inferior, either one started by gdb or one that has
150 been attached to, is controlled by an instance of a procinfo structure,
151 defined below. Since gdb currently only handles one inferior at a time,
152 the procinfo structure for the inferior is statically allocated and
153 only one exists at any given time. There is a separate procinfo
154 structure for use by the "info proc" command, so that we can print
155 useful information about any random process without interfering with
156 the inferior's procinfo information. */
159 struct procinfo
*next
;
160 int pid
; /* Process ID of inferior */
161 int ctl_fd
; /* File descriptor for /proc ctl file */
162 int status_fd
; /* File descriptor for /proc status file */
163 int as_fd
; /* File descriptor for /proc as file */
164 int map_fd
; /* File descriptor for /proc map file */
165 char *pathname
; /* Pathname to /proc entry */
166 int had_event
; /* poll/select says something happened */
167 int was_stopped
; /* Nonzero if was stopped prior to attach */
168 int nopass_next_sigstop
; /* Don't pass a sigstop on next resume */
169 #ifndef HAVE_NO_PRRUN_T
170 prrun_t prrun
; /* Control state when it is run */
172 gdb_prstatus_t prstatus
; /* Current process status info */
173 struct greg_ctl gregset
; /* General register set */
174 struct fpreg_ctl fpregset
; /* Floating point register set */
175 struct flt_ctl fltset
; /* Current traced hardware fault set */
176 struct sig_ctl trace
; /* Current traced signal set */
177 struct sys_ctl exitset
; /* Current traced system call exit set */
178 struct sys_ctl entryset
; /* Current traced system call entry set */
179 struct sig_ctl saved_sighold
; /* Saved held signal set */
180 struct flt_ctl saved_fltset
; /* Saved traced hardware fault set */
181 struct sig_ctl saved_trace
; /* Saved traced signal set */
182 struct sys_ctl saved_exitset
; /* Saved traced system call exit set */
183 struct sys_ctl saved_entryset
;/* Saved traced system call entry set */
184 int num_syscall_handlers
; /* Number of syscall trap handlers
185 currently installed */
186 /* Pointer to list of syscall trap handlers */
187 struct procfs_syscall_handler
*syscall_handlers
;
188 int new_child
; /* Non-zero if it's a new thread */
191 /* List of inferior process information */
192 static struct procinfo
*procinfo_list
= NULL
;
193 static struct pollfd
*poll_list
; /* pollfds used for waiting on /proc */
195 static int num_poll_list
= 0; /* Number of entries in poll_list */
197 /* Much of the information used in the /proc interface, particularly for
198 printing status information, is kept as tables of structures of the
199 following form. These tables can be used to map numeric values to
200 their symbolic names and to a string that describes their specific use. */
203 int value
; /* The numeric value */
204 char *name
; /* The equivalent symbolic value */
205 char *desc
; /* Short description of value */
208 /* Translate bits in the pr_flags member of the prstatus structure, into the
209 names and desc information. */
211 static struct trans pr_flag_table
[] =
213 #if defined (PR_STOPPED)
214 { PR_STOPPED
, "PR_STOPPED", "Process is stopped" },
216 #if defined (PR_ISTOP)
217 { PR_ISTOP
, "PR_ISTOP", "Stopped on an event of interest" },
219 #if defined (PR_DSTOP)
220 { PR_DSTOP
, "PR_DSTOP", "A stop directive is in effect" },
222 #if defined (PR_ASLEEP)
223 { PR_ASLEEP
, "PR_ASLEEP", "Sleeping in an interruptible system call" },
225 #if defined (PR_FORK)
226 { PR_FORK
, "PR_FORK", "Inherit-on-fork is in effect" },
229 { PR_RLC
, "PR_RLC", "Run-on-last-close is in effect" },
231 #if defined (PR_PTRACE)
232 { PR_PTRACE
, "PR_PTRACE", "Process is being controlled by ptrace" },
234 #if defined (PR_PCINVAL)
235 { PR_PCINVAL
, "PR_PCINVAL", "PC refers to an invalid virtual address" },
237 #if defined (PR_ISSYS)
238 { PR_ISSYS
, "PR_ISSYS", "Is a system process" },
240 #if defined (PR_STEP)
241 { PR_STEP
, "PR_STEP", "Process has single step pending" },
244 { PR_KLC
, "PR_KLC", "Kill-on-last-close is in effect" },
246 #if defined (PR_ASYNC)
247 { PR_ASYNC
, "PR_ASYNC", "Asynchronous stop is in effect" },
249 #if defined (PR_PCOMPAT)
250 { PR_PCOMPAT
, "PR_PCOMPAT", "Ptrace compatibility mode in effect" },
252 #if defined (PR_MSACCT)
253 { PR_MSACCT
, "PR_MSACCT", "Microstate accounting enabled" },
255 #if defined (PR_BPTADJ)
256 { PR_BPTADJ
, "PR_BPTADJ", "Breakpoint PC adjustment in effect" },
258 #if defined (PR_ASLWP)
259 { PR_ASLWP
, "PR_ASLWP", "Asynchronus signal LWP" },
264 /* Translate values in the pr_why field of the prstatus struct. */
266 static struct trans pr_why_table
[] =
268 #if defined (PR_REQUESTED)
269 { PR_REQUESTED
, "PR_REQUESTED", "Directed to stop via PIOCSTOP/PIOCWSTOP" },
271 #if defined (PR_SIGNALLED)
272 { PR_SIGNALLED
, "PR_SIGNALLED", "Receipt of a traced signal" },
274 #if defined (PR_SYSENTRY)
275 { PR_SYSENTRY
, "PR_SYSENTRY", "Entry to a traced system call" },
277 #if defined (PR_SYSEXIT)
278 { PR_SYSEXIT
, "PR_SYSEXIT", "Exit from a traced system call" },
280 #if defined (PR_JOBCONTROL)
281 { PR_JOBCONTROL
, "PR_JOBCONTROL", "Default job control stop signal action" },
283 #if defined (PR_FAULTED)
284 { PR_FAULTED
, "PR_FAULTED", "Incurred a traced hardware fault" },
286 #if defined (PR_SUSPENDED)
287 { PR_SUSPENDED
, "PR_SUSPENDED", "Process suspended" },
289 #if defined (PR_CHECKPOINT)
290 { PR_CHECKPOINT
, "PR_CHECKPOINT", "(???)" },
295 /* Hardware fault translation table. */
297 static struct trans faults_table
[] =
300 { FLTILL
, "FLTILL", "Illegal instruction" },
302 #if defined (FLTPRIV)
303 { FLTPRIV
, "FLTPRIV", "Privileged instruction" },
306 { FLTBPT
, "FLTBPT", "Breakpoint trap" },
308 #if defined (FLTTRACE)
309 { FLTTRACE
, "FLTTRACE", "Trace trap" },
311 #if defined (FLTACCESS)
312 { FLTACCESS
, "FLTACCESS", "Memory access fault" },
314 #if defined (FLTBOUNDS)
315 { FLTBOUNDS
, "FLTBOUNDS", "Memory bounds violation" },
317 #if defined (FLTIOVF)
318 { FLTIOVF
, "FLTIOVF", "Integer overflow" },
320 #if defined (FLTIZDIV)
321 { FLTIZDIV
, "FLTIZDIV", "Integer zero divide" },
324 { FLTFPE
, "FLTFPE", "Floating-point exception" },
326 #if defined (FLTSTACK)
327 { FLTSTACK
, "FLTSTACK", "Unrecoverable stack fault" },
329 #if defined (FLTPAGE)
330 { FLTPAGE
, "FLTPAGE", "Recoverable page fault" },
335 /* Translation table for signal generation information. See UNIX System
336 V Release 4 Programmer's Reference Manual, siginfo(5). */
338 static struct sigcode
{
343 } siginfo_table
[] = {
344 #if defined (SIGILL) && defined (ILL_ILLOPC)
345 { SIGILL
, ILL_ILLOPC
, "ILL_ILLOPC", "Illegal opcode" },
347 #if defined (SIGILL) && defined (ILL_ILLOPN)
348 { SIGILL
, ILL_ILLOPN
, "ILL_ILLOPN", "Illegal operand", },
350 #if defined (SIGILL) && defined (ILL_ILLADR)
351 { SIGILL
, ILL_ILLADR
, "ILL_ILLADR", "Illegal addressing mode" },
353 #if defined (SIGILL) && defined (ILL_ILLTRP)
354 { SIGILL
, ILL_ILLTRP
, "ILL_ILLTRP", "Illegal trap" },
356 #if defined (SIGILL) && defined (ILL_PRVOPC)
357 { SIGILL
, ILL_PRVOPC
, "ILL_PRVOPC", "Privileged opcode" },
359 #if defined (SIGILL) && defined (ILL_PRVREG)
360 { SIGILL
, ILL_PRVREG
, "ILL_PRVREG", "Privileged register" },
362 #if defined (SIGILL) && defined (ILL_COPROC)
363 { SIGILL
, ILL_COPROC
, "ILL_COPROC", "Coprocessor error" },
365 #if defined (SIGILL) && defined (ILL_BADSTK)
366 { SIGILL
, ILL_BADSTK
, "ILL_BADSTK", "Internal stack error" },
368 #if defined (SIGFPE) && defined (FPE_INTDIV)
369 { SIGFPE
, FPE_INTDIV
, "FPE_INTDIV", "Integer divide by zero" },
371 #if defined (SIGFPE) && defined (FPE_INTOVF)
372 { SIGFPE
, FPE_INTOVF
, "FPE_INTOVF", "Integer overflow" },
374 #if defined (SIGFPE) && defined (FPE_FLTDIV)
375 { SIGFPE
, FPE_FLTDIV
, "FPE_FLTDIV", "Floating point divide by zero" },
377 #if defined (SIGFPE) && defined (FPE_FLTOVF)
378 { SIGFPE
, FPE_FLTOVF
, "FPE_FLTOVF", "Floating point overflow" },
380 #if defined (SIGFPE) && defined (FPE_FLTUND)
381 { SIGFPE
, FPE_FLTUND
, "FPE_FLTUND", "Floating point underflow" },
383 #if defined (SIGFPE) && defined (FPE_FLTRES)
384 { SIGFPE
, FPE_FLTRES
, "FPE_FLTRES", "Floating point inexact result" },
386 #if defined (SIGFPE) && defined (FPE_FLTINV)
387 { SIGFPE
, FPE_FLTINV
, "FPE_FLTINV", "Invalid floating point operation" },
389 #if defined (SIGFPE) && defined (FPE_FLTSUB)
390 { SIGFPE
, FPE_FLTSUB
, "FPE_FLTSUB", "Subscript out of range" },
392 #if defined (SIGSEGV) && defined (SEGV_MAPERR)
393 { SIGSEGV
, SEGV_MAPERR
, "SEGV_MAPERR", "Address not mapped to object" },
395 #if defined (SIGSEGV) && defined (SEGV_ACCERR)
396 { SIGSEGV
, SEGV_ACCERR
, "SEGV_ACCERR", "Invalid permissions for object" },
398 #if defined (SIGBUS) && defined (BUS_ADRALN)
399 { SIGBUS
, BUS_ADRALN
, "BUS_ADRALN", "Invalid address alignment" },
401 #if defined (SIGBUS) && defined (BUS_ADRERR)
402 { SIGBUS
, BUS_ADRERR
, "BUS_ADRERR", "Non-existent physical address" },
404 #if defined (SIGBUS) && defined (BUS_OBJERR)
405 { SIGBUS
, BUS_OBJERR
, "BUS_OBJERR", "Object specific hardware error" },
407 #if defined (SIGTRAP) && defined (TRAP_BRKPT)
408 { SIGTRAP
, TRAP_BRKPT
, "TRAP_BRKPT", "Process breakpoint" },
410 #if defined (SIGTRAP) && defined (TRAP_TRACE)
411 { SIGTRAP
, TRAP_TRACE
, "TRAP_TRACE", "Process trace trap" },
413 #if defined (SIGCLD) && defined (CLD_EXITED)
414 { SIGCLD
, CLD_EXITED
, "CLD_EXITED", "Child has exited" },
416 #if defined (SIGCLD) && defined (CLD_KILLED)
417 { SIGCLD
, CLD_KILLED
, "CLD_KILLED", "Child was killed" },
419 #if defined (SIGCLD) && defined (CLD_DUMPED)
420 { SIGCLD
, CLD_DUMPED
, "CLD_DUMPED", "Child has terminated abnormally" },
422 #if defined (SIGCLD) && defined (CLD_TRAPPED)
423 { SIGCLD
, CLD_TRAPPED
, "CLD_TRAPPED", "Traced child has trapped" },
425 #if defined (SIGCLD) && defined (CLD_STOPPED)
426 { SIGCLD
, CLD_STOPPED
, "CLD_STOPPED", "Child has stopped" },
428 #if defined (SIGCLD) && defined (CLD_CONTINUED)
429 { SIGCLD
, CLD_CONTINUED
, "CLD_CONTINUED", "Stopped child had continued" },
431 #if defined (SIGPOLL) && defined (POLL_IN)
432 { SIGPOLL
, POLL_IN
, "POLL_IN", "Input input available" },
434 #if defined (SIGPOLL) && defined (POLL_OUT)
435 { SIGPOLL
, POLL_OUT
, "POLL_OUT", "Output buffers available" },
437 #if defined (SIGPOLL) && defined (POLL_MSG)
438 { SIGPOLL
, POLL_MSG
, "POLL_MSG", "Input message available" },
440 #if defined (SIGPOLL) && defined (POLL_ERR)
441 { SIGPOLL
, POLL_ERR
, "POLL_ERR", "I/O error" },
443 #if defined (SIGPOLL) && defined (POLL_PRI)
444 { SIGPOLL
, POLL_PRI
, "POLL_PRI", "High priority input available" },
446 #if defined (SIGPOLL) && defined (POLL_HUP)
447 { SIGPOLL
, POLL_HUP
, "POLL_HUP", "Device disconnected" },
452 static char *syscall_table
[MAX_SYSCALLS
];
454 /* Prototypes for local functions */
456 static void procfs_stop
PARAMS ((void));
458 static int procfs_thread_alive
PARAMS ((int));
460 static int procfs_can_run
PARAMS ((void));
462 static void procfs_mourn_inferior
PARAMS ((void));
464 static void procfs_fetch_registers
PARAMS ((int));
466 static int procfs_wait
PARAMS ((int, struct target_waitstatus
*));
468 static void procfs_open
PARAMS ((char *, int));
470 static void procfs_files_info
PARAMS ((struct target_ops
*));
472 static void procfs_prepare_to_store
PARAMS ((void));
474 static void procfs_detach
PARAMS ((char *, int));
476 static void procfs_attach
PARAMS ((char *, int));
478 static void proc_set_exec_trap
PARAMS ((void));
480 static int procfs_init_inferior
PARAMS ((int));
482 static struct procinfo
*create_procinfo
PARAMS ((int));
484 static void procfs_store_registers
PARAMS ((int));
486 static int procfs_xfer_memory
PARAMS ((CORE_ADDR
, char *, int, int, struct target_ops
*));
488 static void procfs_kill_inferior
PARAMS ((void));
490 static char *sigcodedesc
PARAMS ((siginfo_t
*));
492 static char *sigcodename
PARAMS ((siginfo_t
*));
494 static struct procinfo
*wait_fd
PARAMS ((void));
496 static void remove_fd
PARAMS ((struct procinfo
*));
498 static void add_fd
PARAMS ((struct procinfo
*));
500 static void set_proc_siginfo
PARAMS ((struct procinfo
*, int));
502 static void init_syscall_table
PARAMS ((void));
504 static char *syscallname
PARAMS ((int));
506 static char *signalname
PARAMS ((int));
508 static char *errnoname
PARAMS ((int));
510 static int proc_address_to_fd
PARAMS ((struct procinfo
*, CORE_ADDR
, int));
512 static int open_proc_file
PARAMS ((int, struct procinfo
*, int, int));
514 static void close_proc_file
PARAMS ((struct procinfo
*));
516 static void unconditionally_kill_inferior
PARAMS ((struct procinfo
*));
518 static NORETURN
void proc_init_failed
PARAMS ((struct procinfo
*, char *, int)) ATTR_NORETURN
;
520 static void info_proc
PARAMS ((char *, int));
522 static void info_proc_flags
PARAMS ((struct procinfo
*, int));
524 static void info_proc_stop
PARAMS ((struct procinfo
*, int));
526 static void info_proc_siginfo
PARAMS ((struct procinfo
*, int));
528 static void info_proc_syscalls
PARAMS ((struct procinfo
*, int));
530 static void info_proc_mappings
PARAMS ((struct procinfo
*, int));
532 static void info_proc_signals
PARAMS ((struct procinfo
*, int));
534 static void info_proc_faults
PARAMS ((struct procinfo
*, int));
536 static char *mappingflags
PARAMS ((long));
538 static char *lookupname
PARAMS ((struct trans
*, unsigned int, char *));
540 static char *lookupdesc
PARAMS ((struct trans
*, unsigned int));
542 static int do_attach
PARAMS ((int pid
));
544 static void do_detach
PARAMS ((int siggnal
));
546 static void procfs_create_inferior
PARAMS ((char *, char *, char **));
548 static void procfs_notice_signals
PARAMS ((int pid
));
550 static void notice_signals
PARAMS ((struct procinfo
*, struct sig_ctl
*));
552 static struct procinfo
*find_procinfo
PARAMS ((pid_t pid
, int okfail
));
554 static int procfs_write_pcwstop
PARAMS ((struct procinfo
*));
555 static int procfs_read_status
PARAMS ((struct procinfo
*));
556 static void procfs_write_pckill
PARAMS ((struct procinfo
*));
558 typedef int syscall_func_t
PARAMS ((struct procinfo
*pi
, int syscall_num
,
559 int why
, int *rtnval
, int *statval
));
561 static void procfs_set_syscall_trap
PARAMS ((struct procinfo
*pi
,
562 int syscall_num
, int flags
,
563 syscall_func_t
*func
));
565 static void procfs_clear_syscall_trap
PARAMS ((struct procinfo
*pi
,
566 int syscall_num
, int errok
));
568 #define PROCFS_SYSCALL_ENTRY 0x1 /* Trap on entry to sys call */
569 #define PROCFS_SYSCALL_EXIT 0x2 /* Trap on exit from sys call */
571 static syscall_func_t procfs_exit_handler
;
573 static syscall_func_t procfs_exec_handler
;
576 static syscall_func_t procfs_sproc_handler
;
577 static syscall_func_t procfs_fork_handler
;
580 #ifdef SYS_lwp_create
581 static syscall_func_t procfs_lwp_creation_handler
;
584 static void modify_inherit_on_fork_flag
PARAMS ((int fd
, int flag
));
585 static void modify_run_on_last_close_flag
PARAMS ((int fd
, int flag
));
589 struct procfs_syscall_handler
591 int syscall_num
; /* The number of the system call being handled */
592 /* The function to be called */
593 syscall_func_t
*func
;
596 static void procfs_resume
PARAMS ((int pid
, int step
,
597 enum target_signal signo
));
599 /* External function prototypes that can't be easily included in any
600 header file because the args are typedefs in system include files. */
602 extern void supply_gregset
PARAMS ((gregset_t
*));
604 extern void fill_gregset
PARAMS ((gregset_t
*, int));
607 extern void supply_fpregset
PARAMS ((fpregset_t
*));
609 extern void fill_fpregset
PARAMS ((fpregset_t
*, int));
616 find_procinfo -- convert a process id to a struct procinfo
620 static struct procinfo * find_procinfo (pid_t pid, int okfail);
624 Given a process id, look it up in the procinfo chain. Returns
625 a struct procinfo *. If can't find pid, then call error(),
626 unless okfail is set, in which case, return NULL;
629 static struct procinfo
*
630 find_procinfo (pid
, okfail
)
634 struct procinfo
*procinfo
;
636 for (procinfo
= procinfo_list
; procinfo
; procinfo
= procinfo
->next
)
637 if (procinfo
->pid
== pid
)
643 error ("procfs (find_procinfo): Couldn't locate pid %d", pid
);
650 current_procinfo -- convert inferior_pid to a struct procinfo
654 static struct procinfo * current_procinfo;
658 Looks up inferior_pid in the procinfo chain. Always returns a
659 struct procinfo *. If process can't be found, we error() out.
662 #define current_procinfo find_procinfo (inferior_pid, 0)
668 add_fd -- Add the fd to the poll/select list
672 static void add_fd (struct procinfo *);
676 Add the fd of the supplied procinfo to the list of fds used for
677 poll/select operations.
684 if (num_poll_list
<= 0)
685 poll_list
= (struct pollfd
*) xmalloc (sizeof (struct pollfd
));
687 poll_list
= (struct pollfd
*) xrealloc (poll_list
,
689 * sizeof (struct pollfd
));
690 poll_list
[num_poll_list
].fd
= pi
->ctl_fd
;
692 poll_list
[num_poll_list
].events
= POLLWRNORM
;
694 poll_list
[num_poll_list
].events
= POLLPRI
;
704 remove_fd -- Remove the fd from the poll/select list
708 static void remove_fd (struct procinfo *);
712 Remove the fd of the supplied procinfo from the list of fds used
713 for poll/select operations.
722 for (i
= 0; i
< num_poll_list
; i
++)
724 if (poll_list
[i
].fd
== pi
->ctl_fd
)
726 if (i
!= num_poll_list
- 1)
727 memcpy (poll_list
+ i
, poll_list
+ i
+ 1,
728 (num_poll_list
- i
- 1) * sizeof (struct pollfd
));
732 if (num_poll_list
== 0)
735 poll_list
= (struct pollfd
*) xrealloc (poll_list
,
737 * sizeof (struct pollfd
));
747 procfs_read_status - get procfs fd status
751 static int procfs_read_status (pi) struct procinfo *pi;
755 Given a pointer to a procinfo struct, get the status of
756 the status_fd in the appropriate way. Returns 0 on failure,
761 procfs_read_status (pi
)
764 #ifdef PROCFS_USE_READ_WRITE
765 if ((lseek (pi
->status_fd
, 0, SEEK_SET
) < 0) ||
766 (read (pi
->status_fd
, (char *) &pi
->prstatus
,
767 sizeof (gdb_prstatus_t
)) != sizeof (gdb_prstatus_t
)))
769 if (ioctl (pi
->status_fd
, PIOCSTATUS
, &pi
->prstatus
) < 0)
780 procfs_write_pcwstop - send a PCWSTOP to procfs fd
784 static int procfs_write_pcwstop (pi) struct procinfo *pi;
788 Given a pointer to a procinfo struct, send a PCWSTOP to
789 the ctl_fd in the appropriate way. Returns 0 on failure,
794 procfs_write_pcwstop (pi
)
797 #ifdef PROCFS_USE_READ_WRITE
799 if (write (pi
->ctl_fd
, (char *) &cmd
, sizeof (long)) < 0)
801 if (ioctl (pi
->ctl_fd
, PIOCWSTOP
, &pi
->prstatus
) < 0)
812 procfs_write_pckill - send a kill to procfs fd
816 static void procfs_write_pckill (pi) struct procinfo *pi;
820 Given a pointer to a procinfo struct, send a kill to
821 the ctl_fd in the appropriate way. Returns 0 on failure,
826 procfs_write_pckill (pi
)
829 #ifdef PROCFS_USE_READ_WRITE
830 struct proc_ctl pctl
;
833 write (pi
->ctl_fd
, &pctl
, sizeof (struct proc_ctl
));
836 ioctl (pi
->ctl_fd
, PIOCKILL
, &signo
);
840 static struct procinfo
*
849 set_sigint_trap (); /* Causes SIGINT to be passed on to the
856 num_fds
= poll (poll_list
, num_poll_list
, -1);
859 if (num_fds
< 0 && errno
== EINTR
)
861 print_sys_errmsg ("poll failed", errno
);
862 error ("Poll failed, returned %d", num_fds
);
864 #else /* LOSING_POLL */
865 pi
= current_procinfo
;
867 while (!procfs_write_pcwstop (pi
))
871 /* Process exited. */
872 pi
->prstatus
.pr_flags
= 0;
875 else if (errno
!= EINTR
)
877 print_sys_errmsg (pi
->pathname
, errno
);
878 error ("procfs_write_pcwstop failed");
882 #endif /* LOSING_POLL */
884 clear_sigint_trap ();
889 for (i
= 0; i
< num_poll_list
&& num_fds
> 0; i
++)
891 if (0 == (poll_list
[i
].revents
&
892 (POLLWRNORM
| POLLPRI
| POLLERR
| POLLHUP
| POLLNVAL
)))
894 for (pi
= procinfo_list
; pi
; pi
= pi
->next
)
896 if (poll_list
[i
].fd
== pi
->ctl_fd
)
898 if (!procfs_read_status(pi
))
900 /* The LWP has apparently terminated. */
902 printf_filtered ("LWP %d doesn't respond.\n",
903 (pi
->pid
>> 16) & 0xffff);
904 /* could call close_proc_file here, but I'm afraid to... */
913 error ("wait_fd: Couldn't find procinfo for fd %d\n",
916 #endif /* LOSING_POLL */
925 lookupdesc -- translate a value to a summary desc string
929 static char *lookupdesc (struct trans *transp, unsigned int val);
933 Given a pointer to a translation table and a value to be translated,
934 lookup the desc string and return it.
938 lookupdesc (transp
, val
)
939 struct trans
*transp
;
944 for (desc
= NULL
; transp
-> name
!= NULL
; transp
++)
946 if (transp
-> value
== val
)
948 desc
= transp
-> desc
;
953 /* Didn't find a translation for the specified value, set a default one. */
966 lookupname -- translate a value to symbolic name
970 static char *lookupname (struct trans *transp, unsigned int val,
975 Given a pointer to a translation table, a value to be translated,
976 and a default prefix to return if the value can't be translated,
977 match the value with one of the translation table entries and
978 return a pointer to the symbolic name.
980 If no match is found it just returns the value as a printable string,
981 with the given prefix. The previous such value, if any, is freed
986 lookupname (transp
, val
, prefix
)
987 struct trans
*transp
;
994 for (name
= NULL
; transp
-> name
!= NULL
; transp
++)
996 if (transp
-> value
== val
)
998 name
= transp
-> name
;
1003 /* Didn't find a translation for the specified value, build a default
1004 one using the specified prefix and return it. The lifetime of
1005 the value is only until the next one is needed. */
1013 locbuf
= xmalloc (strlen (prefix
) + 16);
1014 sprintf (locbuf
, "%s %u", prefix
, val
);
1024 struct sigcode
*scp
;
1026 static char locbuf
[32];
1028 for (scp
= siginfo_table
; scp
-> codename
!= NULL
; scp
++)
1030 if ((scp
-> signo
== sip
-> si_signo
) &&
1031 (scp
-> code
== sip
-> si_code
))
1033 name
= scp
-> codename
;
1039 sprintf (locbuf
, "sigcode %u", sip
-> si_signo
);
1049 struct sigcode
*scp
;
1052 for (scp
= siginfo_table
; scp
-> codename
!= NULL
; scp
++)
1054 if ((scp
-> signo
== sip
-> si_signo
) &&
1055 (scp
-> code
== sip
-> si_code
))
1063 desc
= "Unrecognized signal or trap use";
1072 syscallname - translate a system call number into a system call name
1076 char *syscallname (int syscallnum)
1080 Given a system call number, translate it into the printable name
1081 of a system call, or into "syscall <num>" if it is an unknown
1086 syscallname (syscallnum
)
1089 static char locbuf
[32];
1091 if (syscallnum
>= 0 && syscallnum
< MAX_SYSCALLS
1092 && syscall_table
[syscallnum
] != NULL
)
1093 return syscall_table
[syscallnum
];
1096 sprintf (locbuf
, "syscall %u", syscallnum
);
1105 init_syscall_table - initialize syscall translation table
1109 void init_syscall_table (void)
1113 Dynamically initialize the translation table to convert system
1114 call numbers into printable system call names. Done once per
1115 gdb run, on initialization.
1119 This is awfully ugly, but preprocessor tricks to make it prettier
1120 tend to be nonportable.
1124 init_syscall_table ()
1126 #if defined (SYS_exit)
1127 syscall_table
[SYS_exit
] = "exit";
1129 #if defined (SYS_fork)
1130 syscall_table
[SYS_fork
] = "fork";
1132 #if defined (SYS_read)
1133 syscall_table
[SYS_read
] = "read";
1135 #if defined (SYS_write)
1136 syscall_table
[SYS_write
] = "write";
1138 #if defined (SYS_open)
1139 syscall_table
[SYS_open
] = "open";
1141 #if defined (SYS_close)
1142 syscall_table
[SYS_close
] = "close";
1144 #if defined (SYS_wait)
1145 syscall_table
[SYS_wait
] = "wait";
1147 #if defined (SYS_creat)
1148 syscall_table
[SYS_creat
] = "creat";
1150 #if defined (SYS_link)
1151 syscall_table
[SYS_link
] = "link";
1153 #if defined (SYS_unlink)
1154 syscall_table
[SYS_unlink
] = "unlink";
1156 #if defined (SYS_exec)
1157 syscall_table
[SYS_exec
] = "exec";
1159 #if defined (SYS_execv)
1160 syscall_table
[SYS_execv
] = "execv";
1162 #if defined (SYS_execve)
1163 syscall_table
[SYS_execve
] = "execve";
1165 #if defined (SYS_chdir)
1166 syscall_table
[SYS_chdir
] = "chdir";
1168 #if defined (SYS_time)
1169 syscall_table
[SYS_time
] = "time";
1171 #if defined (SYS_mknod)
1172 syscall_table
[SYS_mknod
] = "mknod";
1174 #if defined (SYS_chmod)
1175 syscall_table
[SYS_chmod
] = "chmod";
1177 #if defined (SYS_chown)
1178 syscall_table
[SYS_chown
] = "chown";
1180 #if defined (SYS_brk)
1181 syscall_table
[SYS_brk
] = "brk";
1183 #if defined (SYS_stat)
1184 syscall_table
[SYS_stat
] = "stat";
1186 #if defined (SYS_lseek)
1187 syscall_table
[SYS_lseek
] = "lseek";
1189 #if defined (SYS_getpid)
1190 syscall_table
[SYS_getpid
] = "getpid";
1192 #if defined (SYS_mount)
1193 syscall_table
[SYS_mount
] = "mount";
1195 #if defined (SYS_umount)
1196 syscall_table
[SYS_umount
] = "umount";
1198 #if defined (SYS_setuid)
1199 syscall_table
[SYS_setuid
] = "setuid";
1201 #if defined (SYS_getuid)
1202 syscall_table
[SYS_getuid
] = "getuid";
1204 #if defined (SYS_stime)
1205 syscall_table
[SYS_stime
] = "stime";
1207 #if defined (SYS_ptrace)
1208 syscall_table
[SYS_ptrace
] = "ptrace";
1210 #if defined (SYS_alarm)
1211 syscall_table
[SYS_alarm
] = "alarm";
1213 #if defined (SYS_fstat)
1214 syscall_table
[SYS_fstat
] = "fstat";
1216 #if defined (SYS_pause)
1217 syscall_table
[SYS_pause
] = "pause";
1219 #if defined (SYS_utime)
1220 syscall_table
[SYS_utime
] = "utime";
1222 #if defined (SYS_stty)
1223 syscall_table
[SYS_stty
] = "stty";
1225 #if defined (SYS_gtty)
1226 syscall_table
[SYS_gtty
] = "gtty";
1228 #if defined (SYS_access)
1229 syscall_table
[SYS_access
] = "access";
1231 #if defined (SYS_nice)
1232 syscall_table
[SYS_nice
] = "nice";
1234 #if defined (SYS_statfs)
1235 syscall_table
[SYS_statfs
] = "statfs";
1237 #if defined (SYS_sync)
1238 syscall_table
[SYS_sync
] = "sync";
1240 #if defined (SYS_kill)
1241 syscall_table
[SYS_kill
] = "kill";
1243 #if defined (SYS_fstatfs)
1244 syscall_table
[SYS_fstatfs
] = "fstatfs";
1246 #if defined (SYS_pgrpsys)
1247 syscall_table
[SYS_pgrpsys
] = "pgrpsys";
1249 #if defined (SYS_xenix)
1250 syscall_table
[SYS_xenix
] = "xenix";
1252 #if defined (SYS_dup)
1253 syscall_table
[SYS_dup
] = "dup";
1255 #if defined (SYS_pipe)
1256 syscall_table
[SYS_pipe
] = "pipe";
1258 #if defined (SYS_times)
1259 syscall_table
[SYS_times
] = "times";
1261 #if defined (SYS_profil)
1262 syscall_table
[SYS_profil
] = "profil";
1264 #if defined (SYS_plock)
1265 syscall_table
[SYS_plock
] = "plock";
1267 #if defined (SYS_setgid)
1268 syscall_table
[SYS_setgid
] = "setgid";
1270 #if defined (SYS_getgid)
1271 syscall_table
[SYS_getgid
] = "getgid";
1273 #if defined (SYS_signal)
1274 syscall_table
[SYS_signal
] = "signal";
1276 #if defined (SYS_msgsys)
1277 syscall_table
[SYS_msgsys
] = "msgsys";
1279 #if defined (SYS_sys3b)
1280 syscall_table
[SYS_sys3b
] = "sys3b";
1282 #if defined (SYS_sysi86)
1283 syscall_table
[SYS_sysi86
] = "sysi86";
1285 #if defined (SYS_acct)
1286 syscall_table
[SYS_acct
] = "acct";
1288 #if defined (SYS_shmsys)
1289 syscall_table
[SYS_shmsys
] = "shmsys";
1291 #if defined (SYS_semsys)
1292 syscall_table
[SYS_semsys
] = "semsys";
1294 #if defined (SYS_ioctl)
1295 syscall_table
[SYS_ioctl
] = "ioctl";
1297 #if defined (SYS_uadmin)
1298 syscall_table
[SYS_uadmin
] = "uadmin";
1300 #if defined (SYS_utssys)
1301 syscall_table
[SYS_utssys
] = "utssys";
1303 #if defined (SYS_fsync)
1304 syscall_table
[SYS_fsync
] = "fsync";
1306 #if defined (SYS_umask)
1307 syscall_table
[SYS_umask
] = "umask";
1309 #if defined (SYS_chroot)
1310 syscall_table
[SYS_chroot
] = "chroot";
1312 #if defined (SYS_fcntl)
1313 syscall_table
[SYS_fcntl
] = "fcntl";
1315 #if defined (SYS_ulimit)
1316 syscall_table
[SYS_ulimit
] = "ulimit";
1318 #if defined (SYS_rfsys)
1319 syscall_table
[SYS_rfsys
] = "rfsys";
1321 #if defined (SYS_rmdir)
1322 syscall_table
[SYS_rmdir
] = "rmdir";
1324 #if defined (SYS_mkdir)
1325 syscall_table
[SYS_mkdir
] = "mkdir";
1327 #if defined (SYS_getdents)
1328 syscall_table
[SYS_getdents
] = "getdents";
1330 #if defined (SYS_sysfs)
1331 syscall_table
[SYS_sysfs
] = "sysfs";
1333 #if defined (SYS_getmsg)
1334 syscall_table
[SYS_getmsg
] = "getmsg";
1336 #if defined (SYS_putmsg)
1337 syscall_table
[SYS_putmsg
] = "putmsg";
1339 #if defined (SYS_poll)
1340 syscall_table
[SYS_poll
] = "poll";
1342 #if defined (SYS_lstat)
1343 syscall_table
[SYS_lstat
] = "lstat";
1345 #if defined (SYS_symlink)
1346 syscall_table
[SYS_symlink
] = "symlink";
1348 #if defined (SYS_readlink)
1349 syscall_table
[SYS_readlink
] = "readlink";
1351 #if defined (SYS_setgroups)
1352 syscall_table
[SYS_setgroups
] = "setgroups";
1354 #if defined (SYS_getgroups)
1355 syscall_table
[SYS_getgroups
] = "getgroups";
1357 #if defined (SYS_fchmod)
1358 syscall_table
[SYS_fchmod
] = "fchmod";
1360 #if defined (SYS_fchown)
1361 syscall_table
[SYS_fchown
] = "fchown";
1363 #if defined (SYS_sigprocmask)
1364 syscall_table
[SYS_sigprocmask
] = "sigprocmask";
1366 #if defined (SYS_sigsuspend)
1367 syscall_table
[SYS_sigsuspend
] = "sigsuspend";
1369 #if defined (SYS_sigaltstack)
1370 syscall_table
[SYS_sigaltstack
] = "sigaltstack";
1372 #if defined (SYS_sigaction)
1373 syscall_table
[SYS_sigaction
] = "sigaction";
1375 #if defined (SYS_sigpending)
1376 syscall_table
[SYS_sigpending
] = "sigpending";
1378 #if defined (SYS_context)
1379 syscall_table
[SYS_context
] = "context";
1381 #if defined (SYS_evsys)
1382 syscall_table
[SYS_evsys
] = "evsys";
1384 #if defined (SYS_evtrapret)
1385 syscall_table
[SYS_evtrapret
] = "evtrapret";
1387 #if defined (SYS_statvfs)
1388 syscall_table
[SYS_statvfs
] = "statvfs";
1390 #if defined (SYS_fstatvfs)
1391 syscall_table
[SYS_fstatvfs
] = "fstatvfs";
1393 #if defined (SYS_nfssys)
1394 syscall_table
[SYS_nfssys
] = "nfssys";
1396 #if defined (SYS_waitsys)
1397 syscall_table
[SYS_waitsys
] = "waitsys";
1399 #if defined (SYS_sigsendsys)
1400 syscall_table
[SYS_sigsendsys
] = "sigsendsys";
1402 #if defined (SYS_hrtsys)
1403 syscall_table
[SYS_hrtsys
] = "hrtsys";
1405 #if defined (SYS_acancel)
1406 syscall_table
[SYS_acancel
] = "acancel";
1408 #if defined (SYS_async)
1409 syscall_table
[SYS_async
] = "async";
1411 #if defined (SYS_priocntlsys)
1412 syscall_table
[SYS_priocntlsys
] = "priocntlsys";
1414 #if defined (SYS_pathconf)
1415 syscall_table
[SYS_pathconf
] = "pathconf";
1417 #if defined (SYS_mincore)
1418 syscall_table
[SYS_mincore
] = "mincore";
1420 #if defined (SYS_mmap)
1421 syscall_table
[SYS_mmap
] = "mmap";
1423 #if defined (SYS_mprotect)
1424 syscall_table
[SYS_mprotect
] = "mprotect";
1426 #if defined (SYS_munmap)
1427 syscall_table
[SYS_munmap
] = "munmap";
1429 #if defined (SYS_fpathconf)
1430 syscall_table
[SYS_fpathconf
] = "fpathconf";
1432 #if defined (SYS_vfork)
1433 syscall_table
[SYS_vfork
] = "vfork";
1435 #if defined (SYS_fchdir)
1436 syscall_table
[SYS_fchdir
] = "fchdir";
1438 #if defined (SYS_readv)
1439 syscall_table
[SYS_readv
] = "readv";
1441 #if defined (SYS_writev)
1442 syscall_table
[SYS_writev
] = "writev";
1444 #if defined (SYS_xstat)
1445 syscall_table
[SYS_xstat
] = "xstat";
1447 #if defined (SYS_lxstat)
1448 syscall_table
[SYS_lxstat
] = "lxstat";
1450 #if defined (SYS_fxstat)
1451 syscall_table
[SYS_fxstat
] = "fxstat";
1453 #if defined (SYS_xmknod)
1454 syscall_table
[SYS_xmknod
] = "xmknod";
1456 #if defined (SYS_clocal)
1457 syscall_table
[SYS_clocal
] = "clocal";
1459 #if defined (SYS_setrlimit)
1460 syscall_table
[SYS_setrlimit
] = "setrlimit";
1462 #if defined (SYS_getrlimit)
1463 syscall_table
[SYS_getrlimit
] = "getrlimit";
1465 #if defined (SYS_lchown)
1466 syscall_table
[SYS_lchown
] = "lchown";
1468 #if defined (SYS_memcntl)
1469 syscall_table
[SYS_memcntl
] = "memcntl";
1471 #if defined (SYS_getpmsg)
1472 syscall_table
[SYS_getpmsg
] = "getpmsg";
1474 #if defined (SYS_putpmsg)
1475 syscall_table
[SYS_putpmsg
] = "putpmsg";
1477 #if defined (SYS_rename)
1478 syscall_table
[SYS_rename
] = "rename";
1480 #if defined (SYS_uname)
1481 syscall_table
[SYS_uname
] = "uname";
1483 #if defined (SYS_setegid)
1484 syscall_table
[SYS_setegid
] = "setegid";
1486 #if defined (SYS_sysconfig)
1487 syscall_table
[SYS_sysconfig
] = "sysconfig";
1489 #if defined (SYS_adjtime)
1490 syscall_table
[SYS_adjtime
] = "adjtime";
1492 #if defined (SYS_systeminfo)
1493 syscall_table
[SYS_systeminfo
] = "systeminfo";
1495 #if defined (SYS_seteuid)
1496 syscall_table
[SYS_seteuid
] = "seteuid";
1498 #if defined (SYS_sproc)
1499 syscall_table
[SYS_sproc
] = "sproc";
1501 #if defined (SYS_keyctl)
1502 syscall_table
[SYS_keyctl
] = "keyctl";
1504 #if defined (SYS_secsys)
1505 syscall_table
[SYS_secsys
] = "secsys";
1507 #if defined (SYS_filepriv)
1508 syscall_table
[SYS_filepriv
] = "filepriv";
1510 #if defined (SYS_procpriv)
1511 syscall_table
[SYS_procpriv
] = "procpriv";
1513 #if defined (SYS_devstat)
1514 syscall_table
[SYS_devstat
] = "devstat";
1516 #if defined (SYS_aclipc)
1517 syscall_table
[SYS_aclipc
] = "aclipc";
1519 #if defined (SYS_fdevstat)
1520 syscall_table
[SYS_fdevstat
] = "fdevstat";
1522 #if defined (SYS_flvlfile)
1523 syscall_table
[SYS_flvlfile
] = "flvlfile";
1525 #if defined (SYS_lvlfile)
1526 syscall_table
[SYS_lvlfile
] = "lvlfile";
1528 #if defined (SYS_lvlequal)
1529 syscall_table
[SYS_lvlequal
] = "lvlequal";
1531 #if defined (SYS_lvlproc)
1532 syscall_table
[SYS_lvlproc
] = "lvlproc";
1534 #if defined (SYS_lvlipc)
1535 syscall_table
[SYS_lvlipc
] = "lvlipc";
1537 #if defined (SYS_acl)
1538 syscall_table
[SYS_acl
] = "acl";
1540 #if defined (SYS_auditevt)
1541 syscall_table
[SYS_auditevt
] = "auditevt";
1543 #if defined (SYS_auditctl)
1544 syscall_table
[SYS_auditctl
] = "auditctl";
1546 #if defined (SYS_auditdmp)
1547 syscall_table
[SYS_auditdmp
] = "auditdmp";
1549 #if defined (SYS_auditlog)
1550 syscall_table
[SYS_auditlog
] = "auditlog";
1552 #if defined (SYS_auditbuf)
1553 syscall_table
[SYS_auditbuf
] = "auditbuf";
1555 #if defined (SYS_lvldom)
1556 syscall_table
[SYS_lvldom
] = "lvldom";
1558 #if defined (SYS_lvlvfs)
1559 syscall_table
[SYS_lvlvfs
] = "lvlvfs";
1561 #if defined (SYS_mkmld)
1562 syscall_table
[SYS_mkmld
] = "mkmld";
1564 #if defined (SYS_mldmode)
1565 syscall_table
[SYS_mldmode
] = "mldmode";
1567 #if defined (SYS_secadvise)
1568 syscall_table
[SYS_secadvise
] = "secadvise";
1570 #if defined (SYS_online)
1571 syscall_table
[SYS_online
] = "online";
1573 #if defined (SYS_setitimer)
1574 syscall_table
[SYS_setitimer
] = "setitimer";
1576 #if defined (SYS_getitimer)
1577 syscall_table
[SYS_getitimer
] = "getitimer";
1579 #if defined (SYS_gettimeofday)
1580 syscall_table
[SYS_gettimeofday
] = "gettimeofday";
1582 #if defined (SYS_settimeofday)
1583 syscall_table
[SYS_settimeofday
] = "settimeofday";
1585 #if defined (SYS_lwp_create)
1586 syscall_table
[SYS_lwp_create
] = "_lwp_create";
1588 #if defined (SYS_lwp_exit)
1589 syscall_table
[SYS_lwp_exit
] = "_lwp_exit";
1591 #if defined (SYS_lwp_wait)
1592 syscall_table
[SYS_lwp_wait
] = "_lwp_wait";
1594 #if defined (SYS_lwp_self)
1595 syscall_table
[SYS_lwp_self
] = "_lwp_self";
1597 #if defined (SYS_lwp_info)
1598 syscall_table
[SYS_lwp_info
] = "_lwp_info";
1600 #if defined (SYS_lwp_private)
1601 syscall_table
[SYS_lwp_private
] = "_lwp_private";
1603 #if defined (SYS_processor_bind)
1604 syscall_table
[SYS_processor_bind
] = "processor_bind";
1606 #if defined (SYS_processor_exbind)
1607 syscall_table
[SYS_processor_exbind
] = "processor_exbind";
1609 #if defined (SYS_prepblock)
1610 syscall_table
[SYS_prepblock
] = "prepblock";
1612 #if defined (SYS_block)
1613 syscall_table
[SYS_block
] = "block";
1615 #if defined (SYS_rdblock)
1616 syscall_table
[SYS_rdblock
] = "rdblock";
1618 #if defined (SYS_unblock)
1619 syscall_table
[SYS_unblock
] = "unblock";
1621 #if defined (SYS_cancelblock)
1622 syscall_table
[SYS_cancelblock
] = "cancelblock";
1624 #if defined (SYS_pread)
1625 syscall_table
[SYS_pread
] = "pread";
1627 #if defined (SYS_pwrite)
1628 syscall_table
[SYS_pwrite
] = "pwrite";
1630 #if defined (SYS_truncate)
1631 syscall_table
[SYS_truncate
] = "truncate";
1633 #if defined (SYS_ftruncate)
1634 syscall_table
[SYS_ftruncate
] = "ftruncate";
1636 #if defined (SYS_lwp_kill)
1637 syscall_table
[SYS_lwp_kill
] = "_lwp_kill";
1639 #if defined (SYS_sigwait)
1640 syscall_table
[SYS_sigwait
] = "sigwait";
1642 #if defined (SYS_fork1)
1643 syscall_table
[SYS_fork1
] = "fork1";
1645 #if defined (SYS_forkall)
1646 syscall_table
[SYS_forkall
] = "forkall";
1648 #if defined (SYS_modload)
1649 syscall_table
[SYS_modload
] = "modload";
1651 #if defined (SYS_moduload)
1652 syscall_table
[SYS_moduload
] = "moduload";
1654 #if defined (SYS_modpath)
1655 syscall_table
[SYS_modpath
] = "modpath";
1657 #if defined (SYS_modstat)
1658 syscall_table
[SYS_modstat
] = "modstat";
1660 #if defined (SYS_modadm)
1661 syscall_table
[SYS_modadm
] = "modadm";
1663 #if defined (SYS_getksym)
1664 syscall_table
[SYS_getksym
] = "getksym";
1666 #if defined (SYS_lwp_suspend)
1667 syscall_table
[SYS_lwp_suspend
] = "_lwp_suspend";
1669 #if defined (SYS_lwp_continue)
1670 syscall_table
[SYS_lwp_continue
] = "_lwp_continue";
1672 #if defined (SYS_priocntllst)
1673 syscall_table
[SYS_priocntllst
] = "priocntllst";
1675 #if defined (SYS_sleep)
1676 syscall_table
[SYS_sleep
] = "sleep";
1678 #if defined (SYS_lwp_sema_wait)
1679 syscall_table
[SYS_lwp_sema_wait
] = "_lwp_sema_wait";
1681 #if defined (SYS_lwp_sema_post)
1682 syscall_table
[SYS_lwp_sema_post
] = "_lwp_sema_post";
1684 #if defined (SYS_lwp_sema_trywait)
1685 syscall_table
[SYS_lwp_sema_trywait
] = "lwp_sema_trywait";
1693 procfs_kill_inferior - kill any currently inferior
1697 void procfs_kill_inferior (void)
1701 Kill any current inferior.
1705 Kills even attached inferiors. Presumably the user has already
1706 been prompted that the inferior is an attached one rather than
1707 one started by gdb. (FIXME?)
1712 procfs_kill_inferior ()
1714 target_mourn_inferior ();
1721 unconditionally_kill_inferior - terminate the inferior
1725 static void unconditionally_kill_inferior (struct procinfo *)
1729 Kill the specified inferior.
1733 A possibly useful enhancement would be to first try sending
1734 the inferior a terminate signal, politely asking it to commit
1735 suicide, before we murder it (we could call that
1736 politely_kill_inferior()).
1741 unconditionally_kill_inferior (pi
)
1742 struct procinfo
*pi
;
1745 struct proc_ctl pctl
;
1747 ppid
= pi
->prstatus
.pr_ppid
;
1749 #ifdef PROCFS_NEED_CLEAR_CURSIG_FOR_KILL
1750 /* Alpha OSF/1-3.x procfs needs a clear of the current signal
1751 before the PIOCKILL, otherwise it might generate a corrupted core
1752 file for the inferior. */
1753 ioctl (pi
->ctl_fd
, PIOCSSIG
, NULL
);
1755 #ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
1756 /* Alpha OSF/1-2.x procfs needs a PIOCSSIG call with a SIGKILL signal
1757 to kill the inferior, otherwise it might remain stopped with a
1759 We do not check the result of the PIOCSSIG, the inferior might have
1762 struct siginfo newsiginfo
;
1764 memset ((char *) &newsiginfo
, 0, sizeof (newsiginfo
));
1765 newsiginfo
.si_signo
= SIGKILL
;
1766 newsiginfo
.si_code
= 0;
1767 newsiginfo
.si_errno
= 0;
1768 newsiginfo
.si_pid
= getpid ();
1769 newsiginfo
.si_uid
= getuid ();
1770 ioctl (pi
->ctl_fd
, PIOCSSIG
, &newsiginfo
);
1772 #else /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
1773 procfs_write_pckill (pi
);
1774 #endif /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
1776 close_proc_file (pi
);
1778 /* Only wait() for our direct children. Our grandchildren zombies are killed
1779 by the death of their parents. */
1781 if (ppid
== getpid())
1789 procfs_xfer_memory -- copy data to or from inferior memory space
1793 int procfs_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
1794 int dowrite, struct target_ops target)
1798 Copy LEN bytes to/from inferior's memory starting at MEMADDR
1799 from/to debugger memory starting at MYADDR. Copy from inferior
1800 if DOWRITE is zero or to inferior if DOWRITE is nonzero.
1802 Returns the length copied, which is either the LEN argument or
1803 zero. This xfer function does not do partial moves, since procfs_ops
1804 doesn't allow memory operations to cross below us in the target stack
1809 The /proc interface makes this an almost trivial task.
1813 procfs_xfer_memory (memaddr
, myaddr
, len
, dowrite
, target
)
1818 struct target_ops
*target
; /* ignored */
1821 struct procinfo
*pi
;
1823 pi
= current_procinfo
;
1825 if (lseek(pi
->as_fd
, (off_t
) memaddr
, SEEK_SET
) == (off_t
) memaddr
)
1829 nbytes
= write (pi
->as_fd
, myaddr
, len
);
1833 nbytes
= read (pi
->as_fd
, myaddr
, len
);
1847 procfs_store_registers -- copy register values back to inferior
1851 void procfs_store_registers (int regno)
1855 Store our current register values back into the inferior. If
1856 REGNO is -1 then store all the register, otherwise store just
1857 the value specified by REGNO.
1861 If we are storing only a single register, we first have to get all
1862 the current values from the process, overwrite the desired register
1863 in the gregset with the one we want from gdb's registers, and then
1864 send the whole set back to the process. For writing all the
1865 registers, all we have to do is generate the gregset and send it to
1868 Also note that the process has to be stopped on an event of interest
1869 for this to work, which basically means that it has to have been
1870 run under the control of one of the other /proc ioctl calls and not
1871 ptrace. Since we don't use ptrace anyway, we don't worry about this
1872 fine point, but it is worth noting for future reference.
1874 Gdb is confused about what this function is supposed to return.
1875 Some versions return a value, others return nothing. Some are
1876 declared to return a value and actually return nothing. Gdb ignores
1877 anything returned. (FIXME)
1882 procfs_store_registers (regno
)
1885 struct procinfo
*pi
;
1886 #ifdef PROCFS_USE_READ_WRITE
1887 struct greg_ctl greg
;
1888 struct fpreg_ctl fpreg
;
1891 pi
= current_procinfo
;
1893 #ifdef PROCFS_USE_READ_WRITE
1896 procfs_read_status (pi
);
1897 memcpy ((char *) &greg
.gregset
,
1898 (char *) &pi
->prstatus
.pr_lwp
.pr_context
.uc_mcontext
.gregs
,
1899 sizeof (gregset_t
));
1901 fill_gregset (&greg
.gregset
, regno
);
1903 write (pi
->ctl_fd
, &greg
, sizeof (greg
));
1904 #else /* PROCFS_USE_READ_WRITE */
1907 ioctl (pi
->ctl_fd
, PIOCGREG
, &pi
->gregset
.gregset
);
1909 fill_gregset (&pi
->gregset
.gregset
, regno
);
1910 ioctl (pi
->ctl_fd
, PIOCSREG
, &pi
->gregset
.gregset
);
1911 #endif /* PROCFS_USE_READ_WRITE */
1913 #if defined (FP0_REGNUM)
1915 /* Now repeat everything using the floating point register set, if the
1916 target has floating point hardware. Since we ignore the returned value,
1917 we'll never know whether it worked or not anyway. */
1919 #ifdef PROCFS_USE_READ_WRITE
1922 procfs_read_status (pi
);
1923 memcpy ((char *) &fpreg
.fpregset
,
1924 (char *) &pi
->prstatus
.pr_lwp
.pr_context
.uc_mcontext
.fpregs
,
1925 sizeof (fpregset_t
));
1927 fill_fpregset (&fpreg
.fpregset
, regno
);
1928 fpreg
.cmd
= PCSFPREG
;
1929 write (pi
->ctl_fd
, &fpreg
, sizeof (fpreg
));
1930 #else /* PROCFS_USE_READ_WRITE */
1933 ioctl (pi
->ctl_fd
, PIOCGFPREG
, &pi
->fpregset
.fpregset
);
1935 fill_fpregset (&pi
->fpregset
.fpregset
, regno
);
1936 ioctl (pi
->ctl_fd
, PIOCSFPREG
, &pi
->fpregset
.fpregset
);
1937 #endif /* PROCFS_USE_READ_WRITE */
1939 #endif /* FP0_REGNUM */
1947 init_procinfo - setup a procinfo struct and connect it to a process
1951 struct procinfo * init_procinfo (int pid)
1955 Allocate a procinfo structure, open the /proc file and then set up the
1956 set of signals and faults that are to be traced. Returns a pointer to
1957 the new procinfo structure.
1961 If proc_init_failed ever gets called, control returns to the command
1962 processing loop via the standard error handling code.
1966 static struct procinfo
*
1967 init_procinfo (pid
, kill
)
1971 struct procinfo
*pi
= (struct procinfo
*)
1972 xmalloc (sizeof (struct procinfo
));
1974 memset ((char *) pi
, 0, sizeof (*pi
));
1975 if (!open_proc_file (pid
, pi
, O_RDWR
, 1))
1976 proc_init_failed (pi
, "can't open process file", kill
);
1978 /* open_proc_file may modify pid. */
1982 /* Add new process to process info list */
1984 pi
->next
= procinfo_list
;
1987 add_fd (pi
); /* Add to list for poll/select */
1989 /* Remember some things about the inferior that we will, or might, change
1990 so that we can restore them when we detach. */
1992 memcpy ((char *) &pi
->saved_trace
.sigset
,
1993 (char *) &pi
->prstatus
.pr_sigtrace
, sizeof (sigset_t
));
1994 memcpy ((char *) &pi
->saved_fltset
.fltset
,
1995 (char *) &pi
->prstatus
.pr_flttrace
, sizeof (fltset_t
));
1996 memcpy ((char *) &pi
->saved_entryset
.sysset
,
1997 (char *) &pi
->prstatus
.pr_sysentry
, sizeof (sysset_t
));
1998 memcpy ((char *) &pi
->saved_exitset
.sysset
,
1999 (char *) &pi
->prstatus
.pr_sysexit
, sizeof (sysset_t
));
2001 /* Set up trace and fault sets, as gdb expects them. */
2003 prfillset (&sctl
.sigset
);
2004 notice_signals (pi
, &sctl
);
2005 prfillset (&fctl
.fltset
);
2006 prdelset (&fctl
.fltset
, FLTPAGE
);
2008 #else /* ! UNIXWARE */
2009 ioctl (pi
->ctl_fd
, PIOCGTRACE
, &pi
->saved_trace
.sigset
);
2010 ioctl (pi
->ctl_fd
, PIOCGHOLD
, &pi
->saved_sighold
.sigset
);
2011 ioctl (pi
->ctl_fd
, PIOCGFAULT
, &pi
->saved_fltset
.fltset
);
2012 ioctl (pi
->ctl_fd
, PIOCGENTRY
, &pi
->saved_entryset
.sysset
);
2013 ioctl (pi
->ctl_fd
, PIOCGEXIT
, &pi
->saved_exitset
.sysset
);
2015 /* Set up trace and fault sets, as gdb expects them. */
2017 memset ((char *) &pi
->prrun
, 0, sizeof (pi
->prrun
));
2018 prfillset (&pi
->prrun
.pr_trace
);
2019 procfs_notice_signals (pid
);
2020 prfillset (&pi
->prrun
.pr_fault
);
2021 prdelset (&pi
->prrun
.pr_fault
, FLTPAGE
);
2022 #ifdef PROCFS_DONT_TRACE_FAULTS
2023 premptyset (&pi
->prrun
.pr_fault
);
2025 #endif /* UNIXWARE */
2027 if (!procfs_read_status (pi
))
2028 proc_init_failed (pi
, "procfs_read_status failed", kill
);
2037 create_procinfo - initialize access to a /proc entry
2041 struct procinfo * create_procinfo (int pid)
2045 Allocate a procinfo structure, open the /proc file and then set up the
2046 set of signals and faults that are to be traced. Returns a pointer to
2047 the new procinfo structure.
2051 If proc_init_failed ever gets called, control returns to the command
2052 processing loop via the standard error handling code.
2056 static struct procinfo
*
2057 create_procinfo (pid
)
2060 struct procinfo
*pi
;
2061 struct sig_ctl sctl
;
2062 struct flt_ctl fctl
;
2064 pi
= find_procinfo (pid
, 1);
2066 return pi
; /* All done! It already exists */
2068 pi
= init_procinfo (pid
, 1);
2071 /* A bug in Solaris (2.5 at least) causes PIOCWSTOP to hang on LWPs that are
2072 already stopped, even if they all have PR_ASYNC set. */
2073 if (!(pi
->prstatus
.pr_flags
& PR_STOPPED
))
2075 if (!procfs_write_pcwstop (pi
))
2076 proc_init_failed (pi
, "procfs_write_pcwstop failed", 1);
2078 #ifdef PROCFS_USE_READ_WRITE
2079 fctl
.cmd
= PCSFAULT
;
2080 if (write (pi
->ctl_fd
, (char *) &fctl
, sizeof (struct flt_ctl
)) < 0)
2081 proc_init_failed (pi
, "PCSFAULT failed", 1);
2083 if (ioctl (pi
->ctl_fd
, PIOCSFAULT
, &pi
->prrun
.pr_fault
) < 0)
2084 proc_init_failed (pi
, "PIOCSFAULT failed", 1);
2094 procfs_exit_handler - handle entry into the _exit syscall
2098 int procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
2102 This routine is called when an inferior process enters the _exit()
2103 system call. It continues the process, and then collects the exit
2104 status and pid which are returned in *statvalp and *rtnvalp. After
2105 that it returns non-zero to indicate that procfs_wait should wake up.
2108 There is probably a better way to do this.
2113 procfs_exit_handler (pi
, syscall_num
, why
, rtnvalp
, statvalp
)
2114 struct procinfo
*pi
;
2120 struct procinfo
*temp_pi
, *next_pi
;
2122 pi
->prrun
.pr_flags
= PRCFAULT
;
2124 if (ioctl (pi
->ctl_fd
, PIOCRUN
, &pi
->prrun
) != 0)
2125 perror_with_name (pi
->pathname
);
2129 /* Claim it exited (don't call wait). */
2131 printf_filtered ("(attached process has exited)\n");
2133 *rtnvalp
= inferior_pid
;
2137 *rtnvalp
= wait (statvalp
);
2142 /* Close ALL open proc file handles,
2143 except the one that called SYS_exit. */
2144 for (temp_pi
= procinfo_list
; temp_pi
; temp_pi
= next_pi
)
2146 next_pi
= temp_pi
->next
;
2148 continue; /* Handled below */
2149 close_proc_file (temp_pi
);
2158 procfs_exec_handler - handle exit from the exec family of syscalls
2162 int procfs_exec_handler (pi, syscall_num, why, rtnvalp, statvalp)
2166 This routine is called when an inferior process is about to finish any
2167 of the exec() family of system calls. It pretends that we got a
2168 SIGTRAP (for compatibility with ptrace behavior), and returns non-zero
2169 to tell procfs_wait to wake up.
2172 This need for compatibility with ptrace is questionable. In the
2173 future, it shouldn't be necessary.
2178 procfs_exec_handler (pi
, syscall_num
, why
, rtnvalp
, statvalp
)
2179 struct procinfo
*pi
;
2185 *statvalp
= (SIGTRAP
<< 8) | 0177;
2190 #if defined(SYS_sproc) && !defined(UNIXWARE)
2191 /* IRIX lwp creation system call */
2197 procfs_sproc_handler - handle exit from the sproc syscall
2201 int procfs_sproc_handler (pi, syscall_num, why, rtnvalp, statvalp)
2205 This routine is called when an inferior process is about to finish an
2206 sproc() system call. This is the system call that IRIX uses to create
2207 a lightweight process. When the target process gets this event, we can
2208 look at rval1 to find the new child processes ID, and create a new
2209 procinfo struct from that.
2211 After that, it pretends that we got a SIGTRAP, and returns non-zero
2212 to tell procfs_wait to wake up. Subsequently, wait_for_inferior gets
2213 woken up, sees the new process and continues it.
2216 We actually never see the child exiting from sproc because we will
2217 shortly stop the child with PIOCSTOP, which is then registered as the
2222 procfs_sproc_handler (pi
, syscall_num
, why
, rtnvalp
, statvalp
)
2223 struct procinfo
*pi
;
2229 /* We've just detected the completion of an sproc system call. Now we need to
2230 setup a procinfo struct for this thread, and notify the thread system of the
2233 /* If sproc failed, then nothing interesting happened. Continue the process
2234 and go back to sleep. */
2236 if (pi
->prstatus
.pr_errno
!= 0)
2238 pi
->prrun
.pr_flags
&= PRSTEP
;
2239 pi
->prrun
.pr_flags
|= PRCFAULT
;
2241 if (ioctl (pi
->ctl_fd
, PIOCRUN
, &pi
->prrun
) != 0)
2242 perror_with_name (pi
->pathname
);
2247 /* At this point, the new thread is stopped at it's first instruction, and
2248 the parent is stopped at the exit from sproc. */
2250 /* Notify the caller of the arrival of a new thread. */
2251 create_procinfo (pi
->prstatus
.pr_rval1
);
2253 *rtnvalp
= pi
->prstatus
.pr_rval1
;
2254 *statvalp
= (SIGTRAP
<< 8) | 0177;
2263 procfs_fork_handler - handle exit from the fork syscall
2267 int procfs_fork_handler (pi, syscall_num, why, rtnvalp, statvalp)
2271 This routine is called when an inferior process is about to finish a
2272 fork() system call. We will open up the new process, and then close
2273 it, which releases it from the clutches of the debugger.
2275 After that, we continue the target process as though nothing had
2279 This is necessary for IRIX because we have to set PR_FORK in order
2280 to catch the creation of lwps (via sproc()). When an actual fork
2281 occurs, it becomes necessary to reset the forks debugger flags and
2282 continue it because we can't hack multiple processes yet.
2286 procfs_fork_handler (pi
, syscall_num
, why
, rtnvalp
, statvalp
)
2287 struct procinfo
*pi
;
2293 struct procinfo
*pitemp
;
2295 /* At this point, we've detected the completion of a fork (or vfork) call in
2296 our child. The grandchild is also stopped because we set inherit-on-fork
2297 earlier. (Note that nobody has the grandchilds' /proc file open at this
2298 point.) We will release the grandchild from the debugger by opening it's
2299 /proc file and then closing it. Since run-on-last-close is set, the
2300 grandchild continues on its' merry way. */
2303 pitemp
= create_procinfo (pi
->prstatus
.pr_rval1
);
2305 close_proc_file (pitemp
);
2307 if (ioctl (pi
->ctl_fd
, PIOCRUN
, &pi
->prrun
) != 0)
2308 perror_with_name (pi
->pathname
);
2312 #endif /* SYS_sproc && !UNIXWARE */
2318 procfs_set_inferior_syscall_traps - setup the syscall traps
2322 void procfs_set_inferior_syscall_traps (struct procinfo *pip)
2326 Called for each "procinfo" (process, thread, or LWP) in the
2327 inferior, to register for notification of and handlers for
2328 syscall traps in the inferior.
2333 procfs_set_inferior_syscall_traps (pip
)
2334 struct procinfo
*pip
;
2336 procfs_set_syscall_trap (pip
, SYS_exit
, PROCFS_SYSCALL_ENTRY
,
2337 procfs_exit_handler
);
2339 #ifndef PRFS_STOPEXEC
2341 procfs_set_syscall_trap (pip
, SYS_exec
, PROCFS_SYSCALL_EXIT
,
2342 procfs_exec_handler
);
2345 procfs_set_syscall_trap (pip
, SYS_execv
, PROCFS_SYSCALL_EXIT
,
2346 procfs_exec_handler
);
2349 procfs_set_syscall_trap (pip
, SYS_execve
, PROCFS_SYSCALL_EXIT
,
2350 procfs_exec_handler
);
2352 #endif /* PRFS_STOPEXEC */
2354 /* Setup traps on exit from sproc() */
2357 procfs_set_syscall_trap (pip
, SYS_sproc
, PROCFS_SYSCALL_EXIT
,
2358 procfs_sproc_handler
);
2359 procfs_set_syscall_trap (pip
, SYS_fork
, PROCFS_SYSCALL_EXIT
,
2360 procfs_fork_handler
);
2362 procfs_set_syscall_trap (pip
, SYS_vfork
, PROCFS_SYSCALL_EXIT
,
2363 procfs_fork_handler
);
2365 /* Turn on inherit-on-fork flag so that all children of the target process
2366 start with tracing flags set. This allows us to trap lwp creation. Note
2367 that we also have to trap on fork and vfork in order to disable all tracing
2368 in the targets child processes. */
2370 modify_inherit_on_fork_flag (pip
->ctl_fd
, 1);
2373 #ifdef SYS_lwp_create
2374 procfs_set_syscall_trap (pip
, SYS_lwp_create
, PROCFS_SYSCALL_EXIT
,
2375 procfs_lwp_creation_handler
);
2383 procfs_init_inferior - initialize target vector and access to a
2388 int procfs_init_inferior (int pid)
2392 When gdb starts an inferior, this function is called in the parent
2393 process immediately after the fork. It waits for the child to stop
2394 on the return from the exec system call (the child itself takes care
2395 of ensuring that this is set up), then sets up the set of signals
2396 and faults that are to be traced. Returns the pid, which may have had
2397 the thread-id added to it.
2401 If proc_init_failed ever gets called, control returns to the command
2402 processing loop via the standard error handling code.
2407 procfs_init_inferior (pid
)
2410 struct procinfo
*pip
;
2412 push_target (&procfs_ops
);
2414 pip
= create_procinfo (pid
);
2416 procfs_set_inferior_syscall_traps (pip
);
2418 /* create_procinfo may change the pid, so we have to update inferior_pid
2419 here before calling other gdb routines that need the right pid. */
2424 add_thread (pip
-> pid
); /* Setup initial thread */
2426 #ifdef START_INFERIOR_TRAPS_EXPECTED
2427 startup_inferior (START_INFERIOR_TRAPS_EXPECTED
);
2429 /* One trap to exec the shell, one to exec the program being debugged. */
2430 startup_inferior (2);
2440 procfs_notice_signals
2444 static void procfs_notice_signals (int pid);
2448 When the user changes the state of gdb's signal handling via the
2449 "handle" command, this function gets called to see if any change
2450 in the /proc interface is required. It is also called internally
2451 by other /proc interface functions to initialize the state of
2452 the traced signal set.
2454 One thing it does is that signals for which the state is "nostop",
2455 "noprint", and "pass", have their trace bits reset in the pr_trace
2456 field, so that they are no longer traced. This allows them to be
2457 delivered directly to the inferior without the debugger ever being
2462 procfs_notice_signals (pid
)
2465 struct procinfo
*pi
;
2466 struct sig_ctl sctl
;
2468 pi
= find_procinfo (pid
, 0);
2471 premptyset (&sctl
.sigset
);
2473 sctl
.sigset
= pi
->prrun
.pr_trace
;
2476 notice_signals (pi
, &sctl
);
2479 pi
->prrun
.pr_trace
= sctl
.sigset
;
2484 notice_signals (pi
, sctl
)
2485 struct procinfo
*pi
;
2486 struct sig_ctl
*sctl
;
2490 for (signo
= 0; signo
< NSIG
; signo
++)
2492 if (signal_stop_state (target_signal_from_host (signo
)) == 0 &&
2493 signal_print_state (target_signal_from_host (signo
)) == 0 &&
2494 signal_pass_state (target_signal_from_host (signo
)) == 1)
2496 prdelset (&sctl
->sigset
, signo
);
2500 praddset (&sctl
->sigset
, signo
);
2503 #ifdef PROCFS_USE_READ_WRITE
2504 sctl
->cmd
= PCSTRACE
;
2505 if (write (pi
->ctl_fd
, (char *) sctl
, sizeof (struct sig_ctl
)) < 0)
2507 if (ioctl (pi
->ctl_fd
, PIOCSTRACE
, &sctl
->sigset
))
2510 print_sys_errmsg ("PIOCSTRACE failed", errno
);
2518 proc_set_exec_trap -- arrange for exec'd child to halt at startup
2522 void proc_set_exec_trap (void)
2526 This function is called in the child process when starting up
2527 an inferior, prior to doing the exec of the actual inferior.
2528 It sets the child process's exitset to make exit from the exec
2529 system call an event of interest to stop on, and then simply
2530 returns. The child does the exec, the system call returns, and
2531 the child stops at the first instruction, ready for the gdb
2532 parent process to take control of it.
2536 We need to use all local variables since the child may be sharing
2537 it's data space with the parent, if vfork was used rather than
2540 Also note that we want to turn off the inherit-on-fork flag in
2541 the child process so that any grand-children start with all
2542 tracing flags cleared.
2546 proc_set_exec_trap ()
2548 struct sys_ctl exitset
;
2549 struct sys_ctl entryset
;
2550 char procname
[MAX_PROC_NAME_SIZE
];
2553 sprintf (procname
, CTL_PROC_NAME_FMT
, getpid ());
2555 if ((fd
= open (procname
, O_WRONLY
)) < 0)
2557 if ((fd
= open (procname
, O_RDWR
)) < 0)
2561 gdb_flush (gdb_stderr
);
2564 premptyset (&exitset
.sysset
);
2565 premptyset (&entryset
.sysset
);
2567 #ifdef PRFS_STOPEXEC
2568 /* Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
2569 exits from exec system calls because of the user level loader. */
2573 if (ioctl (fd
, PIOCGSPCACT
, &prfs_flags
) < 0)
2576 gdb_flush (gdb_stderr
);
2579 prfs_flags
|= PRFS_STOPEXEC
;
2580 if (ioctl (fd
, PIOCSSPCACT
, &prfs_flags
) < 0)
2583 gdb_flush (gdb_stderr
);
2587 #else /* PRFS_STOPEXEC */
2589 Not all systems with /proc have all the exec* syscalls with the same
2590 names. On the SGI, for example, there is no SYS_exec, but there
2591 *is* a SYS_execv. So, we try to account for that. */
2594 praddset (&exitset
.sysset
, SYS_exec
);
2597 praddset (&exitset
.sysset
, SYS_execve
);
2600 praddset (&exitset
.sysset
, SYS_execv
);
2603 #ifdef PROCFS_USE_READ_WRITE
2604 exitset
.cmd
= PCSEXIT
;
2605 if (write (fd
, (char *) &exitset
, sizeof (struct sys_ctl
)) < 0)
2607 if (ioctl (fd
, PIOCSEXIT
, &exitset
.sysset
) < 0)
2611 gdb_flush (gdb_stderr
);
2614 #endif /* PRFS_STOPEXEC */
2616 praddset (&entryset
.sysset
, SYS_exit
);
2618 #ifdef PROCFS_USE_READ_WRITE
2619 entryset
.cmd
= PCSENTRY
;
2620 if (write (fd
, (char *) &entryset
, sizeof (struct sys_ctl
)) < 0)
2622 if (ioctl (fd
, PIOCSENTRY
, &entryset
.sysset
) < 0)
2626 gdb_flush (gdb_stderr
);
2630 /* Turn off inherit-on-fork flag so that all grand-children of gdb
2631 start with tracing flags cleared. */
2633 modify_inherit_on_fork_flag (fd
, 0);
2635 /* Turn on run-on-last-close flag so that this process will not hang
2636 if GDB goes away for some reason. */
2638 modify_run_on_last_close_flag (fd
, 1);
2643 struct proc_ctl pctl
;
2645 /* Solaris needs this to make procfs treat all threads seperately. Without
2646 this, all threads halt whenever something happens to any thread. Since
2647 GDB wants to control all this itself, it needs to set PR_ASYNC. */
2649 pr_flags
= PR_ASYNC
;
2650 #ifdef PROCFS_USE_READ_WRITE
2652 pctl
.data
= PR_FORK
|PR_ASYNC
;
2653 write (fd
, (char *) &pctl
, sizeof (struct proc_ctl
));
2655 ioctl (fd
, PIOCSET
, &pr_flags
);
2658 #endif /* PR_ASYNC */
2665 proc_iterate_over_mappings -- call function for every mapped space
2669 int proc_iterate_over_mappings (int (*func)())
2673 Given a pointer to a function, call that function for every
2674 mapped address space, passing it an open file descriptor for
2675 the file corresponding to that mapped address space (if any)
2676 and the base address of the mapped space. Quit when we hit
2677 the end of the mappings or the function returns nonzero.
2682 proc_iterate_over_mappings (func
)
2683 int (*func
) PARAMS ((int, CORE_ADDR
));
2690 struct procinfo
*pi
;
2693 pi
= current_procinfo
;
2695 if (fstat (pi
->map_fd
, &sbuf
) < 0)
2698 nmap
= sbuf
.st_size
/ sizeof (prmap_t
);
2699 prmaps
= (prmap_t
*) alloca (nmap
* sizeof(prmap_t
));
2700 if ((lseek (pi
->map_fd
, 0, SEEK_SET
) == 0) &&
2701 (read (pi
->map_fd
, (char *) prmaps
, nmap
* sizeof (prmap_t
)) ==
2702 (nmap
* sizeof (prmap_t
))))
2705 for (prmap
= prmaps
; i
< nmap
&& funcstat
== 0; ++prmap
, ++i
)
2707 char name
[sizeof ("/proc/1234567890/object") +
2708 sizeof (prmap
->pr_mapname
)];
2709 sprintf (name
, "/proc/%d/object/%s", pi
->pid
, prmap
->pr_mapname
);
2710 if ((fd
= open (name
, O_RDONLY
)) == -1)
2715 funcstat
= (*func
) (fd
, (CORE_ADDR
) prmap
->pr_vaddr
);
2721 #else /* UNIXWARE */
2723 proc_iterate_over_mappings (func
)
2724 int (*func
) PARAMS ((int, CORE_ADDR
));
2729 struct prmap
*prmaps
;
2730 struct prmap
*prmap
;
2731 struct procinfo
*pi
;
2733 pi
= current_procinfo
;
2735 if (ioctl (pi
->map_fd
, PIOCNMAP
, &nmap
) == 0)
2737 prmaps
= (struct prmap
*) alloca ((nmap
+ 1) * sizeof (*prmaps
));
2738 if (ioctl (pi
->map_fd
, PIOCMAP
, prmaps
) == 0)
2740 for (prmap
= prmaps
; prmap
-> pr_size
&& funcstat
== 0; ++prmap
)
2742 fd
= proc_address_to_fd (pi
, (CORE_ADDR
) prmap
-> pr_vaddr
, 0);
2743 funcstat
= (*func
) (fd
, (CORE_ADDR
) prmap
-> pr_vaddr
);
2750 #endif /* UNIXWARE */
2752 #if 0 /* Currently unused */
2757 proc_base_address -- find base address for segment containing address
2761 CORE_ADDR proc_base_address (CORE_ADDR addr)
2765 Given an address of a location in the inferior, find and return
2766 the base address of the mapped segment containing that address.
2768 This is used for example, by the shared library support code,
2769 where we have the pc value for some location in the shared library
2770 where we are stopped, and need to know the base address of the
2771 segment containing that address.
2775 proc_base_address (addr
)
2779 struct prmap
*prmaps
;
2780 struct prmap
*prmap
;
2781 CORE_ADDR baseaddr
= 0;
2782 struct procinfo
*pi
;
2784 pi
= current_procinfo
;
2786 if (ioctl (pi
->map_fd
, PIOCNMAP
, &nmap
) == 0)
2788 prmaps
= (struct prmap
*) alloca ((nmap
+ 1) * sizeof (*prmaps
));
2789 if (ioctl (pi
->map_fd
, PIOCMAP
, prmaps
) == 0)
2791 for (prmap
= prmaps
; prmap
-> pr_size
; ++prmap
)
2793 if ((prmap
-> pr_vaddr
<= (caddr_t
) addr
) &&
2794 (prmap
-> pr_vaddr
+ prmap
-> pr_size
> (caddr_t
) addr
))
2796 baseaddr
= (CORE_ADDR
) prmap
-> pr_vaddr
;
2811 proc_address_to_fd -- return open fd for file mapped to address
2815 int proc_address_to_fd (struct procinfo *pi, CORE_ADDR addr, complain)
2819 Given an address in the current inferior's address space, use the
2820 /proc interface to find an open file descriptor for the file that
2821 this address was mapped in from. Return -1 if there is no current
2822 inferior. Print a warning message if there is an inferior but
2823 the address corresponds to no file (IE a bogus address).
2828 proc_address_to_fd (pi
, addr
, complain
)
2829 struct procinfo
*pi
;
2835 if ((fd
= ioctl (pi
->ctl_fd
, PIOCOPENM
, (caddr_t
*) &addr
)) < 0)
2839 print_sys_errmsg (pi
->pathname
, errno
);
2840 warning ("can't find mapped file for address 0x%x", addr
);
2847 /* Attach to process PID, then initialize for debugging it
2848 and wait for the trace-trap that results from attaching. */
2851 procfs_attach (args
, from_tty
)
2859 error_no_arg ("process-id to attach");
2863 if (pid
== getpid()) /* Trying to masturbate? */
2864 error ("I refuse to debug myself!");
2868 exec_file
= (char *) get_exec_file (0);
2871 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file
, target_pid_to_str (pid
));
2873 printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid
));
2875 gdb_flush (gdb_stdout
);
2878 inferior_pid
= pid
= do_attach (pid
);
2879 push_target (&procfs_ops
);
2883 /* Take a program previously attached to and detaches it.
2884 The program resumes execution and will no longer stop
2885 on signals, etc. We'd better not have left any breakpoints
2886 in the program or it'll die when it hits one. For this
2887 to work, it may be necessary for the process to have been
2888 previously attached. It *might* work if the program was
2889 started via the normal ptrace (PTRACE_TRACEME). */
2892 procfs_detach (args
, from_tty
)
2900 char *exec_file
= get_exec_file (0);
2903 printf_unfiltered ("Detaching from program: %s %s\n",
2904 exec_file
, target_pid_to_str (inferior_pid
));
2905 gdb_flush (gdb_stdout
);
2908 siggnal
= atoi (args
);
2910 do_detach (siggnal
);
2912 unpush_target (&procfs_ops
); /* Pop out of handling an inferior */
2915 /* Get ready to modify the registers array. On machines which store
2916 individual registers, this doesn't need to do anything. On machines
2917 which store all the registers in one fell swoop, this makes sure
2918 that registers contains all the registers from the program being
2922 procfs_prepare_to_store ()
2924 #ifdef CHILD_PREPARE_TO_STORE
2925 CHILD_PREPARE_TO_STORE ();
2929 /* Print status information about what we're accessing. */
2932 procfs_files_info (ignore
)
2933 struct target_ops
*ignore
;
2935 printf_unfiltered ("\tUsing the running image of %s %s via /proc.\n",
2936 attach_flag
? "attached": "child", target_pid_to_str (inferior_pid
));
2941 procfs_open (arg
, from_tty
)
2945 error ("Use the \"run\" command to start a Unix child process.");
2952 do_attach -- attach to an already existing process
2956 int do_attach (int pid)
2960 Attach to an already existing process with the specified process
2961 id. If the process is not already stopped, query whether to
2966 The option of stopping at attach time is specific to the /proc
2967 versions of gdb. Versions using ptrace force the attachee
2968 to stop. (I have changed this version to do so, too. All you
2969 have to do is "continue" to make it go on. -- gnu@cygnus.com)
2977 struct procinfo
*pi
;
2978 struct sig_ctl sctl
;
2979 struct flt_ctl fctl
;
2982 pi
= init_procinfo (pid
, 0);
2985 nlwp
= pi
->prstatus
.pr_nlwp
;
2986 lwps
= alloca ((2 * nlwp
+ 2) * sizeof (id_t
));
2988 if (ioctl (pi
->ctl_fd
, PIOCLWPIDS
, lwps
))
2990 print_sys_errmsg (pi
-> pathname
, errno
);
2991 error ("PIOCLWPIDS failed");
2993 #else /* PIOCLWPIDS */
2995 lwps
= alloca ((2 * nlwp
+ 2) * sizeof *lwps
);
2998 for (; nlwp
> 0; nlwp
--, lwps
++)
3000 /* First one has already been created above. */
3001 if ((pi
= find_procinfo ((*lwps
<< 16) | pid
, 1)) == 0)
3002 pi
= init_procinfo ((*lwps
<< 16) | pid
, 0);
3005 if (pi
->prstatus
.pr_lwp
.pr_flags
& (PR_STOPPED
| PR_ISTOP
))
3007 if (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
))
3010 pi
->was_stopped
= 1;
3014 pi
->was_stopped
= 0;
3015 if (1 || query ("Process is currently running, stop it? "))
3018 /* Make it run again when we close it. */
3019 modify_run_on_last_close_flag (pi
->ctl_fd
, 1);
3020 #ifdef PROCFS_USE_READ_WRITE
3022 if (write (pi
->ctl_fd
, (char *) &cmd
, sizeof (long)) < 0)
3024 if (ioctl (pi
->ctl_fd
, PIOCSTOP
, &pi
->prstatus
) < 0)
3027 print_sys_errmsg (pi
->pathname
, errno
);
3028 close_proc_file (pi
);
3029 error ("PIOCSTOP failed");
3032 if (!procfs_read_status (pi
))
3034 print_sys_errmsg (pi
->pathname
, errno
);
3035 close_proc_file (pi
);
3036 error ("procfs_read_status failed");
3039 pi
->nopass_next_sigstop
= 1;
3043 printf_unfiltered ("Ok, gdb will wait for %s to stop.\n",
3044 target_pid_to_str (pi
->pid
));
3048 #ifdef PROCFS_USE_READ_WRITE
3049 fctl
.cmd
= PCSFAULT
;
3050 if (write (pi
->ctl_fd
, (char *) &fctl
, sizeof (struct flt_ctl
)) < 0)
3051 print_sys_errmsg ("PCSFAULT failed", errno
);
3052 #else /* PROCFS_USE_READ_WRITE */
3053 if (ioctl (pi
->ctl_fd
, PIOCSFAULT
, &pi
->prrun
.pr_fault
))
3055 print_sys_errmsg ("PIOCSFAULT failed", errno
);
3057 if (ioctl (pi
->ctl_fd
, PIOCSTRACE
, &pi
->prrun
.pr_trace
))
3059 print_sys_errmsg ("PIOCSTRACE failed", errno
);
3061 add_thread (pi
->pid
);
3062 procfs_set_inferior_syscall_traps (pi
);
3064 #endif /* PROCFS_USE_READ_WRITE */
3073 do_detach -- detach from an attached-to process
3077 void do_detach (int signal)
3081 Detach from the current attachee.
3083 If signal is non-zero, the attachee is started running again and sent
3084 the specified signal.
3086 If signal is zero and the attachee was not already stopped when we
3087 attached to it, then we make it runnable again when we detach.
3089 Otherwise, we query whether or not to make the attachee runnable
3090 again, since we may simply want to leave it in the state it was in
3093 We report any problems, but do not consider them errors, since we
3094 MUST detach even if some things don't seem to go right. This may not
3095 be the ideal situation. (FIXME).
3102 struct procinfo
*pi
;
3104 for (pi
= procinfo_list
; pi
; pi
= pi
->next
)
3108 set_proc_siginfo (pi
, signal
);
3110 #ifdef PROCFS_USE_READ_WRITE
3111 pi
->saved_exitset
.cmd
= PCSEXIT
;
3112 if (write (pi
->ctl_fd
, (char *) &pi
->saved_exitset
,
3113 sizeof (struct sys_ctl
)) < 0)
3115 if (ioctl (pi
->ctl_fd
, PIOCSEXIT
, &pi
->saved_exitset
.sysset
) < 0)
3118 print_sys_errmsg (pi
->pathname
, errno
);
3119 printf_unfiltered ("PIOCSEXIT failed.\n");
3121 #ifdef PROCFS_USE_READ_WRITE
3122 pi
->saved_entryset
.cmd
= PCSENTRY
;
3123 if (write (pi
->ctl_fd
, (char *) &pi
->saved_entryset
,
3124 sizeof (struct sys_ctl
)) < 0)
3126 if (ioctl (pi
->ctl_fd
, PIOCSENTRY
, &pi
->saved_entryset
.sysset
) < 0)
3129 print_sys_errmsg (pi
->pathname
, errno
);
3130 printf_unfiltered ("PIOCSENTRY failed.\n");
3132 #ifdef PROCFS_USE_READ_WRITE
3133 pi
->saved_trace
.cmd
= PCSTRACE
;
3134 if (write (pi
->ctl_fd
, (char *) &pi
->saved_trace
,
3135 sizeof (struct sig_ctl
)) < 0)
3137 if (ioctl (pi
->ctl_fd
, PIOCSTRACE
, &pi
->saved_trace
.sigset
) < 0)
3140 print_sys_errmsg (pi
->pathname
, errno
);
3141 printf_unfiltered ("PIOCSTRACE failed.\n");
3144 if (ioctl (pi
->ctl_fd
, PIOCSHOLD
, &pi
->saved_sighold
.sigset
) < 0)
3146 print_sys_errmsg (pi
->pathname
, errno
);
3147 printf_unfiltered ("PIOSCHOLD failed.\n");
3150 #ifdef PROCFS_USE_READ_WRITE
3151 pi
->saved_fltset
.cmd
= PCSFAULT
;
3152 if (write (pi
->ctl_fd
, (char *) &pi
->saved_fltset
,
3153 sizeof (struct flt_ctl
)) < 0)
3155 if (ioctl (pi
->ctl_fd
, PIOCSFAULT
, &pi
->saved_fltset
.fltset
) < 0)
3158 print_sys_errmsg (pi
->pathname
, errno
);
3159 printf_unfiltered ("PIOCSFAULT failed.\n");
3161 if (!procfs_read_status (pi
))
3163 print_sys_errmsg (pi
->pathname
, errno
);
3164 printf_unfiltered ("procfs_read_status failed.\n");
3169 if (signal
|| (pi
->prstatus
.pr_lwp
.pr_flags
& (PR_STOPPED
| PR_ISTOP
)))
3171 if (signal
|| (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
)))
3175 struct proc_ctl pctl
;
3177 if (signal
|| !pi
->was_stopped
||
3178 query ("Was stopped when attached, make it runnable again? "))
3180 /* Clear any pending signal if we want to detach without
3183 set_proc_siginfo (pi
, signal
);
3185 /* Clear any fault that might have stopped it. */
3186 #ifdef PROCFS_USE_READ_WRITE
3188 if (write (pi
->ctl_fd
, (char *) &cmd
, sizeof (long)) < 0)
3190 if (ioctl (pi
->ctl_fd
, PIOCCFAULT
, 0))
3193 print_sys_errmsg (pi
->pathname
, errno
);
3194 printf_unfiltered ("PIOCCFAULT failed.\n");
3197 /* Make it run again when we close it. */
3199 modify_run_on_last_close_flag (pi
->ctl_fd
, 1);
3203 close_proc_file (pi
);
3208 /* emulate wait() as much as possible.
3209 Wait for child to do something. Return pid of child, or -1 in case
3210 of error; store status in *OURSTATUS.
3212 Not sure why we can't
3213 just use wait(), but it seems to have problems when applied to a
3214 process being controlled with the /proc interface.
3216 We have a race problem here with no obvious solution. We need to let
3217 the inferior run until it stops on an event of interest, which means
3218 that we need to use the PIOCWSTOP ioctl. However, we cannot use this
3219 ioctl if the process is already stopped on something that is not an
3220 event of interest, or the call will hang indefinitely. Thus we first
3221 use PIOCSTATUS to see if the process is not stopped. If not, then we
3222 use PIOCWSTOP. But during the window between the two, if the process
3223 stops for any reason that is not an event of interest (such as a job
3224 control signal) then gdb will hang. One possible workaround is to set
3225 an alarm to wake up every minute of so and check to see if the process
3226 is still running, and if so, then reissue the PIOCWSTOP. But this is
3227 a real kludge, so has not been implemented. FIXME: investigate
3230 FIXME: Investigate why wait() seems to have problems with programs
3231 being control by /proc routines. */
3233 procfs_wait (pid
, ourstatus
)
3235 struct target_waitstatus
*ourstatus
;
3242 struct procinfo
*pi
;
3243 struct proc_ctl pctl
;
3246 if (pid
!= -1) /* Non-specific process? */
3249 for (pi
= procinfo_list
; pi
; pi
= pi
->next
)
3264 for (pi
= procinfo_list
; pi
; pi
= pi
->next
)
3265 if (pi
->pid
== pid
&& pi
->had_event
)
3269 if (!pi
&& !checkerr
)
3273 if (!checkerr
&& !(pi
->prstatus
.pr_lwp
.pr_flags
& (PR_STOPPED
| PR_ISTOP
)))
3275 if (!checkerr
&& !(pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
)))
3278 if (!procfs_write_pcwstop (pi
))
3285 if (errno
== ENOENT
)
3287 /* XXX Fixme -- what to do if attached? Can't call wait... */
3288 rtnval
= wait (&statval
);
3289 if ((rtnval
) != (inferior_pid
))
3291 print_sys_errmsg (pi
->pathname
, errno
);
3292 error ("procfs_wait: wait failed, returned %d", rtnval
);
3298 print_sys_errmsg (pi
->pathname
, errno
);
3299 error ("PIOCSTATUS or PIOCWSTOP failed.");
3303 else if (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
))
3306 rtnval
= pi
->prstatus
.pr_pid
;
3307 why
= pi
->prstatus
.pr_lwp
.pr_why
;
3308 what
= pi
->prstatus
.pr_lwp
.pr_what
;
3311 why
= pi
->prstatus
.pr_why
;
3312 what
= pi
->prstatus
.pr_what
;
3318 statval
= (what
<< 8) | 0177;
3324 int found_handler
= 0;
3326 for (i
= 0; i
< pi
->num_syscall_handlers
; i
++)
3327 if (pi
->syscall_handlers
[i
].syscall_num
== what
)
3330 if (!pi
->syscall_handlers
[i
].func (pi
, what
, why
,
3338 if (why
== PR_SYSENTRY
)
3339 error ("PR_SYSENTRY, unhandled system call %d", what
);
3341 error ("PR_SYSEXIT, unhandled system call %d", what
);
3345 statval
= (SIGSTOP
<< 8) | 0177;
3348 statval
= (what
<< 8) | 0177;
3355 statval
= (SIGTRAP
<< 8) | 0177;
3360 statval
= (SIGTRAP
<< 8) | 0177;
3363 #ifndef FAULTED_USE_SIGINFO
3364 /* Irix, contrary to the documentation, fills in 0 for si_signo.
3365 Solaris fills in si_signo. I'm not sure about others. */
3368 statval
= (SIGILL
<< 8) | 0177;
3372 statval
= (SIGTRAP
<< 8) | 0177;
3377 statval
= (SIGSEGV
<< 8) | 0177;
3382 statval
= (SIGFPE
<< 8) | 0177;
3384 case FLTPAGE
: /* Recoverable page fault */
3385 #endif /* not FAULTED_USE_SIGINFO */
3387 /* Use the signal which the kernel assigns. This is better than
3388 trying to second-guess it from the fault. In fact, I suspect
3389 that FLTACCESS can be either SIGSEGV or SIGBUS. */
3391 statval
= ((pi
->prstatus
.pr_lwp
.pr_info
.si_signo
) << 8) | 0177;
3393 statval
= ((pi
->prstatus
.pr_info
.si_signo
) << 8) | 0177;
3399 error ("PIOCWSTOP, unknown why %d, what %d", why
, what
);
3401 /* Stop all the other threads when any of them stops. */
3404 struct procinfo
*procinfo
, *next_pi
;
3406 for (procinfo
= procinfo_list
; procinfo
; procinfo
= next_pi
)
3408 next_pi
= procinfo
->next
;
3409 if (!procinfo
->had_event
)
3411 #ifdef PROCFS_USE_READ_WRITE
3413 if (write (pi
->ctl_fd
, (char *) &cmd
, sizeof (long)) < 0)
3415 print_sys_errmsg (procinfo
->pathname
, errno
);
3416 error ("PCSTOP failed");
3419 /* A bug in Solaris (2.5) causes us to hang when trying to
3420 stop a stopped process. So, we have to check first in
3421 order to avoid the hang. */
3422 if (!procfs_read_status (procinfo
))
3424 /* The LWP has apparently terminated. */
3426 printf_filtered ("LWP %d doesn't respond.\n",
3427 (procinfo
->pid
>> 16) & 0xffff);
3428 close_proc_file (procinfo
);
3432 if (!(procinfo
->prstatus
.pr_flags
& PR_STOPPED
))
3433 if (ioctl (procinfo
->ctl_fd
, PIOCSTOP
, &procinfo
->prstatus
)
3436 print_sys_errmsg (procinfo
->pathname
, errno
);
3437 warning ("PIOCSTOP failed");
3446 error ("PIOCWSTOP, stopped for unknown/unhandled reason, flags %#x",
3447 pi
->prstatus
.pr_flags
);
3450 store_waitstatus (ourstatus
, statval
);
3452 if (rtnval
== -1) /* No more children to wait for */
3454 warning ("Child process unexpectedly missing");
3455 /* Claim it exited with unknown signal. */
3456 ourstatus
->kind
= TARGET_WAITKIND_SIGNALLED
;
3457 ourstatus
->value
.sig
= TARGET_SIGNAL_UNKNOWN
;
3461 pi
->had_event
= 0; /* Indicate that we've seen this one */
3469 set_proc_siginfo - set a process's current signal info
3473 void set_proc_siginfo (struct procinfo *pip, int signo);
3477 Given a pointer to a process info struct in PIP and a signal number
3478 in SIGNO, set the process's current signal and its associated signal
3479 information. The signal will be delivered to the process immediately
3480 after execution is resumed, even if it is being held. In addition,
3481 this particular delivery will not cause another PR_SIGNALLED stop
3482 even if the signal is being traced.
3484 If we are not delivering the same signal that the prstatus siginfo
3485 struct contains information about, then synthesize a siginfo struct
3486 to match the signal we are doing to deliver, make it of the type
3487 "generated by a user process", and send this synthesized copy. When
3488 used to set the inferior's signal state, this will be required if we
3489 are not currently stopped because of a traced signal, or if we decide
3490 to continue with a different signal.
3492 Note that when continuing the inferior from a stop due to receipt
3493 of a traced signal, we either have set PRCSIG to clear the existing
3494 signal, or we have to call this function to do a PIOCSSIG with either
3495 the existing siginfo struct from pr_info, or one we have synthesized
3496 appropriately for the signal we want to deliver. Otherwise if the
3497 signal is still being traced, the inferior will immediately stop
3500 See siginfo(5) for more details.
3504 set_proc_siginfo (pip
, signo
)
3505 struct procinfo
*pip
;
3508 struct siginfo newsiginfo
;
3509 struct siginfo
*sip
;
3510 struct sigi_ctl sictl
;
3512 #ifdef PROCFS_DONT_PIOCSSIG_CURSIG
3513 /* With Alpha OSF/1 procfs, the kernel gets really confused if it
3514 receives a PIOCSSIG with a signal identical to the current signal,
3515 it messes up the current signal. Work around the kernel bug. */
3517 if (signo
== pip
-> prstatus
.pr_lwp
.pr_cursig
)
3519 if (signo
== pip
-> prstatus
.pr_cursig
)
3525 if (signo
== pip
->prstatus
.pr_lwp
.pr_info
.si_signo
)
3527 memcpy ((char *) &sictl
.siginfo
, (char *) &pip
->prstatus
.pr_lwp
.pr_info
,
3528 sizeof (siginfo_t
));
3531 if (signo
== pip
-> prstatus
.pr_info
.si_signo
)
3533 sip
= &pip
-> prstatus
.pr_info
;
3539 siginfo_t
*sip
= &sictl
.siginfo
;
3540 memset ((char *) sip
, 0, sizeof (siginfo_t
));
3542 memset ((char *) &newsiginfo
, 0, sizeof (newsiginfo
));
3545 sip
-> si_signo
= signo
;
3547 sip
-> si_errno
= 0;
3548 sip
-> si_pid
= getpid ();
3549 sip
-> si_uid
= getuid ();
3551 #ifdef PROCFS_USE_READ_WRITE
3553 if (write (pip
->ctl_fd
, (char *) &sictl
, sizeof (struct sigi_ctl
)) < 0)
3555 if (ioctl (pip
->ctl_fd
, PIOCSSIG
, sip
) < 0)
3558 print_sys_errmsg (pip
-> pathname
, errno
);
3559 warning ("PIOCSSIG failed");
3563 /* Resume execution of process PID. If STEP is nozero, then
3564 just single step it. If SIGNAL is nonzero, restart it with that
3565 signal activated. */
3568 procfs_resume (pid
, step
, signo
)
3571 enum target_signal signo
;
3574 struct procinfo
*pi
, *procinfo
, *next_pi
;
3575 struct proc_ctl pctl
;
3577 pi
= find_procinfo (pid
== -1 ? inferior_pid
: pid
, 0);
3582 pctl
.data
= PRCFAULT
;
3584 pi
->prrun
.pr_flags
= PRSTRACE
| PRSFAULT
| PRCFAULT
;
3588 /* It should not be necessary. If the user explicitly changes the value,
3589 value_assign calls write_register_bytes, which writes it. */
3590 /* It may not be absolutely necessary to specify the PC value for
3591 restarting, but to be safe we use the value that gdb considers
3592 to be current. One case where this might be necessary is if the
3593 user explicitly changes the PC value that gdb considers to be
3594 current. FIXME: Investigate if this is necessary or not. */
3596 #ifdef PRSVADDR_BROKEN
3597 /* Can't do this under Solaris running on a Sparc, as there seems to be no
3598 place to put nPC. In fact, if you use this, nPC seems to be set to some
3599 random garbage. We have to rely on the fact that PC and nPC have been
3600 written previously via PIOCSREG during a register flush. */
3602 pi
->prrun
.pr_vaddr
= (caddr_t
) *(int *) ®isters
[REGISTER_BYTE (PC_REGNUM
)];
3603 pi
->prrun
.pr_flags
!= PRSVADDR
;
3607 if (signo
== TARGET_SIGNAL_STOP
&& pi
->nopass_next_sigstop
)
3608 /* When attaching to a child process, if we forced it to stop with
3609 a PIOCSTOP, then we will have set the nopass_next_sigstop flag.
3610 Upon resuming the first time after such a stop, we explicitly
3611 inhibit sending it another SIGSTOP, which would be the normal
3612 result of default signal handling. One potential drawback to
3613 this is that we will also ignore any attempt to by the user
3614 to explicitly continue after the attach with a SIGSTOP. Ultimately
3615 this problem should be dealt with by making the routines that
3616 deal with the inferior a little smarter, and possibly even allow
3617 an inferior to continue running at the same time as gdb. (FIXME?) */
3619 else if (signo
== TARGET_SIGNAL_TSTP
3621 && pi
->prstatus
.pr_lwp
.pr_cursig
== SIGTSTP
3622 && pi
->prstatus
.pr_lwp
.pr_action
.sa_handler
== SIG_DFL
3624 && pi
->prstatus
.pr_cursig
== SIGTSTP
3625 && pi
->prstatus
.pr_action
.sa_handler
== SIG_DFL
3629 /* We are about to pass the inferior a SIGTSTP whose action is
3630 SIG_DFL. The SIG_DFL action for a SIGTSTP is to stop
3631 (notifying the parent via wait()), and then keep going from the
3632 same place when the parent is ready for you to keep going. So
3633 under the debugger, it should do nothing (as if the program had
3634 been stopped and then later resumed. Under ptrace, this
3635 happens for us, but under /proc, the system obligingly stops
3636 the process, and wait_for_inferior would have no way of
3637 distinguishing that type of stop (which indicates that we
3638 should just start it again), with a stop due to the pr_trace
3639 field of the prrun_t struct.
3641 Note that if the SIGTSTP is being caught, we *do* need to pass it,
3642 because the handler needs to get executed. */
3645 signal_to_pass
= target_signal_to_host (signo
);
3649 set_proc_siginfo (pi
, signal_to_pass
);
3654 pctl
.data
|= PRCSIG
;
3656 pi
->prrun
.pr_flags
|= PRCSIG
;
3659 pi
->nopass_next_sigstop
= 0;
3663 pctl
.data
|= PRSTEP
;
3665 pi
->prrun
.pr_flags
|= PRSTEP
;
3669 /* Don't try to start a process unless it's stopped on an
3670 `event of interest'. Doing so will cause errors. */
3672 if (!procfs_read_status (pi
))
3674 /* The LWP has apparently terminated. */
3676 printf_filtered ("LWP %d doesn't respond.\n",
3677 (pi
->pid
>> 16) & 0xffff);
3678 close_proc_file (pi
);
3682 #ifdef PROCFS_USE_READ_WRITE
3683 if (write (pi
->ctl_fd
, (char *) &pctl
, sizeof (struct proc_ctl
)) < 0)
3685 if ((pi
->prstatus
.pr_flags
& PR_ISTOP
)
3686 && ioctl (pi
->ctl_fd
, PIOCRUN
, &pi
->prrun
) != 0)
3689 /* The LWP has apparently terminated. */
3691 printf_filtered ("LWP %d doesn't respond.\n",
3692 (pi
->pid
>> 16) & 0xffff);
3693 close_proc_file (pi
);
3697 /* Continue all the other threads that haven't had an event of interest.
3698 Also continue them if they have NOPASS_NEXT_SIGSTOP set; this is only
3699 set by do_attach, and means this is the first resume after an attach.
3700 All threads were CSTOP'd by do_attach, and should be resumed now. */
3703 for (procinfo
= procinfo_list
; procinfo
; procinfo
= next_pi
)
3705 next_pi
= procinfo
->next
;
3707 if (!procinfo
->had_event
||
3708 (procinfo
->nopass_next_sigstop
&& signo
== TARGET_SIGNAL_STOP
))
3710 procinfo
->had_event
= procinfo
->nopass_next_sigstop
= 0;
3711 #ifdef PROCFS_USE_READ_WRITE
3712 pctl
.data
= PRCFAULT
| PRCSIG
;
3713 if (write (procinfo
->ctl_fd
, (char *) &pctl
,
3714 sizeof (struct proc_ctl
)) < 0)
3716 if (!procfs_read_status (procinfo
))
3717 fprintf_unfiltered(gdb_stderr
,
3718 "procfs_read_status failed, errno=%d\n",
3720 print_sys_errmsg (procinfo
->pathname
, errno
);
3721 error ("PCRUN failed");
3723 procfs_read_status (procinfo
);
3725 procinfo
->prrun
.pr_flags
&= PRSTEP
;
3726 procinfo
->prrun
.pr_flags
|= PRCFAULT
| PRCSIG
;
3727 if (!procfs_read_status (procinfo
))
3729 /* The LWP has apparently terminated. */
3731 printf_filtered ("LWP %d doesn't respond.\n",
3732 (procinfo
->pid
>> 16) & 0xffff);
3733 close_proc_file (procinfo
);
3737 /* Don't try to start a process unless it's stopped on an
3738 `event of interest'. Doing so will cause errors. */
3740 if ((procinfo
->prstatus
.pr_flags
& PR_ISTOP
)
3741 && ioctl (procinfo
->ctl_fd
, PIOCRUN
, &procinfo
->prrun
) < 0)
3743 if (!procfs_read_status (procinfo
))
3744 fprintf_unfiltered(gdb_stderr
,
3745 "procfs_read_status failed, errno=%d\n",
3747 print_sys_errmsg (procinfo
->pathname
, errno
);
3748 warning ("PIOCRUN failed");
3751 procfs_read_status (procinfo
);
3760 procfs_fetch_registers -- fetch current registers from inferior
3764 void procfs_fetch_registers (int regno)
3768 Read the current values of the inferior's registers, both the
3769 general register set and floating point registers (if supported)
3770 and update gdb's idea of their current values.
3775 procfs_fetch_registers (regno
)
3778 struct procinfo
*pi
;
3780 pi
= current_procinfo
;
3783 if (procfs_read_status (pi
))
3785 supply_gregset (&pi
->prstatus
.pr_lwp
.pr_context
.uc_mcontext
.gregs
);
3786 #if defined (FP0_REGNUM)
3787 supply_fpregset (&pi
->prstatus
.pr_lwp
.pr_context
.uc_mcontext
.fpregs
);
3790 #else /* UNIXWARE */
3791 if (ioctl (pi
->ctl_fd
, PIOCGREG
, &pi
->gregset
.gregset
) != -1)
3793 supply_gregset (&pi
->gregset
.gregset
);
3795 #if defined (FP0_REGNUM)
3796 if (ioctl (pi
->ctl_fd
, PIOCGFPREG
, &pi
->fpregset
.fpregset
) != -1)
3798 supply_fpregset (&pi
->fpregset
.fpregset
);
3801 #endif /* UNIXWARE */
3808 proc_init_failed - called when /proc access initialization fails
3813 static void proc_init_failed (struct procinfo *pi,
3814 char *why, int kill_p)
3818 This function is called whenever initialization of access to a /proc
3819 entry fails. It prints a suitable error message, does some cleanup,
3820 and then invokes the standard error processing routine which dumps
3821 us back into the command loop. If KILL_P is true, sends SIGKILL.
3825 proc_init_failed (pi
, why
, kill_p
)
3826 struct procinfo
*pi
;
3830 print_sys_errmsg (pi
->pathname
, errno
);
3832 kill (pi
->pid
, SIGKILL
);
3833 close_proc_file (pi
);
3842 close_proc_file - close any currently open /proc entry
3846 static void close_proc_file (struct procinfo *pip)
3850 Close any currently open /proc entry and mark the process information
3851 entry as invalid. In order to ensure that we don't try to reuse any
3852 stale information, the pid, fd, and pathnames are explicitly
3853 invalidated, which may be overkill.
3858 close_proc_file (pip
)
3859 struct procinfo
*pip
;
3861 struct procinfo
*procinfo
;
3863 delete_thread (pip
->pid
); /* remove thread from GDB's thread list */
3864 remove_fd (pip
); /* Remove fd from poll/select list */
3866 close (pip
->ctl_fd
);
3867 #ifdef HAVE_MULTIPLE_PROC_FDS
3869 close (pip
->status_fd
);
3870 close (pip
->map_fd
);
3873 free (pip
-> pathname
);
3875 /* Unlink pip from the procinfo chain. Note pip might not be on the list. */
3877 if (procinfo_list
== pip
)
3878 procinfo_list
= pip
->next
;
3881 for (procinfo
= procinfo_list
; procinfo
; procinfo
= procinfo
->next
)
3883 if (procinfo
->next
== pip
)
3885 procinfo
->next
= pip
->next
;
3897 open_proc_file - open a /proc entry for a given process id
3901 static int open_proc_file (int pid, struct procinfo *pip, int mode)
3905 Given a process id and a mode, close the existing open /proc
3906 entry (if any) and open one for the new process id, in the
3907 specified mode. Once it is open, then mark the local process
3908 information structure as valid, which guarantees that the pid,
3909 fd, and pathname fields match an open /proc entry. Returns
3910 zero if the open fails, nonzero otherwise.
3912 Note that the pathname is left intact, even when the open fails,
3913 so that callers can use it to construct meaningful error messages
3914 rather than just "file open failed".
3916 Note that for Solaris, the process-id also includes an LWP-id, so we
3917 actually attempt to open that. If we are handed a pid with a 0 LWP-id,
3918 then we will ask the kernel what it is and add it to the pid. Hence,
3919 the pid can be changed by us.
3923 open_proc_file (pid
, pip
, mode
, control
)
3925 struct procinfo
*pip
;
3932 pip
-> had_event
= 0;
3933 pip
-> pathname
= xmalloc (MAX_PROC_NAME_SIZE
);
3942 #ifdef HAVE_MULTIPLE_PROC_FDS
3943 sprintf (pip
->pathname
, STATUS_PROC_NAME_FMT
, tmp
);
3944 if ((pip
->status_fd
= open (pip
->pathname
, O_RDONLY
)) < 0)
3949 sprintf (pip
->pathname
, AS_PROC_NAME_FMT
, tmp
);
3950 if ((pip
->as_fd
= open (pip
->pathname
, O_RDWR
)) < 0)
3952 close (pip
->status_fd
);
3956 sprintf (pip
->pathname
, MAP_PROC_NAME_FMT
, tmp
);
3957 if ((pip
->map_fd
= open (pip
->pathname
, O_RDONLY
)) < 0)
3959 close (pip
->status_fd
);
3964 sprintf (pip
->pathname
, MAP_PROC_NAME_FMT
, tmp
);
3965 if ((pip
->map_fd
= open (pip
->pathname
, O_RDONLY
)) < 0)
3967 close (pip
->status_fd
);
3974 sprintf (pip
->pathname
, CTL_PROC_NAME_FMT
, tmp
);
3975 if ((pip
->ctl_fd
= open (pip
->pathname
, O_WRONLY
)) < 0)
3977 close (pip
->status_fd
);
3979 close (pip
->map_fd
);
3984 #else /* HAVE_MULTIPLE_PROC_FDS */
3985 sprintf (pip
-> pathname
, CTL_PROC_NAME_FMT
, tmp
);
3987 if ((tmpfd
= open (pip
-> pathname
, mode
)) < 0)
3991 pip
-> ctl_fd
= tmpfd
;
3992 pip
-> as_fd
= tmpfd
;
3993 pip
-> map_fd
= tmpfd
;
3994 pip
-> status_fd
= tmpfd
;
3996 tmp
= (pid
>> 16) & 0xffff; /* Extract thread id */
3999 { /* Don't know thread id yet */
4000 if (ioctl (tmpfd
, PIOCSTATUS
, &pip
-> prstatus
) < 0)
4002 print_sys_errmsg (pip
-> pathname
, errno
);
4004 error ("open_proc_file: PIOCSTATUS failed");
4007 tmp
= pip
-> prstatus
.pr_who
; /* Get thread id from prstatus_t */
4008 pip
-> pid
= (tmp
<< 16) | pid
; /* Update pip */
4011 if ((pip
-> ctl_fd
= ioctl (tmpfd
, PIOCOPENLWP
, &tmp
)) < 0)
4017 #ifdef PIOCSET /* New method */
4020 pr_flags
= PR_ASYNC
;
4021 ioctl (pip
-> ctl_fd
, PIOCSET
, &pr_flags
);
4025 /* keep extra fds in sync */
4026 pip
->as_fd
= pip
->ctl_fd
;
4027 pip
->map_fd
= pip
->ctl_fd
;
4028 pip
->status_fd
= pip
->ctl_fd
;
4030 close (tmpfd
); /* All done with main pid */
4031 #endif /* PIOCOPENLWP */
4033 #endif /* HAVE_MULTIPLE_PROC_FDS */
4039 mappingflags (flags
)
4042 static char asciiflags
[8];
4044 strcpy (asciiflags
, "-------");
4045 #if defined (MA_PHYS)
4046 if (flags
& MA_PHYS
) asciiflags
[0] = 'd';
4048 if (flags
& MA_STACK
) asciiflags
[1] = 's';
4049 if (flags
& MA_BREAK
) asciiflags
[2] = 'b';
4050 if (flags
& MA_SHARED
) asciiflags
[3] = 's';
4051 if (flags
& MA_READ
) asciiflags
[4] = 'r';
4052 if (flags
& MA_WRITE
) asciiflags
[5] = 'w';
4053 if (flags
& MA_EXEC
) asciiflags
[6] = 'x';
4054 return (asciiflags
);
4058 info_proc_flags (pip
, summary
)
4059 struct procinfo
*pip
;
4062 struct trans
*transp
;
4064 long flags
= pip
->prstatus
.pr_flags
| pip
->prstatus
.pr_lwp
.pr_flags
;
4066 long flags
= pip
->prstatus
.pr_flags
;
4069 printf_filtered ("%-32s", "Process status flags:");
4072 printf_filtered ("\n\n");
4074 for (transp
= pr_flag_table
; transp
-> name
!= NULL
; transp
++)
4076 if (flags
& transp
-> value
)
4080 printf_filtered ("%s ", transp
-> name
);
4084 printf_filtered ("\t%-16s %s.\n", transp
-> name
, transp
-> desc
);
4088 printf_filtered ("\n");
4092 info_proc_stop (pip
, summary
)
4093 struct procinfo
*pip
;
4096 struct trans
*transp
;
4101 why
= pip
-> prstatus
.pr_lwp
.pr_why
;
4102 what
= pip
-> prstatus
.pr_lwp
.pr_what
;
4104 why
= pip
-> prstatus
.pr_why
;
4105 what
= pip
-> prstatus
.pr_what
;
4109 if (pip
-> prstatus
.pr_lwp
.pr_flags
& PR_STOPPED
)
4111 if (pip
-> prstatus
.pr_flags
& PR_STOPPED
)
4114 printf_filtered ("%-32s", "Reason for stopping:");
4117 printf_filtered ("\n\n");
4119 for (transp
= pr_why_table
; transp
-> name
!= NULL
; transp
++)
4121 if (why
== transp
-> value
)
4125 printf_filtered ("%s ", transp
-> name
);
4129 printf_filtered ("\t%-16s %s.\n",
4130 transp
-> name
, transp
-> desc
);
4136 /* Use the pr_why field to determine what the pr_what field means, and
4137 print more information. */
4142 /* pr_what is unused for this case */
4148 printf_filtered ("%s ", signalname (what
));
4152 printf_filtered ("\t%-16s %s.\n", signalname (what
),
4153 safe_strsignal (what
));
4159 printf_filtered ("%s ", syscallname (what
));
4163 printf_filtered ("\t%-16s %s.\n", syscallname (what
),
4164 "Entered this system call");
4170 printf_filtered ("%s ", syscallname (what
));
4174 printf_filtered ("\t%-16s %s.\n", syscallname (what
),
4175 "Returned from this system call");
4181 printf_filtered ("%s ",
4182 lookupname (faults_table
, what
, "fault"));
4186 printf_filtered ("\t%-16s %s.\n",
4187 lookupname (faults_table
, what
, "fault"),
4188 lookupdesc (faults_table
, what
));
4192 printf_filtered ("\n");
4197 info_proc_siginfo (pip
, summary
)
4198 struct procinfo
*pip
;
4201 struct siginfo
*sip
;
4204 if ((pip
-> prstatus
.pr_lwp
.pr_flags
& PR_STOPPED
) &&
4205 (pip
-> prstatus
.pr_lwp
.pr_why
== PR_SIGNALLED
||
4206 pip
-> prstatus
.pr_lwp
.pr_why
== PR_FAULTED
))
4208 if ((pip
-> prstatus
.pr_flags
& PR_STOPPED
) &&
4209 (pip
-> prstatus
.pr_why
== PR_SIGNALLED
||
4210 pip
-> prstatus
.pr_why
== PR_FAULTED
))
4213 printf_filtered ("%-32s", "Additional signal/fault info:");
4215 sip
= &pip
-> prstatus
.pr_lwp
.pr_info
;
4217 sip
= &pip
-> prstatus
.pr_info
;
4221 printf_filtered ("%s ", signalname (sip
-> si_signo
));
4222 if (sip
-> si_errno
> 0)
4224 printf_filtered ("%s ", errnoname (sip
-> si_errno
));
4226 if (sip
-> si_code
<= 0)
4228 printf_filtered ("sent by %s, uid %d ",
4229 target_pid_to_str (sip
-> si_pid
),
4234 printf_filtered ("%s ", sigcodename (sip
));
4235 if ((sip
-> si_signo
== SIGILL
) ||
4236 (sip
-> si_signo
== SIGFPE
) ||
4237 (sip
-> si_signo
== SIGSEGV
) ||
4238 (sip
-> si_signo
== SIGBUS
))
4240 printf_filtered ("addr=%#lx ",
4241 (unsigned long) sip
-> si_addr
);
4243 else if ((sip
-> si_signo
== SIGCHLD
))
4245 printf_filtered ("child %s, status %u ",
4246 target_pid_to_str (sip
-> si_pid
),
4249 else if ((sip
-> si_signo
== SIGPOLL
))
4251 printf_filtered ("band %u ", sip
-> si_band
);
4257 printf_filtered ("\n\n");
4258 printf_filtered ("\t%-16s %s.\n", signalname (sip
-> si_signo
),
4259 safe_strsignal (sip
-> si_signo
));
4260 if (sip
-> si_errno
> 0)
4262 printf_filtered ("\t%-16s %s.\n",
4263 errnoname (sip
-> si_errno
),
4264 safe_strerror (sip
-> si_errno
));
4266 if (sip
-> si_code
<= 0)
4268 printf_filtered ("\t%-16u %s\n", sip
-> si_pid
, /* XXX need target_pid_to_str() */
4269 "PID of process sending signal");
4270 printf_filtered ("\t%-16u %s\n", sip
-> si_uid
,
4271 "UID of process sending signal");
4275 printf_filtered ("\t%-16s %s.\n", sigcodename (sip
),
4277 if ((sip
-> si_signo
== SIGILL
) ||
4278 (sip
-> si_signo
== SIGFPE
))
4280 printf_filtered ("\t%#-16lx %s.\n",
4281 (unsigned long) sip
-> si_addr
,
4282 "Address of faulting instruction");
4284 else if ((sip
-> si_signo
== SIGSEGV
) ||
4285 (sip
-> si_signo
== SIGBUS
))
4287 printf_filtered ("\t%#-16lx %s.\n",
4288 (unsigned long) sip
-> si_addr
,
4289 "Address of faulting memory reference");
4291 else if ((sip
-> si_signo
== SIGCHLD
))
4293 printf_filtered ("\t%-16u %s.\n", sip
-> si_pid
, /* XXX need target_pid_to_str() */
4294 "Child process ID");
4295 printf_filtered ("\t%-16u %s.\n", sip
-> si_status
,
4296 "Child process exit value or signal");
4298 else if ((sip
-> si_signo
== SIGPOLL
))
4300 printf_filtered ("\t%-16u %s.\n", sip
-> si_band
,
4301 "Band event for POLL_{IN,OUT,MSG}");
4305 printf_filtered ("\n");
4310 info_proc_syscalls (pip
, summary
)
4311 struct procinfo
*pip
;
4319 #if 0 /* FIXME: Needs to use gdb-wide configured info about system calls. */
4320 if (pip
-> prstatus
.pr_flags
& PR_ASLEEP
)
4322 int syscallnum
= pip
-> prstatus
.pr_reg
[R_D0
];
4325 printf_filtered ("%-32s", "Sleeping in system call:");
4326 printf_filtered ("%s", syscallname (syscallnum
));
4330 printf_filtered ("Sleeping in system call '%s'.\n",
4331 syscallname (syscallnum
));
4337 if (ioctl (pip
-> ctl_fd
, PIOCGENTRY
, &pip
-> entryset
) < 0)
4339 print_sys_errmsg (pip
-> pathname
, errno
);
4340 error ("PIOCGENTRY failed");
4343 if (ioctl (pip
-> ctl_fd
, PIOCGEXIT
, &pip
-> exitset
) < 0)
4345 print_sys_errmsg (pip
-> pathname
, errno
);
4346 error ("PIOCGEXIT failed");
4350 printf_filtered ("System call tracing information:\n\n");
4352 printf_filtered ("\t%-12s %-8s %-8s\n",
4356 for (syscallnum
= 0; syscallnum
< MAX_SYSCALLS
; syscallnum
++)
4359 if (syscall_table
[syscallnum
] != NULL
)
4360 printf_filtered ("\t%-12s ", syscall_table
[syscallnum
]);
4362 printf_filtered ("\t%-12d ", syscallnum
);
4365 printf_filtered ("%-8s ",
4366 prismember (&pip
->prstatus
.pr_sysentry
, syscallnum
)
4368 printf_filtered ("%-8s ",
4369 prismember (&pip
->prstatus
.pr_sysexit
, syscallnum
)
4372 printf_filtered ("%-8s ",
4373 prismember (&pip
-> entryset
, syscallnum
)
4375 printf_filtered ("%-8s ",
4376 prismember (&pip
-> exitset
, syscallnum
)
4379 printf_filtered ("\n");
4381 printf_filtered ("\n");
4390 static char locbuf
[32];
4392 name
= strsigno (signo
);
4395 sprintf (locbuf
, "Signal %d", signo
);
4399 sprintf (locbuf
, "%s (%d)", name
, signo
);
4409 static char locbuf
[32];
4411 name
= strerrno (errnum
);
4414 sprintf (locbuf
, "Errno %d", errnum
);
4418 sprintf (locbuf
, "%s (%d)", name
, errnum
);
4424 info_proc_signals (pip
, summary
)
4425 struct procinfo
*pip
;
4432 #ifndef PROCFS_USE_READ_WRITE
4433 if (ioctl (pip
-> ctl_fd
, PIOCGTRACE
, &pip
-> trace
) < 0)
4435 print_sys_errmsg (pip
-> pathname
, errno
);
4436 error ("PIOCGTRACE failed");
4440 printf_filtered ("Disposition of signals:\n\n");
4441 printf_filtered ("\t%-15s %-8s %-8s %-8s %s\n\n",
4442 "Signal", "Trace", "Hold", "Pending", "Description");
4443 for (signo
= 0; signo
< NSIG
; signo
++)
4446 printf_filtered ("\t%-15s ", signalname (signo
));
4448 printf_filtered ("%-8s ",
4449 prismember (&pip
-> prstatus
.pr_sigtrace
, signo
)
4451 printf_filtered ("%-8s ",
4452 prismember (&pip
-> prstatus
.pr_lwp
.pr_context
.uc_sigmask
, signo
)
4455 printf_filtered ("%-8s ",
4456 prismember (&pip
-> trace
, signo
)
4458 printf_filtered ("%-8s ",
4459 prismember (&pip
-> prstatus
.pr_sighold
, signo
)
4464 if (prismember (&pip
->prstatus
.pr_sigpend
, signo
) ||
4465 prismember (&pip
->prstatus
.pr_lwp
.pr_lwppend
, signo
))
4466 printf_filtered("%-8s ", "yes");
4468 printf_filtered("%-8s ", "no");
4469 #else /* UNIXWARE */
4470 #ifdef PROCFS_SIGPEND_OFFSET
4471 /* Alpha OSF/1 numbers the pending signals from 1. */
4472 printf_filtered ("%-8s ",
4473 (signo
? prismember (&pip
-> prstatus
.pr_sigpend
,
4478 printf_filtered ("%-8s ",
4479 prismember (&pip
-> prstatus
.pr_sigpend
, signo
)
4482 #endif /* UNIXWARE */
4483 printf_filtered (" %s\n", safe_strsignal (signo
));
4485 printf_filtered ("\n");
4490 info_proc_faults (pip
, summary
)
4491 struct procinfo
*pip
;
4494 struct trans
*transp
;
4499 if (ioctl (pip
-> ctl_fd
, PIOCGFAULT
, &pip
->fltset
.fltset
) < 0)
4501 print_sys_errmsg (pip
-> pathname
, errno
);
4502 error ("PIOCGFAULT failed");
4506 printf_filtered ("Current traced hardware fault set:\n\n");
4507 printf_filtered ("\t%-12s %-8s\n", "Fault", "Trace");
4509 for (transp
= faults_table
; transp
-> name
!= NULL
; transp
++)
4512 printf_filtered ("\t%-12s ", transp
-> name
);
4514 printf_filtered ("%-8s", prismember (&pip
->prstatus
.pr_flttrace
, transp
-> value
)
4517 printf_filtered ("%-8s", prismember (&pip
->fltset
.fltset
, transp
-> value
)
4520 printf_filtered ("\n");
4522 printf_filtered ("\n");
4527 info_proc_mappings (pip
, summary
)
4528 struct procinfo
*pip
;
4532 struct prmap
*prmaps
;
4533 struct prmap
*prmap
;
4538 printf_filtered ("Mapped address spaces:\n\n");
4539 #ifdef BFD_HOST_64_BIT
4540 printf_filtered (" %18s %18s %10s %10s %7s\n",
4542 printf_filtered ("\t%10s %10s %10s %10s %7s\n",
4549 #ifdef PROCFS_USE_READ_WRITE
4550 if (fstat (pip
->map_fd
, &sbuf
) == 0)
4552 nmap
= sbuf
.st_size
/ sizeof (prmap_t
);
4553 prmaps
= (struct prmap
*) alloca ((nmap
+ 1) * sizeof (*prmaps
));
4554 if ((lseek (pip
->map_fd
, 0, SEEK_SET
) == 0) &&
4555 (read (pip
->map_fd
, (char *) prmaps
,
4556 nmap
* sizeof (*prmaps
)) == (nmap
* sizeof (*prmaps
))))
4559 for (prmap
= prmaps
; i
< nmap
; ++prmap
, ++i
)
4561 if (ioctl (pip
-> ctl_fd
, PIOCNMAP
, &nmap
) == 0)
4563 prmaps
= (struct prmap
*) alloca ((nmap
+ 1) * sizeof (*prmaps
));
4564 if (ioctl (pip
-> ctl_fd
, PIOCMAP
, prmaps
) == 0)
4566 for (prmap
= prmaps
; prmap
-> pr_size
; ++prmap
)
4567 #endif /* PROCFS_USE_READ_WRITE */
4569 #ifdef BFD_HOST_64_BIT
4570 printf_filtered (" %#18lx %#18lx %#10x %#10x %7s\n",
4572 printf_filtered ("\t%#10lx %#10lx %#10x %#10x %7s\n",
4574 (unsigned long)prmap
-> pr_vaddr
,
4575 (unsigned long)prmap
-> pr_vaddr
4576 + prmap
-> pr_size
- 1,
4579 mappingflags (prmap
-> pr_mflags
));
4583 printf_filtered ("\n");
4591 info_proc -- implement the "info proc" command
4595 void info_proc (char *args, int from_tty)
4599 Implement gdb's "info proc" command by using the /proc interface
4600 to print status information about any currently running process.
4602 Examples of the use of "info proc" are:
4604 info proc (prints summary info for current inferior)
4605 info proc 123 (prints summary info for process with pid 123)
4606 info proc mappings (prints address mappings)
4607 info proc times (prints process/children times)
4608 info proc id (prints pid, ppid, gid, sid, etc)
4609 FIXME: i proc id not implemented.
4610 info proc status (prints general process state info)
4611 FIXME: i proc status not implemented.
4612 info proc signals (prints info about signal handling)
4613 info proc all (prints all info)
4618 info_proc (args
, from_tty
)
4623 struct procinfo
*pip
;
4624 struct cleanup
*old_chain
;
4640 old_chain
= make_cleanup (null_cleanup
, 0);
4642 /* Default to using the current inferior if no pid specified. Note
4643 that inferior_pid may be 0, hence we set okerr. */
4645 pid
= inferior_pid
& 0x7fffffff; /* strip off sol-thread bit */
4646 if (!(pip
= find_procinfo (pid
, 1))) /* inferior_pid no good? */
4647 pip
= procinfo_list
; /* take first available */
4648 pid
= pid
& 0xffff; /* extract "real" pid */
4652 if ((argv
= buildargv (args
)) == NULL
)
4656 make_cleanup (freeargv
, (char *) argv
);
4658 while (*argv
!= NULL
)
4660 argsize
= strlen (*argv
);
4661 if (argsize
>= 1 && strncmp (*argv
, "all", argsize
) == 0)
4666 else if (argsize
>= 2 && strncmp (*argv
, "faults", argsize
) == 0)
4671 else if (argsize
>= 2 && strncmp (*argv
, "flags", argsize
) == 0)
4676 else if (argsize
>= 1 && strncmp (*argv
, "id", argsize
) == 0)
4681 else if (argsize
>= 1 && strncmp (*argv
, "mappings", argsize
) == 0)
4686 else if (argsize
>= 2 && strncmp (*argv
, "signals", argsize
) == 0)
4691 else if (argsize
>= 2 && strncmp (*argv
, "status", argsize
) == 0)
4696 else if (argsize
>= 2 && strncmp (*argv
, "syscalls", argsize
) == 0)
4701 else if (argsize
>= 1 && strncmp (*argv
, "times", argsize
) == 0)
4706 else if ((pid
= atoi (*argv
)) > 0)
4708 pip
= (struct procinfo
*) xmalloc (sizeof (struct procinfo
));
4709 memset (pip
, 0, sizeof (*pip
));
4712 if (!open_proc_file (pid
, pip
, O_RDONLY
, 0))
4714 perror_with_name (pip
-> pathname
);
4718 make_cleanup (close_proc_file
, pip
);
4720 else if (**argv
!= '\000')
4722 error ("Unrecognized or ambiguous keyword `%s'.", *argv
);
4728 /* If we don't have a valid open process at this point, then we have no
4729 inferior or didn't specify a specific pid. */
4734 No process. Start debugging a program or specify an explicit process ID.");
4737 if (!procfs_read_status (pip
))
4739 print_sys_errmsg (pip
-> pathname
, errno
);
4740 error ("procfs_read_status failed");
4743 #ifndef PROCFS_USE_READ_WRITE
4745 nlwp
= pip
->prstatus
.pr_nlwp
;
4746 lwps
= alloca ((2 * nlwp
+ 2) * sizeof (*lwps
));
4748 if (ioctl (pip
->ctl_fd
, PIOCLWPIDS
, lwps
))
4750 print_sys_errmsg (pip
-> pathname
, errno
);
4751 error ("PIOCLWPIDS failed");
4753 #else /* PIOCLWPIDS */
4755 lwps
= alloca ((2 * nlwp
+ 2) * sizeof *lwps
);
4757 #endif /* PIOCLWPIDS */
4759 for (; nlwp
> 0; nlwp
--, lwps
++)
4761 pip
= find_procinfo ((*lwps
<< 16) | pid
, 1);
4765 pip
= (struct procinfo
*) xmalloc (sizeof (struct procinfo
));
4766 memset (pip
, 0, sizeof (*pip
));
4767 if (!open_proc_file ((*lwps
<< 16) | pid
, pip
, O_RDONLY
, 0))
4770 make_cleanup (close_proc_file
, pip
);
4772 if (!procfs_read_status (pip
))
4774 print_sys_errmsg (pip
-> pathname
, errno
);
4775 error ("procfs_read_status failed");
4779 #endif /* PROCFS_USE_READ_WRITE */
4781 /* Print verbose information of the requested type(s), or just a summary
4782 of the information for all types. */
4784 printf_filtered ("\nInformation for %s.%d:\n\n", pip
-> pathname
, *lwps
);
4785 if (summary
|| all
|| flags
)
4787 info_proc_flags (pip
, summary
);
4791 info_proc_stop (pip
, summary
);
4792 supply_gregset (&pip
->prstatus
.pr_reg
);
4793 printf_filtered ("PC: ");
4794 print_address (read_pc (), gdb_stdout
);
4795 printf_filtered ("\n");
4797 if (summary
|| all
|| signals
|| faults
)
4799 info_proc_siginfo (pip
, summary
);
4801 if (summary
|| all
|| syscalls
)
4803 info_proc_syscalls (pip
, summary
);
4805 if (summary
|| all
|| mappings
)
4807 info_proc_mappings (pip
, summary
);
4809 if (summary
|| all
|| signals
)
4811 info_proc_signals (pip
, summary
);
4813 if (summary
|| all
|| faults
)
4815 info_proc_faults (pip
, summary
);
4817 printf_filtered ("\n");
4819 /* All done, deal with closing any temporary process info structure,
4820 freeing temporary memory , etc. */
4822 do_cleanups (old_chain
);
4823 #ifndef PROCFS_USE_READ_WRITE
4832 modify_inherit_on_fork_flag - Change the inherit-on-fork flag
4836 void modify_inherit_on_fork_flag (fd, flag)
4840 Call this routine to modify the inherit-on-fork flag. This routine is
4841 just a nice wrapper to hide the #ifdefs needed by various systems to
4847 modify_inherit_on_fork_flag (fd
, flag
)
4851 #if defined (PIOCSET) || defined (PCSET)
4855 struct proc_ctl pctl
;
4857 #if defined (PIOCSET) || defined (PCSET) /* New method */
4861 #ifdef PROCFS_USE_READ_WRITE
4863 pctl
.data
= PR_FORK
;
4864 if (write (fd
, (char *) &pctl
, sizeof (struct proc_ctl
)) < 0)
4867 retval
= ioctl (fd
, PIOCSET
, &pr_flags
);
4872 #ifdef PROCFS_USE_READ_WRITE
4874 pctl
.data
= PR_FORK
;
4875 if (write (fd
, (char *) &pctl
, sizeof (struct proc_ctl
)) < 0)
4878 retval
= ioctl (fd
, PIOCRESET
, &pr_flags
);
4883 #ifdef PIOCSFORK /* Original method */
4886 retval
= ioctl (fd
, PIOCSFORK
, NULL
);
4890 retval
= ioctl (fd
, PIOCRFORK
, NULL
);
4893 Neither PR_FORK nor PIOCSFORK exist
!!!
4900 print_sys_errmsg ("modify_inherit_on_fork_flag", errno
);
4901 error ("PIOCSFORK or PR_FORK modification failed");
4908 modify_run_on_last_close_flag - Change the run-on-last-close flag
4912 void modify_run_on_last_close_flag (fd, flag)
4916 Call this routine to modify the run-on-last-close flag. This routine
4917 is just a nice wrapper to hide the #ifdefs needed by various systems to
4923 modify_run_on_last_close_flag (fd
, flag
)
4927 #if defined (PIOCSET) || defined (PCSET)
4931 struct proc_ctl pctl
;
4933 #if defined (PIOCSET) || defined (PCSET) /* New method */
4937 #ifdef PROCFS_USE_READ_WRITE
4940 if (write (fd
, (char *) &pctl
, sizeof (struct proc_ctl
)) < 0)
4943 retval
= ioctl (fd
, PIOCSET
, &pr_flags
);
4948 #ifdef PROCFS_USE_READ_WRITE
4951 if (write (fd
, (char *) &pctl
, sizeof (struct proc_ctl
)) < 0)
4954 retval
= ioctl (fd
, PIOCRESET
, &pr_flags
);
4959 #ifdef PIOCSRLC /* Original method */
4961 retval
= ioctl (fd
, PIOCSRLC
, NULL
);
4963 retval
= ioctl (fd
, PIOCRRLC
, NULL
);
4965 Neither PR_RLC nor PIOCSRLC exist
!!!
4972 print_sys_errmsg ("modify_run_on_last_close_flag", errno
);
4973 error ("PIOCSRLC or PR_RLC modification failed");
4980 procfs_clear_syscall_trap -- Deletes the trap for the specified system call.
4984 void procfs_clear_syscall_trap (struct procinfo *, int syscall_num, int errok)
4988 This function function disables traps for the specified system call.
4989 errok is non-zero if errors should be ignored.
4993 procfs_clear_syscall_trap (pi
, syscall_num
, errok
)
4994 struct procinfo
*pi
;
5001 goterr
= ioctl (pi
->ctl_fd
, PIOCGENTRY
, &sysset
) < 0;
5003 if (goterr
&& !errok
)
5005 print_sys_errmsg (pi
->pathname
, errno
);
5006 error ("PIOCGENTRY failed");
5011 prdelset (&sysset
, syscall_num
);
5013 if ((ioctl (pi
->ctl_fd
, PIOCSENTRY
, &sysset
) < 0) && !errok
)
5015 print_sys_errmsg (pi
->pathname
, errno
);
5016 error ("PIOCSENTRY failed");
5020 goterr
= ioctl (pi
->ctl_fd
, PIOCGEXIT
, &sysset
) < 0;
5022 if (goterr
&& !errok
)
5024 procfs_clear_syscall_trap (pi
, syscall_num
, 1);
5025 print_sys_errmsg (pi
->pathname
, errno
);
5026 error ("PIOCGEXIT failed");
5031 praddset (&sysset
, syscall_num
);
5033 if ((ioctl (pi
->ctl_fd
, PIOCSEXIT
, &sysset
) < 0) && !errok
)
5035 procfs_clear_syscall_trap (pi
, syscall_num
, 1);
5036 print_sys_errmsg (pi
->pathname
, errno
);
5037 error ("PIOCSEXIT failed");
5041 if (!pi
->syscall_handlers
)
5044 error ("procfs_clear_syscall_trap: syscall_handlers is empty");
5048 /* Remove handler func from the handler list */
5050 for (i
= 0; i
< pi
->num_syscall_handlers
; i
++)
5051 if (pi
->syscall_handlers
[i
].syscall_num
== syscall_num
)
5053 if (i
+ 1 != pi
->num_syscall_handlers
)
5054 { /* Not the last entry.
5055 Move subsequent entries fwd. */
5056 memcpy (&pi
->syscall_handlers
[i
], &pi
->syscall_handlers
[i
+ 1],
5057 (pi
->num_syscall_handlers
- i
- 1)
5058 * sizeof (struct procfs_syscall_handler
));
5061 pi
->syscall_handlers
= xrealloc (pi
->syscall_handlers
,
5062 (pi
->num_syscall_handlers
- 1)
5063 * sizeof (struct procfs_syscall_handler
));
5064 pi
->num_syscall_handlers
--;
5069 error ("procfs_clear_syscall_trap: Couldn't find handler for sys call %d",
5077 procfs_set_syscall_trap -- arrange for a function to be called when the
5078 child executes the specified system call.
5082 void procfs_set_syscall_trap (struct procinfo *, int syscall_num, int flags,
5083 syscall_func_t *function)
5087 This function sets up an entry and/or exit trap for the specified system
5088 call. When the child executes the specified system call, your function
5089 will be called with the call #, a flag that indicates entry or exit, and
5090 pointers to rtnval and statval (which are used by procfs_wait). The
5091 function should return non-zero if something interesting happened, zero
5096 procfs_set_syscall_trap (pi
, syscall_num
, flags
, func
)
5097 struct procinfo
*pi
;
5100 syscall_func_t
*func
;
5104 if (flags
& PROCFS_SYSCALL_ENTRY
)
5106 if (ioctl (pi
->ctl_fd
, PIOCGENTRY
, &sysset
) < 0)
5108 print_sys_errmsg (pi
->pathname
, errno
);
5109 error ("PIOCGENTRY failed");
5112 praddset (&sysset
, syscall_num
);
5114 if (ioctl (pi
->ctl_fd
, PIOCSENTRY
, &sysset
) < 0)
5116 print_sys_errmsg (pi
->pathname
, errno
);
5117 error ("PIOCSENTRY failed");
5121 if (flags
& PROCFS_SYSCALL_EXIT
)
5123 if (ioctl (pi
->ctl_fd
, PIOCGEXIT
, &sysset
) < 0)
5125 procfs_clear_syscall_trap (pi
, syscall_num
, 1);
5126 print_sys_errmsg (pi
->pathname
, errno
);
5127 error ("PIOCGEXIT failed");
5130 praddset (&sysset
, syscall_num
);
5132 if (ioctl (pi
->ctl_fd
, PIOCSEXIT
, &sysset
) < 0)
5134 procfs_clear_syscall_trap (pi
, syscall_num
, 1);
5135 print_sys_errmsg (pi
->pathname
, errno
);
5136 error ("PIOCSEXIT failed");
5140 if (!pi
->syscall_handlers
)
5142 pi
->syscall_handlers
= xmalloc (sizeof (struct procfs_syscall_handler
));
5143 pi
->syscall_handlers
[0].syscall_num
= syscall_num
;
5144 pi
->syscall_handlers
[0].func
= func
;
5145 pi
->num_syscall_handlers
= 1;
5151 for (i
= 0; i
< pi
->num_syscall_handlers
; i
++)
5152 if (pi
->syscall_handlers
[i
].syscall_num
== syscall_num
)
5154 pi
->syscall_handlers
[i
].func
= func
;
5158 pi
->syscall_handlers
= xrealloc (pi
->syscall_handlers
, (i
+ 1)
5159 * sizeof (struct procfs_syscall_handler
));
5160 pi
->syscall_handlers
[i
].syscall_num
= syscall_num
;
5161 pi
->syscall_handlers
[i
].func
= func
;
5162 pi
->num_syscall_handlers
++;
5166 #ifdef SYS_lwp_create
5172 procfs_lwp_creation_handler - handle exit from the _lwp_create syscall
5176 int procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
5180 This routine is called both when an inferior process and it's new lwp
5181 are about to finish a _lwp_create() system call. This is the system
5182 call that Solaris uses to create a lightweight process. When the
5183 target process gets this event, we can look at sysarg[2] to find the
5184 new childs lwp ID, and create a procinfo struct from that. After that,
5185 we pretend that we got a SIGTRAP, and return non-zero to tell
5186 procfs_wait to wake up. Subsequently, wait_for_inferior gets woken up,
5187 sees the new process and continues it.
5189 When we see the child exiting from lwp_create, we just contine it,
5190 since everything was handled when the parent trapped.
5193 In effect, we are only paying attention to the parent's completion of
5194 the lwp_create syscall. If we only paid attention to the child
5195 instead, then we wouldn't detect the creation of a suspended thread.
5199 procfs_lwp_creation_handler (pi
, syscall_num
, why
, rtnvalp
, statvalp
)
5200 struct procinfo
*pi
;
5207 struct procinfo
*childpi
;
5209 /* We've just detected the completion of an lwp_create system call. Now we
5210 need to setup a procinfo struct for this thread, and notify the thread
5211 system of the new arrival. */
5213 /* If lwp_create failed, then nothing interesting happened. Continue the
5214 process and go back to sleep. */
5216 if (pi
->prstatus
.pr_reg
[R_PSR
] & PS_FLAG_CARRY
)
5217 { /* _lwp_create failed */
5218 pi
->prrun
.pr_flags
&= PRSTEP
;
5219 pi
->prrun
.pr_flags
|= PRCFAULT
;
5221 if (ioctl (pi
->ctl_fd
, PIOCRUN
, &pi
->prrun
) != 0)
5222 perror_with_name (pi
->pathname
);
5227 /* At this point, the new thread is stopped at it's first instruction, and
5228 the parent is stopped at the exit from lwp_create. */
5230 if (pi
->new_child
) /* Child? */
5231 { /* Yes, just continue it */
5232 pi
->prrun
.pr_flags
&= PRSTEP
;
5233 pi
->prrun
.pr_flags
|= PRCFAULT
;
5235 if ((pi
->prstatus
.pr_flags
& PR_ISTOP
)
5236 && ioctl (pi
->ctl_fd
, PIOCRUN
, &pi
->prrun
) != 0)
5237 perror_with_name (pi
->pathname
);
5239 pi
->new_child
= 0; /* No longer new */
5244 /* We're the proud parent of a new thread. Setup an exit trap for lwp_create
5245 in the child and continue the parent. */
5247 /* Third arg is pointer to new thread id. */
5248 lwp_id
= read_memory_integer (pi
->prstatus
.pr_sysarg
[2], sizeof (int));
5250 lwp_id
= (lwp_id
<< 16) | PIDGET (pi
->pid
);
5252 childpi
= create_procinfo (lwp_id
);
5254 /* The new process has actually inherited the lwp_create syscall trap from
5255 it's parent, but we still have to call this to register handlers for
5258 procfs_set_inferior_syscall_traps (childpi
);
5259 add_thread (lwp_id
);
5260 printf_filtered ("[New %s]\n", target_pid_to_str (lwp_id
));
5262 /* Continue the parent */
5264 pi
->prrun
.pr_flags
&= PRSTEP
;
5265 pi
->prrun
.pr_flags
|= PRCFAULT
;
5266 if (ioctl (pi
->ctl_fd
, PIOCRUN
, &pi
->prrun
) != 0)
5267 perror_with_name (pi
->pathname
);
5269 /* The new child may have been created in one of two states:
5270 SUSPENDED or RUNNABLE. If runnable, we will simply signal it to run.
5271 If suspended, we flag it to be continued later, when it has an event. */
5273 if (childpi
->prstatus
.pr_why
== PR_SUSPENDED
)
5274 childpi
->new_child
= 1; /* Flag this as an unseen child process */
5277 /* Continue the child */
5278 childpi
->prrun
.pr_flags
&= PRSTEP
;
5279 childpi
->prrun
.pr_flags
|= PRCFAULT
;
5281 if (ioctl (childpi
->ctl_fd
, PIOCRUN
, &childpi
->prrun
) != 0)
5282 perror_with_name (childpi
->pathname
);
5286 #endif /* SYS_lwp_create */
5288 /* Fork an inferior process, and start debugging it with /proc. */
5291 procfs_create_inferior (exec_file
, allargs
, env
)
5296 char *shell_file
= getenv ("SHELL");
5298 if (shell_file
!= NULL
&& strchr (shell_file
, '/') == NULL
)
5301 /* We will be looking down the PATH to find shell_file. If we
5302 just do this the normal way (via execlp, which operates by
5303 attempting an exec for each element of the PATH until it
5304 finds one which succeeds), then there will be an exec for
5305 each failed attempt, each of which will cause a PR_SYSEXIT
5306 stop, and we won't know how to distinguish the PR_SYSEXIT's
5307 for these failed execs with the ones for successful execs
5308 (whether the exec has succeeded is stored at that time in the
5309 carry bit or some such architecture-specific and
5310 non-ABI-specified place).
5312 So I can't think of anything better than to search the PATH
5313 now. This has several disadvantages: (1) There is a race
5314 condition; if we find a file now and it is deleted before we
5315 exec it, we lose, even if the deletion leaves a valid file
5316 further down in the PATH, (2) there is no way to know exactly
5317 what an executable (in the sense of "capable of being
5318 exec'd") file is. Using access() loses because it may lose
5319 if the caller is the superuser; failing to use it loses if
5320 there are ACLs or some such. */
5324 /* FIXME-maybe: might want "set path" command so user can change what
5325 path is used from within GDB. */
5326 char *path
= getenv ("PATH");
5328 struct stat statbuf
;
5331 path
= "/bin:/usr/bin";
5333 tryname
= alloca (strlen (path
) + strlen (shell_file
) + 2);
5334 for (p
= path
; p
!= NULL
; p
= p1
? p1
+ 1: NULL
)
5336 p1
= strchr (p
, ':');
5341 strncpy (tryname
, p
, len
);
5342 tryname
[len
] = '\0';
5343 strcat (tryname
, "/");
5344 strcat (tryname
, shell_file
);
5345 if (access (tryname
, X_OK
) < 0)
5347 if (stat (tryname
, &statbuf
) < 0)
5349 if (!S_ISREG (statbuf
.st_mode
))
5350 /* We certainly need to reject directories. I'm not quite
5351 as sure about FIFOs, sockets, etc., but I kind of doubt
5352 that people want to exec() these things. */
5357 /* Not found. This must be an error rather than merely passing
5358 the file to execlp(), because execlp() would try all the
5359 exec()s, causing GDB to get confused. */
5360 error ("Can't find shell %s in PATH", shell_file
);
5362 shell_file
= tryname
;
5365 fork_inferior (exec_file
, allargs
, env
,
5366 proc_set_exec_trap
, procfs_init_inferior
, shell_file
);
5368 /* We are at the first instruction we care about. */
5369 /* Pedal to the metal... */
5371 proceed ((CORE_ADDR
) -1, TARGET_SIGNAL_0
, 0);
5374 /* Clean up after the inferior dies. */
5377 procfs_mourn_inferior ()
5379 struct procinfo
*pi
;
5380 struct procinfo
*next_pi
;
5382 for (pi
= procinfo_list
; pi
; pi
= next_pi
)
5385 unconditionally_kill_inferior (pi
);
5388 unpush_target (&procfs_ops
);
5389 generic_mourn_inferior ();
5393 /* Mark our target-struct as eligible for stray "run" and "attach" commands. */
5397 /* This variable is controlled by modules that sit atop procfs that may layer
5398 their own process structure atop that provided here. sol-thread.c does
5399 this because of the Solaris two-level thread model. */
5401 return !procfs_suppress_run
;
5403 #ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
5405 /* Insert a watchpoint */
5407 procfs_set_watchpoint(pid
, addr
, len
, rw
)
5413 struct procinfo
*pi
;
5416 pi
= find_procinfo (pid
== -1 ? inferior_pid
: pid
, 0);
5417 wpt
.pr_vaddr
= (caddr_t
)addr
;
5419 wpt
.pr_wflags
= ((rw
& 1) ? MA_READ
: 0) | ((rw
& 2) ? MA_WRITE
: 0);
5420 if (ioctl (pi
->ctl_fd
, PIOCSWATCH
, &wpt
) < 0)
5424 /* Currently it sometimes happens that the same watchpoint gets
5425 deleted twice - don't die in this case (FIXME please) */
5426 if (errno
== ESRCH
&& len
== 0)
5428 print_sys_errmsg (pi
->pathname
, errno
);
5429 error ("PIOCSWATCH failed");
5435 procfs_stopped_by_watchpoint(pid
)
5438 struct procinfo
*pi
;
5442 pi
= find_procinfo (pid
== -1 ? inferior_pid
: pid
, 0);
5443 if (pi
->prstatus
.pr_flags
& (PR_STOPPED
| PR_ISTOP
))
5445 why
= pi
->prstatus
.pr_why
;
5446 what
= pi
->prstatus
.pr_what
;
5447 if (why
== PR_FAULTED
5448 #if defined (FLTWATCH) && defined (FLTKWATCH)
5449 && (what
== FLTWATCH
|| what
== FLTKWATCH
)
5452 && (what
== FLTWATCH
)
5455 && (what
== FLTKWATCH
)
5463 #endif /* TARGET_HAS_HARDWARE_WATCHPOINTS */
5465 /* Why is this necessary? Shouldn't dead threads just be removed from the
5469 procfs_thread_alive (pid
)
5472 struct procinfo
*pi
, *next_pi
;
5474 for (pi
= procinfo_list
; pi
; pi
= next_pi
)
5477 if (pi
-> pid
== pid
)
5478 if (procfs_read_status (pi
)) /* alive */
5480 else /* defunct (exited) */
5482 close_proc_file (pi
);
5490 procfs_first_available ()
5492 struct procinfo
*pi
;
5494 for (pi
= procinfo_list
; pi
; pi
= pi
->next
)
5496 if (procfs_read_status (pi
))
5502 /* Send a SIGINT to the process group. This acts just like the user typed a
5503 ^C on the controlling terminal.
5505 XXX - This may not be correct for all systems. Some may want to use
5506 killpg() instead of kill (-pgrp). */
5511 extern pid_t inferior_process_group
;
5513 kill (-inferior_process_group
, SIGINT
);
5516 /* Convert a pid to printable form. */
5520 procfs_pid_to_str (pid
)
5523 static char buf
[100];
5525 sprintf (buf
, "Kernel thread %d", TIDGET (pid
));
5531 struct target_ops procfs_ops
= {
5532 "procfs", /* to_shortname */
5533 "Unix /proc child process", /* to_longname */
5534 "Unix /proc child process (started by the \"run\" command).", /* to_doc */
5535 procfs_open
, /* to_open */
5537 procfs_attach
, /* to_attach */
5538 procfs_detach
, /* to_detach */
5539 procfs_resume
, /* to_resume */
5540 procfs_wait
, /* to_wait */
5541 procfs_fetch_registers
, /* to_fetch_registers */
5542 procfs_store_registers
, /* to_store_registers */
5543 procfs_prepare_to_store
, /* to_prepare_to_store */
5544 procfs_xfer_memory
, /* to_xfer_memory */
5545 procfs_files_info
, /* to_files_info */
5546 memory_insert_breakpoint
, /* to_insert_breakpoint */
5547 memory_remove_breakpoint
, /* to_remove_breakpoint */
5548 terminal_init_inferior
, /* to_terminal_init */
5549 terminal_inferior
, /* to_terminal_inferior */
5550 terminal_ours_for_output
, /* to_terminal_ours_for_output */
5551 terminal_ours
, /* to_terminal_ours */
5552 child_terminal_info
, /* to_terminal_info */
5553 procfs_kill_inferior
, /* to_kill */
5555 0, /* to_lookup_symbol */
5556 procfs_create_inferior
, /* to_create_inferior */
5557 procfs_mourn_inferior
, /* to_mourn_inferior */
5558 procfs_can_run
, /* to_can_run */
5559 procfs_notice_signals
, /* to_notice_signals */
5560 procfs_thread_alive
, /* to_thread_alive */
5561 procfs_stop
, /* to_stop */
5562 process_stratum
, /* to_stratum */
5564 1, /* to_has_all_memory */
5565 1, /* to_has_memory */
5566 1, /* to_has_stack */
5567 1, /* to_has_registers */
5568 1, /* to_has_execution */
5570 0, /* sections_end */
5571 OPS_MAGIC
/* to_magic */
5575 _initialize_procfs ()
5577 #ifdef HAVE_OPTIONAL_PROC_FS
5578 char procname
[MAX_PROC_NAME_SIZE
];
5581 /* If we have an optional /proc filesystem (e.g. under OSF/1),
5582 don't add procfs support if we cannot access the running
5584 sprintf (procname
, STATUS_PROC_NAME_FMT
, getpid ());
5585 if ((fd
= open (procname
, O_RDONLY
)) < 0)
5590 add_target (&procfs_ops
);
5592 add_info ("processes", info_proc
,
5593 "Show process status information using /proc entry.\n\
5594 Specify process id or use current inferior by default.\n\
5595 Specify keywords for detailed information; default is summary.\n\
5596 Keywords are: `all', `faults', `flags', `id', `mappings', `signals',\n\
5597 `status', `syscalls', and `times'.\n\
5598 Unambiguous abbreviations may be used.");
5600 init_syscall_table ();