Undo the following change. Not correct, after all:
[deliverable/binutils-gdb.git] / gdb / procfs.c
1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
2
3 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5
6 Written by Michael Snyder at Cygnus Solutions.
7 Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
8
9 This file is part of GDB.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23
24 #include "defs.h"
25 #include "inferior.h"
26 #include "target.h"
27 #include "gdbcore.h"
28 #include "elf-bfd.h" /* for elfcore_write_* */
29 #include "gdbcmd.h"
30 #include "gdbthread.h"
31 #include "regcache.h"
32 #include "inf-child.h"
33
34 #if defined (NEW_PROC_API)
35 #define _STRUCTURED_PROC 1 /* Should be done by configure script. */
36 #endif
37
38 #include <sys/procfs.h>
39 #ifdef HAVE_SYS_FAULT_H
40 #include <sys/fault.h>
41 #endif
42 #ifdef HAVE_SYS_SYSCALL_H
43 #include <sys/syscall.h>
44 #endif
45 #include <sys/errno.h>
46 #include "gdb_wait.h"
47 #include <signal.h>
48 #include <ctype.h>
49 #include "gdb_string.h"
50 #include "gdb_assert.h"
51 #include "inflow.h"
52 #include "auxv.h"
53
54 /*
55 * PROCFS.C
56 *
57 * This module provides the interface between GDB and the
58 * /proc file system, which is used on many versions of Unix
59 * as a means for debuggers to control other processes.
60 * Examples of the systems that use this interface are:
61 * Irix
62 * Solaris
63 * OSF
64 * Unixware
65 * AIX5
66 *
67 * /proc works by imitating a file system: you open a simulated file
68 * that represents the process you wish to interact with, and
69 * perform operations on that "file" in order to examine or change
70 * the state of the other process.
71 *
72 * The most important thing to know about /proc and this module
73 * is that there are two very different interfaces to /proc:
74 * One that uses the ioctl system call, and
75 * another that uses read and write system calls.
76 * This module has to support both /proc interfaces. This means
77 * that there are two different ways of doing every basic operation.
78 *
79 * In order to keep most of the code simple and clean, I have
80 * defined an interface "layer" which hides all these system calls.
81 * An ifdef (NEW_PROC_API) determines which interface we are using,
82 * and most or all occurrances of this ifdef should be confined to
83 * this interface layer.
84 */
85
86
87 /* Determine which /proc API we are using:
88 The ioctl API defines PIOCSTATUS, while
89 the read/write (multiple fd) API never does. */
90
91 #ifdef NEW_PROC_API
92 #include <sys/types.h>
93 #include "gdb_dirent.h" /* opendir/readdir, for listing the LWP's */
94 #endif
95
96 #include <fcntl.h> /* for O_RDONLY */
97 #include <unistd.h> /* for "X_OK" */
98 #include "gdb_stat.h" /* for struct stat */
99
100 /* Note: procfs-utils.h must be included after the above system header
101 files, because it redefines various system calls using macros.
102 This may be incompatible with the prototype declarations. */
103
104 #include "proc-utils.h"
105
106 /* Prototypes for supply_gregset etc. */
107 #include "gregset.h"
108
109 /* =================== TARGET_OPS "MODULE" =================== */
110
111 /*
112 * This module defines the GDB target vector and its methods.
113 */
114
115 static void procfs_attach (struct target_ops *, char *, int);
116 static void procfs_detach (struct target_ops *, char *, int);
117 static void procfs_resume (struct target_ops *,
118 ptid_t, int, enum target_signal);
119 static void procfs_stop (ptid_t);
120 static void procfs_files_info (struct target_ops *);
121 static void procfs_fetch_registers (struct target_ops *,
122 struct regcache *, int);
123 static void procfs_store_registers (struct target_ops *,
124 struct regcache *, int);
125 static void procfs_notice_signals (ptid_t);
126 static void procfs_kill_inferior (struct target_ops *ops);
127 static void procfs_mourn_inferior (struct target_ops *ops);
128 static void procfs_create_inferior (struct target_ops *, char *,
129 char *, char **, int);
130 static ptid_t procfs_wait (struct target_ops *,
131 ptid_t, struct target_waitstatus *);
132 static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
133 struct mem_attrib *attrib,
134 struct target_ops *);
135 static LONGEST procfs_xfer_partial (struct target_ops *ops,
136 enum target_object object,
137 const char *annex,
138 gdb_byte *readbuf, const gdb_byte *writebuf,
139 ULONGEST offset, LONGEST len);
140
141 static int procfs_thread_alive (struct target_ops *ops, ptid_t);
142
143 void procfs_find_new_threads (struct target_ops *ops);
144 char *procfs_pid_to_str (struct target_ops *, ptid_t);
145
146 static int proc_find_memory_regions (int (*) (CORE_ADDR,
147 unsigned long,
148 int, int, int,
149 void *),
150 void *);
151
152 static char * procfs_make_note_section (bfd *, int *);
153
154 static int procfs_can_use_hw_breakpoint (int, int, int);
155
156 #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
157 /* When GDB is built as 64-bit application on Solaris, the auxv data is
158 presented in 64-bit format. We need to provide a custom parser to handle
159 that. */
160 static int
161 procfs_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
162 gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
163 {
164 gdb_byte *ptr = *readptr;
165
166 if (endptr == ptr)
167 return 0;
168
169 if (endptr - ptr < 8 * 2)
170 return -1;
171
172 *typep = extract_unsigned_integer (ptr, 4);
173 ptr += 8;
174 /* The size of data is always 64-bit. If the application is 32-bit,
175 it will be zero extended, as expected. */
176 *valp = extract_unsigned_integer (ptr, 8);
177 ptr += 8;
178
179 *readptr = ptr;
180 return 1;
181 }
182 #endif
183
184 static struct target_ops *
185 procfs_target (void)
186 {
187 struct target_ops *t = inf_child_target ();
188
189 t->to_shortname = "procfs";
190 t->to_longname = "Unix /proc child process";
191 t->to_doc =
192 "Unix /proc child process (started by the \"run\" command).";
193 t->to_create_inferior = procfs_create_inferior;
194 t->to_kill = procfs_kill_inferior;
195 t->to_mourn_inferior = procfs_mourn_inferior;
196 t->to_attach = procfs_attach;
197 t->to_detach = procfs_detach;
198 t->to_wait = procfs_wait;
199 t->to_resume = procfs_resume;
200 t->to_fetch_registers = procfs_fetch_registers;
201 t->to_store_registers = procfs_store_registers;
202 t->to_xfer_partial = procfs_xfer_partial;
203 t->deprecated_xfer_memory = procfs_xfer_memory;
204 t->to_notice_signals = procfs_notice_signals;
205 t->to_files_info = procfs_files_info;
206 t->to_stop = procfs_stop;
207
208 t->to_find_new_threads = procfs_find_new_threads;
209 t->to_thread_alive = procfs_thread_alive;
210 t->to_pid_to_str = procfs_pid_to_str;
211
212 t->to_has_thread_control = tc_schedlock;
213 t->to_find_memory_regions = proc_find_memory_regions;
214 t->to_make_corefile_notes = procfs_make_note_section;
215 t->to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint;
216
217 #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
218 t->to_auxv_parse = procfs_auxv_parse;
219 #endif
220
221 t->to_magic = OPS_MAGIC;
222
223 return t;
224 }
225
226 /* =================== END, TARGET_OPS "MODULE" =================== */
227
228 /*
229 * World Unification:
230 *
231 * Put any typedefs, defines etc. here that are required for
232 * the unification of code that handles different versions of /proc.
233 */
234
235 #ifdef NEW_PROC_API /* Solaris 7 && 8 method for watchpoints */
236 #ifdef WA_READ
237 enum { READ_WATCHFLAG = WA_READ,
238 WRITE_WATCHFLAG = WA_WRITE,
239 EXEC_WATCHFLAG = WA_EXEC,
240 AFTER_WATCHFLAG = WA_TRAPAFTER
241 };
242 #endif
243 #else /* Irix method for watchpoints */
244 enum { READ_WATCHFLAG = MA_READ,
245 WRITE_WATCHFLAG = MA_WRITE,
246 EXEC_WATCHFLAG = MA_EXEC,
247 AFTER_WATCHFLAG = 0 /* trapafter not implemented */
248 };
249 #endif
250
251 /* gdb_sigset_t */
252 #ifdef HAVE_PR_SIGSET_T
253 typedef pr_sigset_t gdb_sigset_t;
254 #else
255 typedef sigset_t gdb_sigset_t;
256 #endif
257
258 /* sigaction */
259 #ifdef HAVE_PR_SIGACTION64_T
260 typedef pr_sigaction64_t gdb_sigaction_t;
261 #else
262 typedef struct sigaction gdb_sigaction_t;
263 #endif
264
265 /* siginfo */
266 #ifdef HAVE_PR_SIGINFO64_T
267 typedef pr_siginfo64_t gdb_siginfo_t;
268 #else
269 typedef struct siginfo gdb_siginfo_t;
270 #endif
271
272 /* gdb_premptysysset */
273 #ifdef premptysysset
274 #define gdb_premptysysset premptysysset
275 #else
276 #define gdb_premptysysset premptyset
277 #endif
278
279 /* praddsysset */
280 #ifdef praddsysset
281 #define gdb_praddsysset praddsysset
282 #else
283 #define gdb_praddsysset praddset
284 #endif
285
286 /* prdelsysset */
287 #ifdef prdelsysset
288 #define gdb_prdelsysset prdelsysset
289 #else
290 #define gdb_prdelsysset prdelset
291 #endif
292
293 /* prissyssetmember */
294 #ifdef prissyssetmember
295 #define gdb_pr_issyssetmember prissyssetmember
296 #else
297 #define gdb_pr_issyssetmember prismember
298 #endif
299
300 /* As a feature test, saying ``#if HAVE_PRSYSENT_T'' everywhere isn't
301 as intuitively descriptive as it could be, so we'll define
302 DYNAMIC_SYSCALLS to mean the same thing. Anyway, at the time of
303 this writing, this feature is only found on AIX5 systems and
304 basically means that the set of syscalls is not fixed. I.e,
305 there's no nice table that one can #include to get all of the
306 syscall numbers. Instead, they're stored in /proc/PID/sysent
307 for each process. We are at least guaranteed that they won't
308 change over the lifetime of the process. But each process could
309 (in theory) have different syscall numbers.
310 */
311 #ifdef HAVE_PRSYSENT_T
312 #define DYNAMIC_SYSCALLS
313 #endif
314
315
316
317 /* =================== STRUCT PROCINFO "MODULE" =================== */
318
319 /* FIXME: this comment will soon be out of date W.R.T. threads. */
320
321 /* The procinfo struct is a wrapper to hold all the state information
322 concerning a /proc process. There should be exactly one procinfo
323 for each process, and since GDB currently can debug only one
324 process at a time, that means there should be only one procinfo.
325 All of the LWP's of a process can be accessed indirectly thru the
326 single process procinfo.
327
328 However, against the day when GDB may debug more than one process,
329 this data structure is kept in a list (which for now will hold no
330 more than one member), and many functions will have a pointer to a
331 procinfo as an argument.
332
333 There will be a separate procinfo structure for use by the (not yet
334 implemented) "info proc" command, so that we can print useful
335 information about any random process without interfering with the
336 inferior's procinfo information. */
337
338 #ifdef NEW_PROC_API
339 /* format strings for /proc paths */
340 # ifndef CTL_PROC_NAME_FMT
341 # define MAIN_PROC_NAME_FMT "/proc/%d"
342 # define CTL_PROC_NAME_FMT "/proc/%d/ctl"
343 # define AS_PROC_NAME_FMT "/proc/%d/as"
344 # define MAP_PROC_NAME_FMT "/proc/%d/map"
345 # define STATUS_PROC_NAME_FMT "/proc/%d/status"
346 # define MAX_PROC_NAME_SIZE sizeof("/proc/99999/lwp/8096/lstatus")
347 # endif
348 /* the name of the proc status struct depends on the implementation */
349 typedef pstatus_t gdb_prstatus_t;
350 typedef lwpstatus_t gdb_lwpstatus_t;
351 #else /* ! NEW_PROC_API */
352 /* format strings for /proc paths */
353 # ifndef CTL_PROC_NAME_FMT
354 # define MAIN_PROC_NAME_FMT "/proc/%05d"
355 # define CTL_PROC_NAME_FMT "/proc/%05d"
356 # define AS_PROC_NAME_FMT "/proc/%05d"
357 # define MAP_PROC_NAME_FMT "/proc/%05d"
358 # define STATUS_PROC_NAME_FMT "/proc/%05d"
359 # define MAX_PROC_NAME_SIZE sizeof("/proc/ttttppppp")
360 # endif
361 /* the name of the proc status struct depends on the implementation */
362 typedef prstatus_t gdb_prstatus_t;
363 typedef prstatus_t gdb_lwpstatus_t;
364 #endif /* NEW_PROC_API */
365
366 typedef struct procinfo {
367 struct procinfo *next;
368 int pid; /* Process ID */
369 int tid; /* Thread/LWP id */
370
371 /* process state */
372 int was_stopped;
373 int ignore_next_sigstop;
374
375 /* The following four fd fields may be identical, or may contain
376 several different fd's, depending on the version of /proc
377 (old ioctl or new read/write). */
378
379 int ctl_fd; /* File descriptor for /proc control file */
380 /*
381 * The next three file descriptors are actually only needed in the
382 * read/write, multiple-file-descriptor implemenation (NEW_PROC_API).
383 * However, to avoid a bunch of #ifdefs in the code, we will use
384 * them uniformly by (in the case of the ioctl single-file-descriptor
385 * implementation) filling them with copies of the control fd.
386 */
387 int status_fd; /* File descriptor for /proc status file */
388 int as_fd; /* File descriptor for /proc as file */
389
390 char pathname[MAX_PROC_NAME_SIZE]; /* Pathname to /proc entry */
391
392 fltset_t saved_fltset; /* Saved traced hardware fault set */
393 gdb_sigset_t saved_sigset; /* Saved traced signal set */
394 gdb_sigset_t saved_sighold; /* Saved held signal set */
395 sysset_t *saved_exitset; /* Saved traced system call exit set */
396 sysset_t *saved_entryset; /* Saved traced system call entry set */
397
398 gdb_prstatus_t prstatus; /* Current process status info */
399
400 #ifndef NEW_PROC_API
401 gdb_fpregset_t fpregset; /* Current floating point registers */
402 #endif
403
404 #ifdef DYNAMIC_SYSCALLS
405 int num_syscalls; /* Total number of syscalls */
406 char **syscall_names; /* Syscall number to name map */
407 #endif
408
409 struct procinfo *thread_list;
410
411 int status_valid : 1;
412 int gregs_valid : 1;
413 int fpregs_valid : 1;
414 int threads_valid: 1;
415 } procinfo;
416
417 static char errmsg[128]; /* shared error msg buffer */
418
419 /* Function prototypes for procinfo module: */
420
421 static procinfo *find_procinfo_or_die (int pid, int tid);
422 static procinfo *find_procinfo (int pid, int tid);
423 static procinfo *create_procinfo (int pid, int tid);
424 static void destroy_procinfo (procinfo * p);
425 static void do_destroy_procinfo_cleanup (void *);
426 static void dead_procinfo (procinfo * p, char *msg, int killp);
427 static int open_procinfo_files (procinfo * p, int which);
428 static void close_procinfo_files (procinfo * p);
429 static int sysset_t_size (procinfo *p);
430 static sysset_t *sysset_t_alloc (procinfo * pi);
431 #ifdef DYNAMIC_SYSCALLS
432 static void load_syscalls (procinfo *pi);
433 static void free_syscalls (procinfo *pi);
434 static int find_syscall (procinfo *pi, char *name);
435 #endif /* DYNAMIC_SYSCALLS */
436
437 /* The head of the procinfo list: */
438 static procinfo * procinfo_list;
439
440 /*
441 * Function: find_procinfo
442 *
443 * Search the procinfo list.
444 *
445 * Returns: pointer to procinfo, or NULL if not found.
446 */
447
448 static procinfo *
449 find_procinfo (int pid, int tid)
450 {
451 procinfo *pi;
452
453 for (pi = procinfo_list; pi; pi = pi->next)
454 if (pi->pid == pid)
455 break;
456
457 if (pi)
458 if (tid)
459 {
460 /* Don't check threads_valid. If we're updating the
461 thread_list, we want to find whatever threads are already
462 here. This means that in general it is the caller's
463 responsibility to check threads_valid and update before
464 calling find_procinfo, if the caller wants to find a new
465 thread. */
466
467 for (pi = pi->thread_list; pi; pi = pi->next)
468 if (pi->tid == tid)
469 break;
470 }
471
472 return pi;
473 }
474
475 /*
476 * Function: find_procinfo_or_die
477 *
478 * Calls find_procinfo, but errors on failure.
479 */
480
481 static procinfo *
482 find_procinfo_or_die (int pid, int tid)
483 {
484 procinfo *pi = find_procinfo (pid, tid);
485
486 if (pi == NULL)
487 {
488 if (tid)
489 error (_("procfs: couldn't find pid %d (kernel thread %d) in procinfo list."),
490 pid, tid);
491 else
492 error (_("procfs: couldn't find pid %d in procinfo list."), pid);
493 }
494 return pi;
495 }
496
497 /* open_with_retry() is a wrapper for open(). The appropriate
498 open() call is attempted; if unsuccessful, it will be retried as
499 many times as needed for the EAGAIN and EINTR conditions.
500
501 For other conditions, open_with_retry() will retry the open() a
502 limited number of times. In addition, a short sleep is imposed
503 prior to retrying the open(). The reason for this sleep is to give
504 the kernel a chance to catch up and create the file in question in
505 the event that GDB "wins" the race to open a file before the kernel
506 has created it. */
507
508 static int
509 open_with_retry (const char *pathname, int flags)
510 {
511 int retries_remaining, status;
512
513 retries_remaining = 2;
514
515 while (1)
516 {
517 status = open (pathname, flags);
518
519 if (status >= 0 || retries_remaining == 0)
520 break;
521 else if (errno != EINTR && errno != EAGAIN)
522 {
523 retries_remaining--;
524 sleep (1);
525 }
526 }
527
528 return status;
529 }
530
531 /*
532 * Function: open_procinfo_files
533 *
534 * Open the file descriptor for the process or LWP.
535 * ifdef NEW_PROC_API, we only open the control file descriptor;
536 * the others are opened lazily as needed.
537 * else (if not NEW_PROC_API), there is only one real
538 * file descriptor, but we keep multiple copies of it so that
539 * the code that uses them does not have to be #ifdef'd.
540 *
541 * Return: file descriptor, or zero for failure.
542 */
543
544 enum { FD_CTL, FD_STATUS, FD_AS };
545
546 static int
547 open_procinfo_files (procinfo *pi, int which)
548 {
549 #ifdef NEW_PROC_API
550 char tmp[MAX_PROC_NAME_SIZE];
551 #endif
552 int fd;
553
554 /*
555 * This function is getting ALMOST long enough to break up into several.
556 * Here is some rationale:
557 *
558 * NEW_PROC_API (Solaris 2.6, Solaris 2.7, Unixware):
559 * There are several file descriptors that may need to be open
560 * for any given process or LWP. The ones we're intereted in are:
561 * - control (ctl) write-only change the state
562 * - status (status) read-only query the state
563 * - address space (as) read/write access memory
564 * - map (map) read-only virtual addr map
565 * Most of these are opened lazily as they are needed.
566 * The pathnames for the 'files' for an LWP look slightly
567 * different from those of a first-class process:
568 * Pathnames for a process (<proc-id>):
569 * /proc/<proc-id>/ctl
570 * /proc/<proc-id>/status
571 * /proc/<proc-id>/as
572 * /proc/<proc-id>/map
573 * Pathnames for an LWP (lwp-id):
574 * /proc/<proc-id>/lwp/<lwp-id>/lwpctl
575 * /proc/<proc-id>/lwp/<lwp-id>/lwpstatus
576 * An LWP has no map or address space file descriptor, since
577 * the memory map and address space are shared by all LWPs.
578 *
579 * Everyone else (Solaris 2.5, Irix, OSF)
580 * There is only one file descriptor for each process or LWP.
581 * For convenience, we copy the same file descriptor into all
582 * three fields of the procinfo struct (ctl_fd, status_fd, and
583 * as_fd, see NEW_PROC_API above) so that code that uses them
584 * doesn't need any #ifdef's.
585 * Pathname for all:
586 * /proc/<proc-id>
587 *
588 * Solaris 2.5 LWP's:
589 * Each LWP has an independent file descriptor, but these
590 * are not obtained via the 'open' system call like the rest:
591 * instead, they're obtained thru an ioctl call (PIOCOPENLWP)
592 * to the file descriptor of the parent process.
593 *
594 * OSF threads:
595 * These do not even have their own independent file descriptor.
596 * All operations are carried out on the file descriptor of the
597 * parent process. Therefore we just call open again for each
598 * thread, getting a new handle for the same 'file'.
599 */
600
601 #ifdef NEW_PROC_API
602 /*
603 * In this case, there are several different file descriptors that
604 * we might be asked to open. The control file descriptor will be
605 * opened early, but the others will be opened lazily as they are
606 * needed.
607 */
608
609 strcpy (tmp, pi->pathname);
610 switch (which) { /* which file descriptor to open? */
611 case FD_CTL:
612 if (pi->tid)
613 strcat (tmp, "/lwpctl");
614 else
615 strcat (tmp, "/ctl");
616 fd = open_with_retry (tmp, O_WRONLY);
617 if (fd <= 0)
618 return 0; /* fail */
619 pi->ctl_fd = fd;
620 break;
621 case FD_AS:
622 if (pi->tid)
623 return 0; /* there is no 'as' file descriptor for an lwp */
624 strcat (tmp, "/as");
625 fd = open_with_retry (tmp, O_RDWR);
626 if (fd <= 0)
627 return 0; /* fail */
628 pi->as_fd = fd;
629 break;
630 case FD_STATUS:
631 if (pi->tid)
632 strcat (tmp, "/lwpstatus");
633 else
634 strcat (tmp, "/status");
635 fd = open_with_retry (tmp, O_RDONLY);
636 if (fd <= 0)
637 return 0; /* fail */
638 pi->status_fd = fd;
639 break;
640 default:
641 return 0; /* unknown file descriptor */
642 }
643 #else /* not NEW_PROC_API */
644 /*
645 * In this case, there is only one file descriptor for each procinfo
646 * (ie. each process or LWP). In fact, only the file descriptor for
647 * the process can actually be opened by an 'open' system call.
648 * The ones for the LWPs have to be obtained thru an IOCTL call
649 * on the process's file descriptor.
650 *
651 * For convenience, we copy each procinfo's single file descriptor
652 * into all of the fields occupied by the several file descriptors
653 * of the NEW_PROC_API implementation. That way, the code that uses
654 * them can be written without ifdefs.
655 */
656
657
658 #ifdef PIOCTSTATUS /* OSF */
659 /* Only one FD; just open it. */
660 if ((fd = open_with_retry (pi->pathname, O_RDWR)) == 0)
661 return 0;
662 #else /* Sol 2.5, Irix, other? */
663 if (pi->tid == 0) /* Master procinfo for the process */
664 {
665 fd = open_with_retry (pi->pathname, O_RDWR);
666 if (fd <= 0)
667 return 0; /* fail */
668 }
669 else /* LWP thread procinfo */
670 {
671 #ifdef PIOCOPENLWP /* Sol 2.5, thread/LWP */
672 procinfo *process;
673 int lwpid = pi->tid;
674
675 /* Find the procinfo for the entire process. */
676 if ((process = find_procinfo (pi->pid, 0)) == NULL)
677 return 0; /* fail */
678
679 /* Now obtain the file descriptor for the LWP. */
680 if ((fd = ioctl (process->ctl_fd, PIOCOPENLWP, &lwpid)) <= 0)
681 return 0; /* fail */
682 #else /* Irix, other? */
683 return 0; /* Don't know how to open threads */
684 #endif /* Sol 2.5 PIOCOPENLWP */
685 }
686 #endif /* OSF PIOCTSTATUS */
687 pi->ctl_fd = pi->as_fd = pi->status_fd = fd;
688 #endif /* NEW_PROC_API */
689
690 return 1; /* success */
691 }
692
693 /*
694 * Function: create_procinfo
695 *
696 * Allocate a data structure and link it into the procinfo list.
697 * (First tries to find a pre-existing one (FIXME: why?)
698 *
699 * Return: pointer to new procinfo struct.
700 */
701
702 static procinfo *
703 create_procinfo (int pid, int tid)
704 {
705 procinfo *pi, *parent = NULL;
706
707 if ((pi = find_procinfo (pid, tid)))
708 return pi; /* Already exists, nothing to do. */
709
710 /* find parent before doing malloc, to save having to cleanup */
711 if (tid != 0)
712 parent = find_procinfo_or_die (pid, 0); /* FIXME: should I
713 create it if it
714 doesn't exist yet? */
715
716 pi = (procinfo *) xmalloc (sizeof (procinfo));
717 memset (pi, 0, sizeof (procinfo));
718 pi->pid = pid;
719 pi->tid = tid;
720
721 #ifdef DYNAMIC_SYSCALLS
722 load_syscalls (pi);
723 #endif
724
725 pi->saved_entryset = sysset_t_alloc (pi);
726 pi->saved_exitset = sysset_t_alloc (pi);
727
728 /* Chain into list. */
729 if (tid == 0)
730 {
731 sprintf (pi->pathname, MAIN_PROC_NAME_FMT, pid);
732 pi->next = procinfo_list;
733 procinfo_list = pi;
734 }
735 else
736 {
737 #ifdef NEW_PROC_API
738 sprintf (pi->pathname, "/proc/%05d/lwp/%d", pid, tid);
739 #else
740 sprintf (pi->pathname, MAIN_PROC_NAME_FMT, pid);
741 #endif
742 pi->next = parent->thread_list;
743 parent->thread_list = pi;
744 }
745 return pi;
746 }
747
748 /*
749 * Function: close_procinfo_files
750 *
751 * Close all file descriptors associated with the procinfo
752 */
753
754 static void
755 close_procinfo_files (procinfo *pi)
756 {
757 if (pi->ctl_fd > 0)
758 close (pi->ctl_fd);
759 #ifdef NEW_PROC_API
760 if (pi->as_fd > 0)
761 close (pi->as_fd);
762 if (pi->status_fd > 0)
763 close (pi->status_fd);
764 #endif
765 pi->ctl_fd = pi->as_fd = pi->status_fd = 0;
766 }
767
768 /*
769 * Function: destroy_procinfo
770 *
771 * Destructor function. Close, unlink and deallocate the object.
772 */
773
774 static void
775 destroy_one_procinfo (procinfo **list, procinfo *pi)
776 {
777 procinfo *ptr;
778
779 /* Step one: unlink the procinfo from its list */
780 if (pi == *list)
781 *list = pi->next;
782 else
783 for (ptr = *list; ptr; ptr = ptr->next)
784 if (ptr->next == pi)
785 {
786 ptr->next = pi->next;
787 break;
788 }
789
790 /* Step two: close any open file descriptors */
791 close_procinfo_files (pi);
792
793 /* Step three: free the memory. */
794 #ifdef DYNAMIC_SYSCALLS
795 free_syscalls (pi);
796 #endif
797 xfree (pi->saved_entryset);
798 xfree (pi->saved_exitset);
799 xfree (pi);
800 }
801
802 static void
803 destroy_procinfo (procinfo *pi)
804 {
805 procinfo *tmp;
806
807 if (pi->tid != 0) /* destroy a thread procinfo */
808 {
809 tmp = find_procinfo (pi->pid, 0); /* find the parent process */
810 destroy_one_procinfo (&tmp->thread_list, pi);
811 }
812 else /* destroy a process procinfo and all its threads */
813 {
814 /* First destroy the children, if any; */
815 while (pi->thread_list != NULL)
816 destroy_one_procinfo (&pi->thread_list, pi->thread_list);
817 /* Then destroy the parent. Genocide!!! */
818 destroy_one_procinfo (&procinfo_list, pi);
819 }
820 }
821
822 static void
823 do_destroy_procinfo_cleanup (void *pi)
824 {
825 destroy_procinfo (pi);
826 }
827
828 enum { NOKILL, KILL };
829
830 /*
831 * Function: dead_procinfo
832 *
833 * To be called on a non_recoverable error for a procinfo.
834 * Prints error messages, optionally sends a SIGKILL to the process,
835 * then destroys the data structure.
836 */
837
838 static void
839 dead_procinfo (procinfo *pi, char *msg, int kill_p)
840 {
841 char procfile[80];
842
843 if (pi->pathname)
844 {
845 print_sys_errmsg (pi->pathname, errno);
846 }
847 else
848 {
849 sprintf (procfile, "process %d", pi->pid);
850 print_sys_errmsg (procfile, errno);
851 }
852 if (kill_p == KILL)
853 kill (pi->pid, SIGKILL);
854
855 destroy_procinfo (pi);
856 error ("%s", msg);
857 }
858
859 /*
860 * Function: sysset_t_size
861 *
862 * Returns the (complete) size of a sysset_t struct. Normally, this
863 * is just sizeof (syset_t), but in the case of Monterey/64, the actual
864 * size of sysset_t isn't known until runtime.
865 */
866
867 static int
868 sysset_t_size (procinfo * pi)
869 {
870 #ifndef DYNAMIC_SYSCALLS
871 return sizeof (sysset_t);
872 #else
873 return sizeof (sysset_t) - sizeof (uint64_t)
874 + sizeof (uint64_t) * ((pi->num_syscalls + (8 * sizeof (uint64_t) - 1))
875 / (8 * sizeof (uint64_t)));
876 #endif
877 }
878
879 /* Function: sysset_t_alloc
880
881 Allocate and (partially) initialize a sysset_t struct. */
882
883 static sysset_t *
884 sysset_t_alloc (procinfo * pi)
885 {
886 sysset_t *ret;
887 int size = sysset_t_size (pi);
888 ret = xmalloc (size);
889 #ifdef DYNAMIC_SYSCALLS
890 ret->pr_size = (pi->num_syscalls + (8 * sizeof (uint64_t) - 1))
891 / (8 * sizeof (uint64_t));
892 #endif
893 return ret;
894 }
895
896 #ifdef DYNAMIC_SYSCALLS
897
898 /* Function: load_syscalls
899
900 Extract syscall numbers and names from /proc/<pid>/sysent. Initialize
901 pi->num_syscalls with the number of syscalls and pi->syscall_names
902 with the names. (Certain numbers may be skipped in which case the
903 names for these numbers will be left as NULL.) */
904
905 #define MAX_SYSCALL_NAME_LENGTH 256
906 #define MAX_SYSCALLS 65536
907
908 static void
909 load_syscalls (procinfo *pi)
910 {
911 char pathname[MAX_PROC_NAME_SIZE];
912 int sysent_fd;
913 prsysent_t header;
914 prsyscall_t *syscalls;
915 int i, size, maxcall;
916
917 pi->num_syscalls = 0;
918 pi->syscall_names = 0;
919
920 /* Open the file descriptor for the sysent file */
921 sprintf (pathname, "/proc/%d/sysent", pi->pid);
922 sysent_fd = open_with_retry (pathname, O_RDONLY);
923 if (sysent_fd < 0)
924 {
925 error (_("load_syscalls: Can't open /proc/%d/sysent"), pi->pid);
926 }
927
928 size = sizeof header - sizeof (prsyscall_t);
929 if (read (sysent_fd, &header, size) != size)
930 {
931 error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid);
932 }
933
934 if (header.pr_nsyscalls == 0)
935 {
936 error (_("load_syscalls: /proc/%d/sysent contains no syscalls!"), pi->pid);
937 }
938
939 size = header.pr_nsyscalls * sizeof (prsyscall_t);
940 syscalls = xmalloc (size);
941
942 if (read (sysent_fd, syscalls, size) != size)
943 {
944 xfree (syscalls);
945 error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid);
946 }
947
948 /* Find maximum syscall number. This may not be the same as
949 pr_nsyscalls since that value refers to the number of entries
950 in the table. (Also, the docs indicate that some system
951 call numbers may be skipped.) */
952
953 maxcall = syscalls[0].pr_number;
954
955 for (i = 1; i < header.pr_nsyscalls; i++)
956 if (syscalls[i].pr_number > maxcall
957 && syscalls[i].pr_nameoff > 0
958 && syscalls[i].pr_number < MAX_SYSCALLS)
959 maxcall = syscalls[i].pr_number;
960
961 pi->num_syscalls = maxcall+1;
962 pi->syscall_names = xmalloc (pi->num_syscalls * sizeof (char *));
963
964 for (i = 0; i < pi->num_syscalls; i++)
965 pi->syscall_names[i] = NULL;
966
967 /* Read the syscall names in */
968 for (i = 0; i < header.pr_nsyscalls; i++)
969 {
970 char namebuf[MAX_SYSCALL_NAME_LENGTH];
971 int nread;
972 int callnum;
973
974 if (syscalls[i].pr_number >= MAX_SYSCALLS
975 || syscalls[i].pr_number < 0
976 || syscalls[i].pr_nameoff <= 0
977 || (lseek (sysent_fd, (off_t) syscalls[i].pr_nameoff, SEEK_SET)
978 != (off_t) syscalls[i].pr_nameoff))
979 continue;
980
981 nread = read (sysent_fd, namebuf, sizeof namebuf);
982 if (nread <= 0)
983 continue;
984
985 callnum = syscalls[i].pr_number;
986
987 if (pi->syscall_names[callnum] != NULL)
988 {
989 /* FIXME: Generate warning */
990 continue;
991 }
992
993 namebuf[nread-1] = '\0';
994 size = strlen (namebuf) + 1;
995 pi->syscall_names[callnum] = xmalloc (size);
996 strncpy (pi->syscall_names[callnum], namebuf, size-1);
997 pi->syscall_names[callnum][size-1] = '\0';
998 }
999
1000 close (sysent_fd);
1001 xfree (syscalls);
1002 }
1003
1004 /* Function: free_syscalls
1005
1006 Free the space allocated for the syscall names from the procinfo
1007 structure. */
1008
1009 static void
1010 free_syscalls (procinfo *pi)
1011 {
1012 if (pi->syscall_names)
1013 {
1014 int i;
1015
1016 for (i = 0; i < pi->num_syscalls; i++)
1017 if (pi->syscall_names[i] != NULL)
1018 xfree (pi->syscall_names[i]);
1019
1020 xfree (pi->syscall_names);
1021 pi->syscall_names = 0;
1022 }
1023 }
1024
1025 /* Function: find_syscall
1026
1027 Given a name, look up (and return) the corresponding syscall number.
1028 If no match is found, return -1. */
1029
1030 static int
1031 find_syscall (procinfo *pi, char *name)
1032 {
1033 int i;
1034 for (i = 0; i < pi->num_syscalls; i++)
1035 {
1036 if (pi->syscall_names[i] && strcmp (name, pi->syscall_names[i]) == 0)
1037 return i;
1038 }
1039 return -1;
1040 }
1041 #endif
1042
1043 /* =================== END, STRUCT PROCINFO "MODULE" =================== */
1044
1045 /* =================== /proc "MODULE" =================== */
1046
1047 /*
1048 * This "module" is the interface layer between the /proc system API
1049 * and the gdb target vector functions. This layer consists of
1050 * access functions that encapsulate each of the basic operations
1051 * that we need to use from the /proc API.
1052 *
1053 * The main motivation for this layer is to hide the fact that
1054 * there are two very different implementations of the /proc API.
1055 * Rather than have a bunch of #ifdefs all thru the gdb target vector
1056 * functions, we do our best to hide them all in here.
1057 */
1058
1059 int proc_get_status (procinfo * pi);
1060 long proc_flags (procinfo * pi);
1061 int proc_why (procinfo * pi);
1062 int proc_what (procinfo * pi);
1063 int proc_set_run_on_last_close (procinfo * pi);
1064 int proc_unset_run_on_last_close (procinfo * pi);
1065 int proc_set_inherit_on_fork (procinfo * pi);
1066 int proc_unset_inherit_on_fork (procinfo * pi);
1067 int proc_set_async (procinfo * pi);
1068 int proc_unset_async (procinfo * pi);
1069 int proc_stop_process (procinfo * pi);
1070 int proc_trace_signal (procinfo * pi, int signo);
1071 int proc_ignore_signal (procinfo * pi, int signo);
1072 int proc_clear_current_fault (procinfo * pi);
1073 int proc_set_current_signal (procinfo * pi, int signo);
1074 int proc_clear_current_signal (procinfo * pi);
1075 int proc_set_gregs (procinfo * pi);
1076 int proc_set_fpregs (procinfo * pi);
1077 int proc_wait_for_stop (procinfo * pi);
1078 int proc_run_process (procinfo * pi, int step, int signo);
1079 int proc_kill (procinfo * pi, int signo);
1080 int proc_parent_pid (procinfo * pi);
1081 int proc_get_nthreads (procinfo * pi);
1082 int proc_get_current_thread (procinfo * pi);
1083 int proc_set_held_signals (procinfo * pi, gdb_sigset_t * sighold);
1084 int proc_set_traced_sysexit (procinfo * pi, sysset_t * sysset);
1085 int proc_set_traced_sysentry (procinfo * pi, sysset_t * sysset);
1086 int proc_set_traced_faults (procinfo * pi, fltset_t * fltset);
1087 int proc_set_traced_signals (procinfo * pi, gdb_sigset_t * sigset);
1088
1089 int proc_update_threads (procinfo * pi);
1090 int proc_iterate_over_threads (procinfo * pi,
1091 int (*func) (procinfo *, procinfo *, void *),
1092 void *ptr);
1093
1094 gdb_gregset_t *proc_get_gregs (procinfo * pi);
1095 gdb_fpregset_t *proc_get_fpregs (procinfo * pi);
1096 sysset_t *proc_get_traced_sysexit (procinfo * pi, sysset_t * save);
1097 sysset_t *proc_get_traced_sysentry (procinfo * pi, sysset_t * save);
1098 fltset_t *proc_get_traced_faults (procinfo * pi, fltset_t * save);
1099 gdb_sigset_t *proc_get_traced_signals (procinfo * pi, gdb_sigset_t * save);
1100 gdb_sigset_t *proc_get_held_signals (procinfo * pi, gdb_sigset_t * save);
1101 gdb_sigset_t *proc_get_pending_signals (procinfo * pi, gdb_sigset_t * save);
1102 gdb_sigaction_t *proc_get_signal_actions (procinfo * pi, gdb_sigaction_t *save);
1103
1104 void proc_warn (procinfo * pi, char *func, int line);
1105 void proc_error (procinfo * pi, char *func, int line);
1106
1107 void
1108 proc_warn (procinfo *pi, char *func, int line)
1109 {
1110 sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
1111 print_sys_errmsg (errmsg, errno);
1112 }
1113
1114 void
1115 proc_error (procinfo *pi, char *func, int line)
1116 {
1117 sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
1118 perror_with_name (errmsg);
1119 }
1120
1121 /*
1122 * Function: proc_get_status
1123 *
1124 * Updates the status struct in the procinfo.
1125 * There is a 'valid' flag, to let other functions know when
1126 * this function needs to be called (so the status is only
1127 * read when it is needed). The status file descriptor is
1128 * also only opened when it is needed.
1129 *
1130 * Return: non-zero for success, zero for failure.
1131 */
1132
1133 int
1134 proc_get_status (procinfo *pi)
1135 {
1136 /* Status file descriptor is opened "lazily" */
1137 if (pi->status_fd == 0 &&
1138 open_procinfo_files (pi, FD_STATUS) == 0)
1139 {
1140 pi->status_valid = 0;
1141 return 0;
1142 }
1143
1144 #ifdef NEW_PROC_API
1145 if (lseek (pi->status_fd, 0, SEEK_SET) < 0)
1146 pi->status_valid = 0; /* fail */
1147 else
1148 {
1149 /* Sigh... I have to read a different data structure,
1150 depending on whether this is a main process or an LWP. */
1151 if (pi->tid)
1152 pi->status_valid = (read (pi->status_fd,
1153 (char *) &pi->prstatus.pr_lwp,
1154 sizeof (lwpstatus_t))
1155 == sizeof (lwpstatus_t));
1156 else
1157 {
1158 pi->status_valid = (read (pi->status_fd,
1159 (char *) &pi->prstatus,
1160 sizeof (gdb_prstatus_t))
1161 == sizeof (gdb_prstatus_t));
1162 #if 0 /*def UNIXWARE*/
1163 if (pi->status_valid &&
1164 (pi->prstatus.pr_lwp.pr_flags & PR_ISTOP) &&
1165 pi->prstatus.pr_lwp.pr_why == PR_REQUESTED)
1166 /* Unixware peculiarity -- read the damn thing again! */
1167 pi->status_valid = (read (pi->status_fd,
1168 (char *) &pi->prstatus,
1169 sizeof (gdb_prstatus_t))
1170 == sizeof (gdb_prstatus_t));
1171 #endif /* UNIXWARE */
1172 }
1173 }
1174 #else /* ioctl method */
1175 #ifdef PIOCTSTATUS /* osf */
1176 if (pi->tid == 0) /* main process */
1177 {
1178 /* Just read the danged status. Now isn't that simple? */
1179 pi->status_valid =
1180 (ioctl (pi->status_fd, PIOCSTATUS, &pi->prstatus) >= 0);
1181 }
1182 else
1183 {
1184 int win;
1185 struct {
1186 long pr_count;
1187 tid_t pr_error_thread;
1188 struct prstatus status;
1189 } thread_status;
1190
1191 thread_status.pr_count = 1;
1192 thread_status.status.pr_tid = pi->tid;
1193 win = (ioctl (pi->status_fd, PIOCTSTATUS, &thread_status) >= 0);
1194 if (win)
1195 {
1196 memcpy (&pi->prstatus, &thread_status.status,
1197 sizeof (pi->prstatus));
1198 pi->status_valid = 1;
1199 }
1200 }
1201 #else
1202 /* Just read the danged status. Now isn't that simple? */
1203 pi->status_valid = (ioctl (pi->status_fd, PIOCSTATUS, &pi->prstatus) >= 0);
1204 #endif
1205 #endif
1206
1207 if (pi->status_valid)
1208 {
1209 PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1210 proc_why (pi),
1211 proc_what (pi),
1212 proc_get_current_thread (pi));
1213 }
1214
1215 /* The status struct includes general regs, so mark them valid too */
1216 pi->gregs_valid = pi->status_valid;
1217 #ifdef NEW_PROC_API
1218 /* In the read/write multiple-fd model,
1219 the status struct includes the fp regs too, so mark them valid too */
1220 pi->fpregs_valid = pi->status_valid;
1221 #endif
1222 return pi->status_valid; /* True if success, false if failure. */
1223 }
1224
1225 /*
1226 * Function: proc_flags
1227 *
1228 * returns the process flags (pr_flags field).
1229 */
1230
1231 long
1232 proc_flags (procinfo *pi)
1233 {
1234 if (!pi->status_valid)
1235 if (!proc_get_status (pi))
1236 return 0; /* FIXME: not a good failure value (but what is?) */
1237
1238 #ifdef NEW_PROC_API
1239 # ifdef UNIXWARE
1240 /* UnixWare 7.1 puts process status flags, e.g. PR_ASYNC, in
1241 pstatus_t and LWP status flags, e.g. PR_STOPPED, in lwpstatus_t.
1242 The two sets of flags don't overlap. */
1243 return pi->prstatus.pr_flags | pi->prstatus.pr_lwp.pr_flags;
1244 # else
1245 return pi->prstatus.pr_lwp.pr_flags;
1246 # endif
1247 #else
1248 return pi->prstatus.pr_flags;
1249 #endif
1250 }
1251
1252 /*
1253 * Function: proc_why
1254 *
1255 * returns the pr_why field (why the process stopped).
1256 */
1257
1258 int
1259 proc_why (procinfo *pi)
1260 {
1261 if (!pi->status_valid)
1262 if (!proc_get_status (pi))
1263 return 0; /* FIXME: not a good failure value (but what is?) */
1264
1265 #ifdef NEW_PROC_API
1266 return pi->prstatus.pr_lwp.pr_why;
1267 #else
1268 return pi->prstatus.pr_why;
1269 #endif
1270 }
1271
1272 /*
1273 * Function: proc_what
1274 *
1275 * returns the pr_what field (details of why the process stopped).
1276 */
1277
1278 int
1279 proc_what (procinfo *pi)
1280 {
1281 if (!pi->status_valid)
1282 if (!proc_get_status (pi))
1283 return 0; /* FIXME: not a good failure value (but what is?) */
1284
1285 #ifdef NEW_PROC_API
1286 return pi->prstatus.pr_lwp.pr_what;
1287 #else
1288 return pi->prstatus.pr_what;
1289 #endif
1290 }
1291
1292 #ifndef PIOCSSPCACT /* The following is not supported on OSF. */
1293 /*
1294 * Function: proc_nsysarg
1295 *
1296 * returns the pr_nsysarg field (number of args to the current syscall).
1297 */
1298
1299 int
1300 proc_nsysarg (procinfo *pi)
1301 {
1302 if (!pi->status_valid)
1303 if (!proc_get_status (pi))
1304 return 0;
1305
1306 #ifdef NEW_PROC_API
1307 return pi->prstatus.pr_lwp.pr_nsysarg;
1308 #else
1309 return pi->prstatus.pr_nsysarg;
1310 #endif
1311 }
1312
1313 /*
1314 * Function: proc_sysargs
1315 *
1316 * returns the pr_sysarg field (pointer to the arguments of current syscall).
1317 */
1318
1319 long *
1320 proc_sysargs (procinfo *pi)
1321 {
1322 if (!pi->status_valid)
1323 if (!proc_get_status (pi))
1324 return NULL;
1325
1326 #ifdef NEW_PROC_API
1327 return (long *) &pi->prstatus.pr_lwp.pr_sysarg;
1328 #else
1329 return (long *) &pi->prstatus.pr_sysarg;
1330 #endif
1331 }
1332
1333 /*
1334 * Function: proc_syscall
1335 *
1336 * returns the pr_syscall field (id of current syscall if we are in one).
1337 */
1338
1339 int
1340 proc_syscall (procinfo *pi)
1341 {
1342 if (!pi->status_valid)
1343 if (!proc_get_status (pi))
1344 return 0;
1345
1346 #ifdef NEW_PROC_API
1347 return pi->prstatus.pr_lwp.pr_syscall;
1348 #else
1349 return pi->prstatus.pr_syscall;
1350 #endif
1351 }
1352 #endif /* PIOCSSPCACT */
1353
1354 /*
1355 * Function: proc_cursig:
1356 *
1357 * returns the pr_cursig field (current signal).
1358 */
1359
1360 long
1361 proc_cursig (struct procinfo *pi)
1362 {
1363 if (!pi->status_valid)
1364 if (!proc_get_status (pi))
1365 return 0; /* FIXME: not a good failure value (but what is?) */
1366
1367 #ifdef NEW_PROC_API
1368 return pi->prstatus.pr_lwp.pr_cursig;
1369 #else
1370 return pi->prstatus.pr_cursig;
1371 #endif
1372 }
1373
1374 /*
1375 * Function: proc_modify_flag
1376 *
1377 * === I appologize for the messiness of this function.
1378 * === This is an area where the different versions of
1379 * === /proc are more inconsistent than usual. MVS
1380 *
1381 * Set or reset any of the following process flags:
1382 * PR_FORK -- forked child will inherit trace flags
1383 * PR_RLC -- traced process runs when last /proc file closed.
1384 * PR_KLC -- traced process is killed when last /proc file closed.
1385 * PR_ASYNC -- LWP's get to run/stop independently.
1386 *
1387 * There are three methods for doing this function:
1388 * 1) Newest: read/write [PCSET/PCRESET/PCUNSET]
1389 * [Sol6, Sol7, UW]
1390 * 2) Middle: PIOCSET/PIOCRESET
1391 * [Irix, Sol5]
1392 * 3) Oldest: PIOCSFORK/PIOCRFORK/PIOCSRLC/PIOCRRLC
1393 * [OSF, Sol5]
1394 *
1395 * Note: Irix does not define PR_ASYNC.
1396 * Note: OSF does not define PR_KLC.
1397 * Note: OSF is the only one that can ONLY use the oldest method.
1398 *
1399 * Arguments:
1400 * pi -- the procinfo
1401 * flag -- one of PR_FORK, PR_RLC, or PR_ASYNC
1402 * mode -- 1 for set, 0 for reset.
1403 *
1404 * Returns non-zero for success, zero for failure.
1405 */
1406
1407 enum { FLAG_RESET, FLAG_SET };
1408
1409 static int
1410 proc_modify_flag (procinfo *pi, long flag, long mode)
1411 {
1412 long win = 0; /* default to fail */
1413
1414 /*
1415 * These operations affect the process as a whole, and applying
1416 * them to an individual LWP has the same meaning as applying them
1417 * to the main process. Therefore, if we're ever called with a
1418 * pointer to an LWP's procinfo, let's substitute the process's
1419 * procinfo and avoid opening the LWP's file descriptor
1420 * unnecessarily.
1421 */
1422
1423 if (pi->pid != 0)
1424 pi = find_procinfo_or_die (pi->pid, 0);
1425
1426 #ifdef NEW_PROC_API /* Newest method: UnixWare and newer Solarii */
1427 /* First normalize the PCUNSET/PCRESET command opcode
1428 (which for no obvious reason has a different definition
1429 from one operating system to the next...) */
1430 #ifdef PCUNSET
1431 #define GDBRESET PCUNSET
1432 #else
1433 #ifdef PCRESET
1434 #define GDBRESET PCRESET
1435 #endif
1436 #endif
1437 {
1438 procfs_ctl_t arg[2];
1439
1440 if (mode == FLAG_SET) /* Set the flag (RLC, FORK, or ASYNC) */
1441 arg[0] = PCSET;
1442 else /* Reset the flag */
1443 arg[0] = GDBRESET;
1444
1445 arg[1] = flag;
1446 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
1447 }
1448 #else
1449 #ifdef PIOCSET /* Irix/Sol5 method */
1450 if (mode == FLAG_SET) /* Set the flag (hopefully RLC, FORK, or ASYNC) */
1451 {
1452 win = (ioctl (pi->ctl_fd, PIOCSET, &flag) >= 0);
1453 }
1454 else /* Reset the flag */
1455 {
1456 win = (ioctl (pi->ctl_fd, PIOCRESET, &flag) >= 0);
1457 }
1458
1459 #else
1460 #ifdef PIOCSRLC /* Oldest method: OSF */
1461 switch (flag) {
1462 case PR_RLC:
1463 if (mode == FLAG_SET) /* Set run-on-last-close */
1464 {
1465 win = (ioctl (pi->ctl_fd, PIOCSRLC, NULL) >= 0);
1466 }
1467 else /* Clear run-on-last-close */
1468 {
1469 win = (ioctl (pi->ctl_fd, PIOCRRLC, NULL) >= 0);
1470 }
1471 break;
1472 case PR_FORK:
1473 if (mode == FLAG_SET) /* Set inherit-on-fork */
1474 {
1475 win = (ioctl (pi->ctl_fd, PIOCSFORK, NULL) >= 0);
1476 }
1477 else /* Clear inherit-on-fork */
1478 {
1479 win = (ioctl (pi->ctl_fd, PIOCRFORK, NULL) >= 0);
1480 }
1481 break;
1482 default:
1483 win = 0; /* fail -- unknown flag (can't do PR_ASYNC) */
1484 break;
1485 }
1486 #endif
1487 #endif
1488 #endif
1489 #undef GDBRESET
1490 /* The above operation renders the procinfo's cached pstatus obsolete. */
1491 pi->status_valid = 0;
1492
1493 if (!win)
1494 warning (_("procfs: modify_flag failed to turn %s %s"),
1495 flag == PR_FORK ? "PR_FORK" :
1496 flag == PR_RLC ? "PR_RLC" :
1497 #ifdef PR_ASYNC
1498 flag == PR_ASYNC ? "PR_ASYNC" :
1499 #endif
1500 #ifdef PR_KLC
1501 flag == PR_KLC ? "PR_KLC" :
1502 #endif
1503 "<unknown flag>",
1504 mode == FLAG_RESET ? "off" : "on");
1505
1506 return win;
1507 }
1508
1509 /*
1510 * Function: proc_set_run_on_last_close
1511 *
1512 * Set the run_on_last_close flag.
1513 * Process with all threads will become runnable
1514 * when debugger closes all /proc fds.
1515 *
1516 * Returns non-zero for success, zero for failure.
1517 */
1518
1519 int
1520 proc_set_run_on_last_close (procinfo *pi)
1521 {
1522 return proc_modify_flag (pi, PR_RLC, FLAG_SET);
1523 }
1524
1525 /*
1526 * Function: proc_unset_run_on_last_close
1527 *
1528 * Reset the run_on_last_close flag.
1529 * Process will NOT become runnable
1530 * when debugger closes its file handles.
1531 *
1532 * Returns non-zero for success, zero for failure.
1533 */
1534
1535 int
1536 proc_unset_run_on_last_close (procinfo *pi)
1537 {
1538 return proc_modify_flag (pi, PR_RLC, FLAG_RESET);
1539 }
1540
1541 #ifdef PR_KLC
1542 /*
1543 * Function: proc_set_kill_on_last_close
1544 *
1545 * Set the kill_on_last_close flag.
1546 * Process with all threads will be killed when debugger
1547 * closes all /proc fds (or debugger exits or dies).
1548 *
1549 * Returns non-zero for success, zero for failure.
1550 */
1551
1552 int
1553 proc_set_kill_on_last_close (procinfo *pi)
1554 {
1555 return proc_modify_flag (pi, PR_KLC, FLAG_SET);
1556 }
1557
1558 /*
1559 * Function: proc_unset_kill_on_last_close
1560 *
1561 * Reset the kill_on_last_close flag.
1562 * Process will NOT be killed when debugger
1563 * closes its file handles (or exits or dies).
1564 *
1565 * Returns non-zero for success, zero for failure.
1566 */
1567
1568 int
1569 proc_unset_kill_on_last_close (procinfo *pi)
1570 {
1571 return proc_modify_flag (pi, PR_KLC, FLAG_RESET);
1572 }
1573 #endif /* PR_KLC */
1574
1575 /*
1576 * Function: proc_set_inherit_on_fork
1577 *
1578 * Set inherit_on_fork flag.
1579 * If the process forks a child while we are registered for events
1580 * in the parent, then we will also recieve events from the child.
1581 *
1582 * Returns non-zero for success, zero for failure.
1583 */
1584
1585 int
1586 proc_set_inherit_on_fork (procinfo *pi)
1587 {
1588 return proc_modify_flag (pi, PR_FORK, FLAG_SET);
1589 }
1590
1591 /*
1592 * Function: proc_unset_inherit_on_fork
1593 *
1594 * Reset inherit_on_fork flag.
1595 * If the process forks a child while we are registered for events
1596 * in the parent, then we will NOT recieve events from the child.
1597 *
1598 * Returns non-zero for success, zero for failure.
1599 */
1600
1601 int
1602 proc_unset_inherit_on_fork (procinfo *pi)
1603 {
1604 return proc_modify_flag (pi, PR_FORK, FLAG_RESET);
1605 }
1606
1607 #ifdef PR_ASYNC
1608 /*
1609 * Function: proc_set_async
1610 *
1611 * Set PR_ASYNC flag.
1612 * If one LWP stops because of a debug event (signal etc.),
1613 * the remaining LWPs will continue to run.
1614 *
1615 * Returns non-zero for success, zero for failure.
1616 */
1617
1618 int
1619 proc_set_async (procinfo *pi)
1620 {
1621 return proc_modify_flag (pi, PR_ASYNC, FLAG_SET);
1622 }
1623
1624 /*
1625 * Function: proc_unset_async
1626 *
1627 * Reset PR_ASYNC flag.
1628 * If one LWP stops because of a debug event (signal etc.),
1629 * then all other LWPs will stop as well.
1630 *
1631 * Returns non-zero for success, zero for failure.
1632 */
1633
1634 int
1635 proc_unset_async (procinfo *pi)
1636 {
1637 return proc_modify_flag (pi, PR_ASYNC, FLAG_RESET);
1638 }
1639 #endif /* PR_ASYNC */
1640
1641 /*
1642 * Function: proc_stop_process
1643 *
1644 * Request the process/LWP to stop. Does not wait.
1645 * Returns non-zero for success, zero for failure.
1646 */
1647
1648 int
1649 proc_stop_process (procinfo *pi)
1650 {
1651 int win;
1652
1653 /*
1654 * We might conceivably apply this operation to an LWP, and
1655 * the LWP's ctl file descriptor might not be open.
1656 */
1657
1658 if (pi->ctl_fd == 0 &&
1659 open_procinfo_files (pi, FD_CTL) == 0)
1660 return 0;
1661 else
1662 {
1663 #ifdef NEW_PROC_API
1664 procfs_ctl_t cmd = PCSTOP;
1665 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1666 #else /* ioctl method */
1667 win = (ioctl (pi->ctl_fd, PIOCSTOP, &pi->prstatus) >= 0);
1668 /* Note: the call also reads the prstatus. */
1669 if (win)
1670 {
1671 pi->status_valid = 1;
1672 PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1673 proc_why (pi),
1674 proc_what (pi),
1675 proc_get_current_thread (pi));
1676 }
1677 #endif
1678 }
1679
1680 return win;
1681 }
1682
1683 /*
1684 * Function: proc_wait_for_stop
1685 *
1686 * Wait for the process or LWP to stop (block until it does).
1687 * Returns non-zero for success, zero for failure.
1688 */
1689
1690 int
1691 proc_wait_for_stop (procinfo *pi)
1692 {
1693 int win;
1694
1695 /*
1696 * We should never have to apply this operation to any procinfo
1697 * except the one for the main process. If that ever changes
1698 * for any reason, then take out the following clause and
1699 * replace it with one that makes sure the ctl_fd is open.
1700 */
1701
1702 if (pi->tid != 0)
1703 pi = find_procinfo_or_die (pi->pid, 0);
1704
1705 #ifdef NEW_PROC_API
1706 {
1707 procfs_ctl_t cmd = PCWSTOP;
1708 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1709 /* We been runnin' and we stopped -- need to update status. */
1710 pi->status_valid = 0;
1711 }
1712 #else /* ioctl method */
1713 win = (ioctl (pi->ctl_fd, PIOCWSTOP, &pi->prstatus) >= 0);
1714 /* Above call also refreshes the prstatus. */
1715 if (win)
1716 {
1717 pi->status_valid = 1;
1718 PROC_PRETTYFPRINT_STATUS (proc_flags (pi),
1719 proc_why (pi),
1720 proc_what (pi),
1721 proc_get_current_thread (pi));
1722 }
1723 #endif
1724
1725 return win;
1726 }
1727
1728 /*
1729 * Function: proc_run_process
1730 *
1731 * Make the process or LWP runnable.
1732 * Options (not all are implemented):
1733 * - single-step
1734 * - clear current fault
1735 * - clear current signal
1736 * - abort the current system call
1737 * - stop as soon as finished with system call
1738 * - (ioctl): set traced signal set
1739 * - (ioctl): set held signal set
1740 * - (ioctl): set traced fault set
1741 * - (ioctl): set start pc (vaddr)
1742 * Always clear the current fault.
1743 * Clear the current signal if 'signo' is zero.
1744 *
1745 * Arguments:
1746 * pi the process or LWP to operate on.
1747 * step if true, set the process or LWP to trap after one instr.
1748 * signo if zero, clear the current signal if any.
1749 * if non-zero, set the current signal to this one.
1750 *
1751 * Returns non-zero for success, zero for failure.
1752 */
1753
1754 int
1755 proc_run_process (procinfo *pi, int step, int signo)
1756 {
1757 int win;
1758 int runflags;
1759
1760 /*
1761 * We will probably have to apply this operation to individual threads,
1762 * so make sure the control file descriptor is open.
1763 */
1764
1765 if (pi->ctl_fd == 0 &&
1766 open_procinfo_files (pi, FD_CTL) == 0)
1767 {
1768 return 0;
1769 }
1770
1771 runflags = PRCFAULT; /* always clear current fault */
1772 if (step)
1773 runflags |= PRSTEP;
1774 if (signo == 0)
1775 runflags |= PRCSIG;
1776 else if (signo != -1) /* -1 means do nothing W.R.T. signals */
1777 proc_set_current_signal (pi, signo);
1778
1779 #ifdef NEW_PROC_API
1780 {
1781 procfs_ctl_t cmd[2];
1782
1783 cmd[0] = PCRUN;
1784 cmd[1] = runflags;
1785 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
1786 }
1787 #else /* ioctl method */
1788 {
1789 prrun_t prrun;
1790
1791 memset (&prrun, 0, sizeof (prrun));
1792 prrun.pr_flags = runflags;
1793 win = (ioctl (pi->ctl_fd, PIOCRUN, &prrun) >= 0);
1794 }
1795 #endif
1796
1797 return win;
1798 }
1799
1800 /*
1801 * Function: proc_set_traced_signals
1802 *
1803 * Register to trace signals in the process or LWP.
1804 * Returns non-zero for success, zero for failure.
1805 */
1806
1807 int
1808 proc_set_traced_signals (procinfo *pi, gdb_sigset_t *sigset)
1809 {
1810 int win;
1811
1812 /*
1813 * We should never have to apply this operation to any procinfo
1814 * except the one for the main process. If that ever changes
1815 * for any reason, then take out the following clause and
1816 * replace it with one that makes sure the ctl_fd is open.
1817 */
1818
1819 if (pi->tid != 0)
1820 pi = find_procinfo_or_die (pi->pid, 0);
1821
1822 #ifdef NEW_PROC_API
1823 {
1824 struct {
1825 procfs_ctl_t cmd;
1826 /* Use char array to avoid alignment issues. */
1827 char sigset[sizeof (gdb_sigset_t)];
1828 } arg;
1829
1830 arg.cmd = PCSTRACE;
1831 memcpy (&arg.sigset, sigset, sizeof (gdb_sigset_t));
1832
1833 win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
1834 }
1835 #else /* ioctl method */
1836 win = (ioctl (pi->ctl_fd, PIOCSTRACE, sigset) >= 0);
1837 #endif
1838 /* The above operation renders the procinfo's cached pstatus obsolete. */
1839 pi->status_valid = 0;
1840
1841 if (!win)
1842 warning (_("procfs: set_traced_signals failed"));
1843 return win;
1844 }
1845
1846 /*
1847 * Function: proc_set_traced_faults
1848 *
1849 * Register to trace hardware faults in the process or LWP.
1850 * Returns non-zero for success, zero for failure.
1851 */
1852
1853 int
1854 proc_set_traced_faults (procinfo *pi, fltset_t *fltset)
1855 {
1856 int win;
1857
1858 /*
1859 * We should never have to apply this operation to any procinfo
1860 * except the one for the main process. If that ever changes
1861 * for any reason, then take out the following clause and
1862 * replace it with one that makes sure the ctl_fd is open.
1863 */
1864
1865 if (pi->tid != 0)
1866 pi = find_procinfo_or_die (pi->pid, 0);
1867
1868 #ifdef NEW_PROC_API
1869 {
1870 struct {
1871 procfs_ctl_t cmd;
1872 /* Use char array to avoid alignment issues. */
1873 char fltset[sizeof (fltset_t)];
1874 } arg;
1875
1876 arg.cmd = PCSFAULT;
1877 memcpy (&arg.fltset, fltset, sizeof (fltset_t));
1878
1879 win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
1880 }
1881 #else /* ioctl method */
1882 win = (ioctl (pi->ctl_fd, PIOCSFAULT, fltset) >= 0);
1883 #endif
1884 /* The above operation renders the procinfo's cached pstatus obsolete. */
1885 pi->status_valid = 0;
1886
1887 return win;
1888 }
1889
1890 /*
1891 * Function: proc_set_traced_sysentry
1892 *
1893 * Register to trace entry to system calls in the process or LWP.
1894 * Returns non-zero for success, zero for failure.
1895 */
1896
1897 int
1898 proc_set_traced_sysentry (procinfo *pi, sysset_t *sysset)
1899 {
1900 int win;
1901
1902 /*
1903 * We should never have to apply this operation to any procinfo
1904 * except the one for the main process. If that ever changes
1905 * for any reason, then take out the following clause and
1906 * replace it with one that makes sure the ctl_fd is open.
1907 */
1908
1909 if (pi->tid != 0)
1910 pi = find_procinfo_or_die (pi->pid, 0);
1911
1912 #ifdef NEW_PROC_API
1913 {
1914 struct gdb_proc_ctl_pcsentry {
1915 procfs_ctl_t cmd;
1916 /* Use char array to avoid alignment issues. */
1917 char sysset[sizeof (sysset_t)];
1918 } *argp;
1919 int argp_size = sizeof (struct gdb_proc_ctl_pcsentry)
1920 - sizeof (sysset_t)
1921 + sysset_t_size (pi);
1922
1923 argp = xmalloc (argp_size);
1924
1925 argp->cmd = PCSENTRY;
1926 memcpy (&argp->sysset, sysset, sysset_t_size (pi));
1927
1928 win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
1929 xfree (argp);
1930 }
1931 #else /* ioctl method */
1932 win = (ioctl (pi->ctl_fd, PIOCSENTRY, sysset) >= 0);
1933 #endif
1934 /* The above operation renders the procinfo's cached pstatus obsolete. */
1935 pi->status_valid = 0;
1936
1937 return win;
1938 }
1939
1940 /*
1941 * Function: proc_set_traced_sysexit
1942 *
1943 * Register to trace exit from system calls in the process or LWP.
1944 * Returns non-zero for success, zero for failure.
1945 */
1946
1947 int
1948 proc_set_traced_sysexit (procinfo *pi, sysset_t *sysset)
1949 {
1950 int win;
1951
1952 /*
1953 * We should never have to apply this operation to any procinfo
1954 * except the one for the main process. If that ever changes
1955 * for any reason, then take out the following clause and
1956 * replace it with one that makes sure the ctl_fd is open.
1957 */
1958
1959 if (pi->tid != 0)
1960 pi = find_procinfo_or_die (pi->pid, 0);
1961
1962 #ifdef NEW_PROC_API
1963 {
1964 struct gdb_proc_ctl_pcsexit {
1965 procfs_ctl_t cmd;
1966 /* Use char array to avoid alignment issues. */
1967 char sysset[sizeof (sysset_t)];
1968 } *argp;
1969 int argp_size = sizeof (struct gdb_proc_ctl_pcsexit)
1970 - sizeof (sysset_t)
1971 + sysset_t_size (pi);
1972
1973 argp = xmalloc (argp_size);
1974
1975 argp->cmd = PCSEXIT;
1976 memcpy (&argp->sysset, sysset, sysset_t_size (pi));
1977
1978 win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
1979 xfree (argp);
1980 }
1981 #else /* ioctl method */
1982 win = (ioctl (pi->ctl_fd, PIOCSEXIT, sysset) >= 0);
1983 #endif
1984 /* The above operation renders the procinfo's cached pstatus obsolete. */
1985 pi->status_valid = 0;
1986
1987 return win;
1988 }
1989
1990 /*
1991 * Function: proc_set_held_signals
1992 *
1993 * Specify the set of blocked / held signals in the process or LWP.
1994 * Returns non-zero for success, zero for failure.
1995 */
1996
1997 int
1998 proc_set_held_signals (procinfo *pi, gdb_sigset_t *sighold)
1999 {
2000 int win;
2001
2002 /*
2003 * We should never have to apply this operation to any procinfo
2004 * except the one for the main process. If that ever changes
2005 * for any reason, then take out the following clause and
2006 * replace it with one that makes sure the ctl_fd is open.
2007 */
2008
2009 if (pi->tid != 0)
2010 pi = find_procinfo_or_die (pi->pid, 0);
2011
2012 #ifdef NEW_PROC_API
2013 {
2014 struct {
2015 procfs_ctl_t cmd;
2016 /* Use char array to avoid alignment issues. */
2017 char hold[sizeof (gdb_sigset_t)];
2018 } arg;
2019
2020 arg.cmd = PCSHOLD;
2021 memcpy (&arg.hold, sighold, sizeof (gdb_sigset_t));
2022 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2023 }
2024 #else
2025 win = (ioctl (pi->ctl_fd, PIOCSHOLD, sighold) >= 0);
2026 #endif
2027 /* The above operation renders the procinfo's cached pstatus obsolete. */
2028 pi->status_valid = 0;
2029
2030 return win;
2031 }
2032
2033 /*
2034 * Function: proc_get_pending_signals
2035 *
2036 * returns the set of signals that are pending in the process or LWP.
2037 * Will also copy the sigset if 'save' is non-zero.
2038 */
2039
2040 gdb_sigset_t *
2041 proc_get_pending_signals (procinfo *pi, gdb_sigset_t *save)
2042 {
2043 gdb_sigset_t *ret = NULL;
2044
2045 /*
2046 * We should never have to apply this operation to any procinfo
2047 * except the one for the main process. If that ever changes
2048 * for any reason, then take out the following clause and
2049 * replace it with one that makes sure the ctl_fd is open.
2050 */
2051
2052 if (pi->tid != 0)
2053 pi = find_procinfo_or_die (pi->pid, 0);
2054
2055 if (!pi->status_valid)
2056 if (!proc_get_status (pi))
2057 return NULL;
2058
2059 #ifdef NEW_PROC_API
2060 ret = &pi->prstatus.pr_lwp.pr_lwppend;
2061 #else
2062 ret = &pi->prstatus.pr_sigpend;
2063 #endif
2064 if (save && ret)
2065 memcpy (save, ret, sizeof (gdb_sigset_t));
2066
2067 return ret;
2068 }
2069
2070 /*
2071 * Function: proc_get_signal_actions
2072 *
2073 * returns the set of signal actions.
2074 * Will also copy the sigactionset if 'save' is non-zero.
2075 */
2076
2077 gdb_sigaction_t *
2078 proc_get_signal_actions (procinfo *pi, gdb_sigaction_t *save)
2079 {
2080 gdb_sigaction_t *ret = NULL;
2081
2082 /*
2083 * We should never have to apply this operation to any procinfo
2084 * except the one for the main process. If that ever changes
2085 * for any reason, then take out the following clause and
2086 * replace it with one that makes sure the ctl_fd is open.
2087 */
2088
2089 if (pi->tid != 0)
2090 pi = find_procinfo_or_die (pi->pid, 0);
2091
2092 if (!pi->status_valid)
2093 if (!proc_get_status (pi))
2094 return NULL;
2095
2096 #ifdef NEW_PROC_API
2097 ret = &pi->prstatus.pr_lwp.pr_action;
2098 #else
2099 ret = &pi->prstatus.pr_action;
2100 #endif
2101 if (save && ret)
2102 memcpy (save, ret, sizeof (gdb_sigaction_t));
2103
2104 return ret;
2105 }
2106
2107 /*
2108 * Function: proc_get_held_signals
2109 *
2110 * returns the set of signals that are held / blocked.
2111 * Will also copy the sigset if 'save' is non-zero.
2112 */
2113
2114 gdb_sigset_t *
2115 proc_get_held_signals (procinfo *pi, gdb_sigset_t *save)
2116 {
2117 gdb_sigset_t *ret = NULL;
2118
2119 /*
2120 * We should never have to apply this operation to any procinfo
2121 * except the one for the main process. If that ever changes
2122 * for any reason, then take out the following clause and
2123 * replace it with one that makes sure the ctl_fd is open.
2124 */
2125
2126 if (pi->tid != 0)
2127 pi = find_procinfo_or_die (pi->pid, 0);
2128
2129 #ifdef NEW_PROC_API
2130 if (!pi->status_valid)
2131 if (!proc_get_status (pi))
2132 return NULL;
2133
2134 #ifdef UNIXWARE
2135 ret = &pi->prstatus.pr_lwp.pr_context.uc_sigmask;
2136 #else
2137 ret = &pi->prstatus.pr_lwp.pr_lwphold;
2138 #endif /* UNIXWARE */
2139 #else /* not NEW_PROC_API */
2140 {
2141 static gdb_sigset_t sigheld;
2142
2143 if (ioctl (pi->ctl_fd, PIOCGHOLD, &sigheld) >= 0)
2144 ret = &sigheld;
2145 }
2146 #endif /* NEW_PROC_API */
2147 if (save && ret)
2148 memcpy (save, ret, sizeof (gdb_sigset_t));
2149
2150 return ret;
2151 }
2152
2153 /*
2154 * Function: proc_get_traced_signals
2155 *
2156 * returns the set of signals that are traced / debugged.
2157 * Will also copy the sigset if 'save' is non-zero.
2158 */
2159
2160 gdb_sigset_t *
2161 proc_get_traced_signals (procinfo *pi, gdb_sigset_t *save)
2162 {
2163 gdb_sigset_t *ret = NULL;
2164
2165 /*
2166 * We should never have to apply this operation to any procinfo
2167 * except the one for the main process. If that ever changes
2168 * for any reason, then take out the following clause and
2169 * replace it with one that makes sure the ctl_fd is open.
2170 */
2171
2172 if (pi->tid != 0)
2173 pi = find_procinfo_or_die (pi->pid, 0);
2174
2175 #ifdef NEW_PROC_API
2176 if (!pi->status_valid)
2177 if (!proc_get_status (pi))
2178 return NULL;
2179
2180 ret = &pi->prstatus.pr_sigtrace;
2181 #else
2182 {
2183 static gdb_sigset_t sigtrace;
2184
2185 if (ioctl (pi->ctl_fd, PIOCGTRACE, &sigtrace) >= 0)
2186 ret = &sigtrace;
2187 }
2188 #endif
2189 if (save && ret)
2190 memcpy (save, ret, sizeof (gdb_sigset_t));
2191
2192 return ret;
2193 }
2194
2195 /*
2196 * Function: proc_trace_signal
2197 *
2198 * Add 'signo' to the set of signals that are traced.
2199 * Returns non-zero for success, zero for failure.
2200 */
2201
2202 int
2203 proc_trace_signal (procinfo *pi, int signo)
2204 {
2205 gdb_sigset_t temp;
2206
2207 /*
2208 * We should never have to apply this operation to any procinfo
2209 * except the one for the main process. If that ever changes
2210 * for any reason, then take out the following clause and
2211 * replace it with one that makes sure the ctl_fd is open.
2212 */
2213
2214 if (pi->tid != 0)
2215 pi = find_procinfo_or_die (pi->pid, 0);
2216
2217 if (pi)
2218 {
2219 if (proc_get_traced_signals (pi, &temp))
2220 {
2221 praddset (&temp, signo);
2222 return proc_set_traced_signals (pi, &temp);
2223 }
2224 }
2225
2226 return 0; /* failure */
2227 }
2228
2229 /*
2230 * Function: proc_ignore_signal
2231 *
2232 * Remove 'signo' from the set of signals that are traced.
2233 * Returns non-zero for success, zero for failure.
2234 */
2235
2236 int
2237 proc_ignore_signal (procinfo *pi, int signo)
2238 {
2239 gdb_sigset_t temp;
2240
2241 /*
2242 * We should never have to apply this operation to any procinfo
2243 * except the one for the main process. If that ever changes
2244 * for any reason, then take out the following clause and
2245 * replace it with one that makes sure the ctl_fd is open.
2246 */
2247
2248 if (pi->tid != 0)
2249 pi = find_procinfo_or_die (pi->pid, 0);
2250
2251 if (pi)
2252 {
2253 if (proc_get_traced_signals (pi, &temp))
2254 {
2255 prdelset (&temp, signo);
2256 return proc_set_traced_signals (pi, &temp);
2257 }
2258 }
2259
2260 return 0; /* failure */
2261 }
2262
2263 /*
2264 * Function: proc_get_traced_faults
2265 *
2266 * returns the set of hardware faults that are traced /debugged.
2267 * Will also copy the faultset if 'save' is non-zero.
2268 */
2269
2270 fltset_t *
2271 proc_get_traced_faults (procinfo *pi, fltset_t *save)
2272 {
2273 fltset_t *ret = NULL;
2274
2275 /*
2276 * We should never have to apply this operation to any procinfo
2277 * except the one for the main process. If that ever changes
2278 * for any reason, then take out the following clause and
2279 * replace it with one that makes sure the ctl_fd is open.
2280 */
2281
2282 if (pi->tid != 0)
2283 pi = find_procinfo_or_die (pi->pid, 0);
2284
2285 #ifdef NEW_PROC_API
2286 if (!pi->status_valid)
2287 if (!proc_get_status (pi))
2288 return NULL;
2289
2290 ret = &pi->prstatus.pr_flttrace;
2291 #else
2292 {
2293 static fltset_t flttrace;
2294
2295 if (ioctl (pi->ctl_fd, PIOCGFAULT, &flttrace) >= 0)
2296 ret = &flttrace;
2297 }
2298 #endif
2299 if (save && ret)
2300 memcpy (save, ret, sizeof (fltset_t));
2301
2302 return ret;
2303 }
2304
2305 /*
2306 * Function: proc_get_traced_sysentry
2307 *
2308 * returns the set of syscalls that are traced /debugged on entry.
2309 * Will also copy the syscall set if 'save' is non-zero.
2310 */
2311
2312 sysset_t *
2313 proc_get_traced_sysentry (procinfo *pi, sysset_t *save)
2314 {
2315 sysset_t *ret = NULL;
2316
2317 /*
2318 * We should never have to apply this operation to any procinfo
2319 * except the one for the main process. If that ever changes
2320 * for any reason, then take out the following clause and
2321 * replace it with one that makes sure the ctl_fd is open.
2322 */
2323
2324 if (pi->tid != 0)
2325 pi = find_procinfo_or_die (pi->pid, 0);
2326
2327 #ifdef NEW_PROC_API
2328 if (!pi->status_valid)
2329 if (!proc_get_status (pi))
2330 return NULL;
2331
2332 #ifndef DYNAMIC_SYSCALLS
2333 ret = &pi->prstatus.pr_sysentry;
2334 #else /* DYNAMIC_SYSCALLS */
2335 {
2336 static sysset_t *sysentry;
2337 size_t size;
2338
2339 if (!sysentry)
2340 sysentry = sysset_t_alloc (pi);
2341 ret = sysentry;
2342 if (pi->status_fd == 0 && open_procinfo_files (pi, FD_STATUS) == 0)
2343 return NULL;
2344 if (pi->prstatus.pr_sysentry_offset == 0)
2345 {
2346 gdb_premptysysset (sysentry);
2347 }
2348 else
2349 {
2350 int rsize;
2351
2352 if (lseek (pi->status_fd, (off_t) pi->prstatus.pr_sysentry_offset,
2353 SEEK_SET)
2354 != (off_t) pi->prstatus.pr_sysentry_offset)
2355 return NULL;
2356 size = sysset_t_size (pi);
2357 gdb_premptysysset (sysentry);
2358 rsize = read (pi->status_fd, sysentry, size);
2359 if (rsize < 0)
2360 return NULL;
2361 }
2362 }
2363 #endif /* DYNAMIC_SYSCALLS */
2364 #else /* !NEW_PROC_API */
2365 {
2366 static sysset_t sysentry;
2367
2368 if (ioctl (pi->ctl_fd, PIOCGENTRY, &sysentry) >= 0)
2369 ret = &sysentry;
2370 }
2371 #endif /* NEW_PROC_API */
2372 if (save && ret)
2373 memcpy (save, ret, sysset_t_size (pi));
2374
2375 return ret;
2376 }
2377
2378 /*
2379 * Function: proc_get_traced_sysexit
2380 *
2381 * returns the set of syscalls that are traced /debugged on exit.
2382 * Will also copy the syscall set if 'save' is non-zero.
2383 */
2384
2385 sysset_t *
2386 proc_get_traced_sysexit (procinfo *pi, sysset_t *save)
2387 {
2388 sysset_t * ret = NULL;
2389
2390 /*
2391 * We should never have to apply this operation to any procinfo
2392 * except the one for the main process. If that ever changes
2393 * for any reason, then take out the following clause and
2394 * replace it with one that makes sure the ctl_fd is open.
2395 */
2396
2397 if (pi->tid != 0)
2398 pi = find_procinfo_or_die (pi->pid, 0);
2399
2400 #ifdef NEW_PROC_API
2401 if (!pi->status_valid)
2402 if (!proc_get_status (pi))
2403 return NULL;
2404
2405 #ifndef DYNAMIC_SYSCALLS
2406 ret = &pi->prstatus.pr_sysexit;
2407 #else /* DYNAMIC_SYSCALLS */
2408 {
2409 static sysset_t *sysexit;
2410 size_t size;
2411
2412 if (!sysexit)
2413 sysexit = sysset_t_alloc (pi);
2414 ret = sysexit;
2415 if (pi->status_fd == 0 && open_procinfo_files (pi, FD_STATUS) == 0)
2416 return NULL;
2417 if (pi->prstatus.pr_sysexit_offset == 0)
2418 {
2419 gdb_premptysysset (sysexit);
2420 }
2421 else
2422 {
2423 int rsize;
2424
2425 if (lseek (pi->status_fd, (off_t) pi->prstatus.pr_sysexit_offset, SEEK_SET)
2426 != (off_t) pi->prstatus.pr_sysexit_offset)
2427 return NULL;
2428 size = sysset_t_size (pi);
2429 gdb_premptysysset (sysexit);
2430 rsize = read (pi->status_fd, sysexit, size);
2431 if (rsize < 0)
2432 return NULL;
2433 }
2434 }
2435 #endif /* DYNAMIC_SYSCALLS */
2436 #else
2437 {
2438 static sysset_t sysexit;
2439
2440 if (ioctl (pi->ctl_fd, PIOCGEXIT, &sysexit) >= 0)
2441 ret = &sysexit;
2442 }
2443 #endif
2444 if (save && ret)
2445 memcpy (save, ret, sysset_t_size (pi));
2446
2447 return ret;
2448 }
2449
2450 /*
2451 * Function: proc_clear_current_fault
2452 *
2453 * The current fault (if any) is cleared; the associated signal
2454 * will not be sent to the process or LWP when it resumes.
2455 * Returns non-zero for success, zero for failure.
2456 */
2457
2458 int
2459 proc_clear_current_fault (procinfo *pi)
2460 {
2461 int win;
2462
2463 /*
2464 * We should never have to apply this operation to any procinfo
2465 * except the one for the main process. If that ever changes
2466 * for any reason, then take out the following clause and
2467 * replace it with one that makes sure the ctl_fd is open.
2468 */
2469
2470 if (pi->tid != 0)
2471 pi = find_procinfo_or_die (pi->pid, 0);
2472
2473 #ifdef NEW_PROC_API
2474 {
2475 procfs_ctl_t cmd = PCCFAULT;
2476 win = (write (pi->ctl_fd, (void *) &cmd, sizeof (cmd)) == sizeof (cmd));
2477 }
2478 #else
2479 win = (ioctl (pi->ctl_fd, PIOCCFAULT, 0) >= 0);
2480 #endif
2481
2482 return win;
2483 }
2484
2485 /*
2486 * Function: proc_set_current_signal
2487 *
2488 * Set the "current signal" that will be delivered next to the process.
2489 * NOTE: semantics are different from those of KILL.
2490 * This signal will be delivered to the process or LWP
2491 * immediately when it is resumed (even if the signal is held/blocked);
2492 * it will NOT immediately cause another event of interest, and will NOT
2493 * first trap back to the debugger.
2494 *
2495 * Returns non-zero for success, zero for failure.
2496 */
2497
2498 int
2499 proc_set_current_signal (procinfo *pi, int signo)
2500 {
2501 int win;
2502 struct {
2503 procfs_ctl_t cmd;
2504 /* Use char array to avoid alignment issues. */
2505 char sinfo[sizeof (gdb_siginfo_t)];
2506 } arg;
2507 gdb_siginfo_t *mysinfo;
2508 ptid_t wait_ptid;
2509 struct target_waitstatus wait_status;
2510
2511 /*
2512 * We should never have to apply this operation to any procinfo
2513 * except the one for the main process. If that ever changes
2514 * for any reason, then take out the following clause and
2515 * replace it with one that makes sure the ctl_fd is open.
2516 */
2517
2518 if (pi->tid != 0)
2519 pi = find_procinfo_or_die (pi->pid, 0);
2520
2521 #ifdef PROCFS_DONT_PIOCSSIG_CURSIG
2522 /* With Alpha OSF/1 procfs, the kernel gets really confused if it
2523 * receives a PIOCSSIG with a signal identical to the current signal,
2524 * it messes up the current signal. Work around the kernel bug.
2525 */
2526 if (signo > 0 &&
2527 signo == proc_cursig (pi))
2528 return 1; /* I assume this is a success? */
2529 #endif
2530
2531 /* The pointer is just a type alias. */
2532 mysinfo = (gdb_siginfo_t *) &arg.sinfo;
2533 get_last_target_status (&wait_ptid, &wait_status);
2534 if (ptid_equal (wait_ptid, inferior_ptid)
2535 && wait_status.kind == TARGET_WAITKIND_STOPPED
2536 && wait_status.value.sig == target_signal_from_host (signo)
2537 && proc_get_status (pi)
2538 #ifdef NEW_PROC_API
2539 && pi->prstatus.pr_lwp.pr_info.si_signo == signo
2540 #else
2541 && pi->prstatus.pr_info.si_signo == signo
2542 #endif
2543 )
2544 /* Use the siginfo associated with the signal being
2545 redelivered. */
2546 #ifdef NEW_PROC_API
2547 memcpy (mysinfo, &pi->prstatus.pr_lwp.pr_info, sizeof (gdb_siginfo_t));
2548 #else
2549 memcpy (mysinfo, &pi->prstatus.pr_info, sizeof (gdb_siginfo_t));
2550 #endif
2551 else
2552 {
2553 mysinfo->si_signo = signo;
2554 mysinfo->si_code = 0;
2555 mysinfo->si_pid = getpid (); /* ?why? */
2556 mysinfo->si_uid = getuid (); /* ?why? */
2557 }
2558
2559 #ifdef NEW_PROC_API
2560 arg.cmd = PCSSIG;
2561 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2562 #else
2563 win = (ioctl (pi->ctl_fd, PIOCSSIG, (void *) &arg.sinfo) >= 0);
2564 #endif
2565
2566 return win;
2567 }
2568
2569 /*
2570 * Function: proc_clear_current_signal
2571 *
2572 * The current signal (if any) is cleared, and
2573 * is not sent to the process or LWP when it resumes.
2574 * Returns non-zero for success, zero for failure.
2575 */
2576
2577 int
2578 proc_clear_current_signal (procinfo *pi)
2579 {
2580 int win;
2581
2582 /*
2583 * We should never have to apply this operation to any procinfo
2584 * except the one for the main process. If that ever changes
2585 * for any reason, then take out the following clause and
2586 * replace it with one that makes sure the ctl_fd is open.
2587 */
2588
2589 if (pi->tid != 0)
2590 pi = find_procinfo_or_die (pi->pid, 0);
2591
2592 #ifdef NEW_PROC_API
2593 {
2594 struct {
2595 procfs_ctl_t cmd;
2596 /* Use char array to avoid alignment issues. */
2597 char sinfo[sizeof (gdb_siginfo_t)];
2598 } arg;
2599 gdb_siginfo_t *mysinfo;
2600
2601 arg.cmd = PCSSIG;
2602 /* The pointer is just a type alias. */
2603 mysinfo = (gdb_siginfo_t *) &arg.sinfo;
2604 mysinfo->si_signo = 0;
2605 mysinfo->si_code = 0;
2606 mysinfo->si_errno = 0;
2607 mysinfo->si_pid = getpid (); /* ?why? */
2608 mysinfo->si_uid = getuid (); /* ?why? */
2609
2610 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2611 }
2612 #else
2613 win = (ioctl (pi->ctl_fd, PIOCSSIG, 0) >= 0);
2614 #endif
2615
2616 return win;
2617 }
2618
2619 /* Return the general-purpose registers for the process or LWP
2620 corresponding to PI. Upon failure, return NULL. */
2621
2622 gdb_gregset_t *
2623 proc_get_gregs (procinfo *pi)
2624 {
2625 if (!pi->status_valid || !pi->gregs_valid)
2626 if (!proc_get_status (pi))
2627 return NULL;
2628
2629 /* OK, sorry about the ifdef's. There's three cases instead of two,
2630 because in this case Unixware and Solaris/RW differ. */
2631
2632 #ifdef NEW_PROC_API
2633 # ifdef UNIXWARE /* FIXME: Should be autoconfigured. */
2634 return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.gregs;
2635 # else
2636 return &pi->prstatus.pr_lwp.pr_reg;
2637 # endif
2638 #else
2639 return &pi->prstatus.pr_reg;
2640 #endif
2641 }
2642
2643 /* Return the general-purpose registers for the process or LWP
2644 corresponding to PI. Upon failure, return NULL. */
2645
2646 gdb_fpregset_t *
2647 proc_get_fpregs (procinfo *pi)
2648 {
2649 #ifdef NEW_PROC_API
2650 if (!pi->status_valid || !pi->fpregs_valid)
2651 if (!proc_get_status (pi))
2652 return NULL;
2653
2654 # ifdef UNIXWARE /* FIXME: Should be autoconfigured. */
2655 return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.fpregs;
2656 # else
2657 return &pi->prstatus.pr_lwp.pr_fpreg;
2658 # endif
2659
2660 #else /* not NEW_PROC_API */
2661 if (pi->fpregs_valid)
2662 return &pi->fpregset; /* Already got 'em. */
2663 else
2664 {
2665 if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2666 {
2667 return NULL;
2668 }
2669 else
2670 {
2671 # ifdef PIOCTGFPREG
2672 struct {
2673 long pr_count;
2674 tid_t pr_error_thread;
2675 tfpregset_t thread_1;
2676 } thread_fpregs;
2677
2678 thread_fpregs.pr_count = 1;
2679 thread_fpregs.thread_1.tid = pi->tid;
2680
2681 if (pi->tid == 0
2682 && ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset) >= 0)
2683 {
2684 pi->fpregs_valid = 1;
2685 return &pi->fpregset; /* Got 'em now! */
2686 }
2687 else if (pi->tid != 0
2688 && ioctl (pi->ctl_fd, PIOCTGFPREG, &thread_fpregs) >= 0)
2689 {
2690 memcpy (&pi->fpregset, &thread_fpregs.thread_1.pr_fpregs,
2691 sizeof (pi->fpregset));
2692 pi->fpregs_valid = 1;
2693 return &pi->fpregset; /* Got 'em now! */
2694 }
2695 else
2696 {
2697 return NULL;
2698 }
2699 # else
2700 if (ioctl (pi->ctl_fd, PIOCGFPREG, &pi->fpregset) >= 0)
2701 {
2702 pi->fpregs_valid = 1;
2703 return &pi->fpregset; /* Got 'em now! */
2704 }
2705 else
2706 {
2707 return NULL;
2708 }
2709 # endif
2710 }
2711 }
2712 #endif /* NEW_PROC_API */
2713 }
2714
2715 /* Write the general-purpose registers back to the process or LWP
2716 corresponding to PI. Return non-zero for success, zero for
2717 failure. */
2718
2719 int
2720 proc_set_gregs (procinfo *pi)
2721 {
2722 gdb_gregset_t *gregs;
2723 int win;
2724
2725 gregs = proc_get_gregs (pi);
2726 if (gregs == NULL)
2727 return 0; /* proc_get_regs has already warned. */
2728
2729 if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2730 {
2731 return 0;
2732 }
2733 else
2734 {
2735 #ifdef NEW_PROC_API
2736 struct {
2737 procfs_ctl_t cmd;
2738 /* Use char array to avoid alignment issues. */
2739 char gregs[sizeof (gdb_gregset_t)];
2740 } arg;
2741
2742 arg.cmd = PCSREG;
2743 memcpy (&arg.gregs, gregs, sizeof (arg.gregs));
2744 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2745 #else
2746 win = (ioctl (pi->ctl_fd, PIOCSREG, gregs) >= 0);
2747 #endif
2748 }
2749
2750 /* Policy: writing the registers invalidates our cache. */
2751 pi->gregs_valid = 0;
2752 return win;
2753 }
2754
2755 /* Write the floating-pointer registers back to the process or LWP
2756 corresponding to PI. Return non-zero for success, zero for
2757 failure. */
2758
2759 int
2760 proc_set_fpregs (procinfo *pi)
2761 {
2762 gdb_fpregset_t *fpregs;
2763 int win;
2764
2765 fpregs = proc_get_fpregs (pi);
2766 if (fpregs == NULL)
2767 return 0; /* proc_get_fpregs has already warned. */
2768
2769 if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
2770 {
2771 return 0;
2772 }
2773 else
2774 {
2775 #ifdef NEW_PROC_API
2776 struct {
2777 procfs_ctl_t cmd;
2778 /* Use char array to avoid alignment issues. */
2779 char fpregs[sizeof (gdb_fpregset_t)];
2780 } arg;
2781
2782 arg.cmd = PCSFPREG;
2783 memcpy (&arg.fpregs, fpregs, sizeof (arg.fpregs));
2784 win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
2785 #else
2786 # ifdef PIOCTSFPREG
2787 if (pi->tid == 0)
2788 win = (ioctl (pi->ctl_fd, PIOCSFPREG, fpregs) >= 0);
2789 else
2790 {
2791 struct {
2792 long pr_count;
2793 tid_t pr_error_thread;
2794 tfpregset_t thread_1;
2795 } thread_fpregs;
2796
2797 thread_fpregs.pr_count = 1;
2798 thread_fpregs.thread_1.tid = pi->tid;
2799 memcpy (&thread_fpregs.thread_1.pr_fpregs, fpregs,
2800 sizeof (*fpregs));
2801 win = (ioctl (pi->ctl_fd, PIOCTSFPREG, &thread_fpregs) >= 0);
2802 }
2803 # else
2804 win = (ioctl (pi->ctl_fd, PIOCSFPREG, fpregs) >= 0);
2805 # endif
2806 #endif /* NEW_PROC_API */
2807 }
2808
2809 /* Policy: writing the registers invalidates our cache. */
2810 pi->fpregs_valid = 0;
2811 return win;
2812 }
2813
2814 /*
2815 * Function: proc_kill
2816 *
2817 * Send a signal to the proc or lwp with the semantics of "kill()".
2818 * Returns non-zero for success, zero for failure.
2819 */
2820
2821 int
2822 proc_kill (procinfo *pi, int signo)
2823 {
2824 int win;
2825
2826 /*
2827 * We might conceivably apply this operation to an LWP, and
2828 * the LWP's ctl file descriptor might not be open.
2829 */
2830
2831 if (pi->ctl_fd == 0 &&
2832 open_procinfo_files (pi, FD_CTL) == 0)
2833 {
2834 return 0;
2835 }
2836 else
2837 {
2838 #ifdef NEW_PROC_API
2839 procfs_ctl_t cmd[2];
2840
2841 cmd[0] = PCKILL;
2842 cmd[1] = signo;
2843 win = (write (pi->ctl_fd, (char *) &cmd, sizeof (cmd)) == sizeof (cmd));
2844 #else /* ioctl method */
2845 /* FIXME: do I need the Alpha OSF fixups present in
2846 procfs.c/unconditionally_kill_inferior? Perhaps only for SIGKILL? */
2847 win = (ioctl (pi->ctl_fd, PIOCKILL, &signo) >= 0);
2848 #endif
2849 }
2850
2851 return win;
2852 }
2853
2854 /*
2855 * Function: proc_parent_pid
2856 *
2857 * Find the pid of the process that started this one.
2858 * Returns the parent process pid, or zero.
2859 */
2860
2861 int
2862 proc_parent_pid (procinfo *pi)
2863 {
2864 /*
2865 * We should never have to apply this operation to any procinfo
2866 * except the one for the main process. If that ever changes
2867 * for any reason, then take out the following clause and
2868 * replace it with one that makes sure the ctl_fd is open.
2869 */
2870
2871 if (pi->tid != 0)
2872 pi = find_procinfo_or_die (pi->pid, 0);
2873
2874 if (!pi->status_valid)
2875 if (!proc_get_status (pi))
2876 return 0;
2877
2878 return pi->prstatus.pr_ppid;
2879 }
2880
2881
2882 /* Convert a target address (a.k.a. CORE_ADDR) into a host address
2883 (a.k.a void pointer)! */
2884
2885 static void *
2886 procfs_address_to_host_pointer (CORE_ADDR addr)
2887 {
2888 struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
2889 void *ptr;
2890
2891 gdb_assert (sizeof (ptr) == TYPE_LENGTH (ptr_type));
2892 gdbarch_address_to_pointer (target_gdbarch, ptr_type,
2893 (gdb_byte *) &ptr, addr);
2894 return ptr;
2895 }
2896
2897 /*
2898 * Function: proc_set_watchpoint
2899 *
2900 */
2901
2902 int
2903 proc_set_watchpoint (procinfo *pi, CORE_ADDR addr, int len, int wflags)
2904 {
2905 #if !defined (TARGET_HAS_HARDWARE_WATCHPOINTS)
2906 return 0;
2907 #else
2908 /* Horrible hack! Detect Solaris 2.5, because this doesn't work on 2.5 */
2909 #if defined (PIOCOPENLWP) || defined (UNIXWARE) /* Solaris 2.5: bail out */
2910 return 0;
2911 #else
2912 struct {
2913 procfs_ctl_t cmd;
2914 char watch[sizeof (prwatch_t)];
2915 } arg;
2916 prwatch_t *pwatch;
2917
2918 pwatch = (prwatch_t *) &arg.watch;
2919 /* NOTE: cagney/2003-02-01: Even more horrible hack. Need to
2920 convert a target address into something that can be stored in a
2921 native data structure. */
2922 #ifdef PCAGENT /* Horrible hack: only defined on Solaris 2.6+ */
2923 pwatch->pr_vaddr = (uintptr_t) procfs_address_to_host_pointer (addr);
2924 #else
2925 pwatch->pr_vaddr = (caddr_t) procfs_address_to_host_pointer (addr);
2926 #endif
2927 pwatch->pr_size = len;
2928 pwatch->pr_wflags = wflags;
2929 #if defined(NEW_PROC_API) && defined (PCWATCH)
2930 arg.cmd = PCWATCH;
2931 return (write (pi->ctl_fd, &arg, sizeof (arg)) == sizeof (arg));
2932 #else
2933 #if defined (PIOCSWATCH)
2934 return (ioctl (pi->ctl_fd, PIOCSWATCH, pwatch) >= 0);
2935 #else
2936 return 0; /* Fail */
2937 #endif
2938 #endif
2939 #endif
2940 #endif
2941 }
2942
2943 #if (defined(__i386__) || defined(__x86_64__)) && defined (sun)
2944
2945 #include <sys/sysi86.h>
2946
2947 /*
2948 * Function: proc_get_LDT_entry
2949 *
2950 * Inputs:
2951 * procinfo *pi;
2952 * int key;
2953 *
2954 * The 'key' is actually the value of the lower 16 bits of
2955 * the GS register for the LWP that we're interested in.
2956 *
2957 * Return: matching ssh struct (LDT entry).
2958 */
2959
2960 struct ssd *
2961 proc_get_LDT_entry (procinfo *pi, int key)
2962 {
2963 static struct ssd *ldt_entry = NULL;
2964 #ifdef NEW_PROC_API
2965 char pathname[MAX_PROC_NAME_SIZE];
2966 struct cleanup *old_chain = NULL;
2967 int fd;
2968
2969 /* Allocate space for one LDT entry.
2970 This alloc must persist, because we return a pointer to it. */
2971 if (ldt_entry == NULL)
2972 ldt_entry = (struct ssd *) xmalloc (sizeof (struct ssd));
2973
2974 /* Open the file descriptor for the LDT table. */
2975 sprintf (pathname, "/proc/%d/ldt", pi->pid);
2976 if ((fd = open_with_retry (pathname, O_RDONLY)) < 0)
2977 {
2978 proc_warn (pi, "proc_get_LDT_entry (open)", __LINE__);
2979 return NULL;
2980 }
2981 /* Make sure it gets closed again! */
2982 old_chain = make_cleanup_close (fd);
2983
2984 /* Now 'read' thru the table, find a match and return it. */
2985 while (read (fd, ldt_entry, sizeof (struct ssd)) == sizeof (struct ssd))
2986 {
2987 if (ldt_entry->sel == 0 &&
2988 ldt_entry->bo == 0 &&
2989 ldt_entry->acc1 == 0 &&
2990 ldt_entry->acc2 == 0)
2991 break; /* end of table */
2992 /* If key matches, return this entry. */
2993 if (ldt_entry->sel == key)
2994 return ldt_entry;
2995 }
2996 /* Loop ended, match not found. */
2997 return NULL;
2998 #else
2999 int nldt, i;
3000 static int nalloc = 0;
3001
3002 /* Get the number of LDT entries. */
3003 if (ioctl (pi->ctl_fd, PIOCNLDT, &nldt) < 0)
3004 {
3005 proc_warn (pi, "proc_get_LDT_entry (PIOCNLDT)", __LINE__);
3006 return NULL;
3007 }
3008
3009 /* Allocate space for the number of LDT entries. */
3010 /* This alloc has to persist, 'cause we return a pointer to it. */
3011 if (nldt > nalloc)
3012 {
3013 ldt_entry = (struct ssd *)
3014 xrealloc (ldt_entry, (nldt + 1) * sizeof (struct ssd));
3015 nalloc = nldt;
3016 }
3017
3018 /* Read the whole table in one gulp. */
3019 if (ioctl (pi->ctl_fd, PIOCLDT, ldt_entry) < 0)
3020 {
3021 proc_warn (pi, "proc_get_LDT_entry (PIOCLDT)", __LINE__);
3022 return NULL;
3023 }
3024
3025 /* Search the table and return the (first) entry matching 'key'. */
3026 for (i = 0; i < nldt; i++)
3027 if (ldt_entry[i].sel == key)
3028 return &ldt_entry[i];
3029
3030 /* Loop ended, match not found. */
3031 return NULL;
3032 #endif
3033 }
3034
3035 /*
3036 * Function: procfs_find_LDT_entry
3037 *
3038 * Input:
3039 * ptid_t ptid; // The GDB-style pid-plus-LWP.
3040 *
3041 * Return:
3042 * pointer to the corresponding LDT entry.
3043 */
3044
3045 struct ssd *
3046 procfs_find_LDT_entry (ptid_t ptid)
3047 {
3048 gdb_gregset_t *gregs;
3049 int key;
3050 procinfo *pi;
3051
3052 /* Find procinfo for the lwp. */
3053 if ((pi = find_procinfo (PIDGET (ptid), TIDGET (ptid))) == NULL)
3054 {
3055 warning (_("procfs_find_LDT_entry: could not find procinfo for %d:%ld."),
3056 PIDGET (ptid), TIDGET (ptid));
3057 return NULL;
3058 }
3059 /* get its general registers. */
3060 if ((gregs = proc_get_gregs (pi)) == NULL)
3061 {
3062 warning (_("procfs_find_LDT_entry: could not read gregs for %d:%ld."),
3063 PIDGET (ptid), TIDGET (ptid));
3064 return NULL;
3065 }
3066 /* Now extract the GS register's lower 16 bits. */
3067 key = (*gregs)[GS] & 0xffff;
3068
3069 /* Find the matching entry and return it. */
3070 return proc_get_LDT_entry (pi, key);
3071 }
3072
3073 #endif
3074
3075 /* =============== END, non-thread part of /proc "MODULE" =============== */
3076
3077 /* =================== Thread "MODULE" =================== */
3078
3079 /* NOTE: you'll see more ifdefs and duplication of functions here,
3080 since there is a different way to do threads on every OS. */
3081
3082 /*
3083 * Function: proc_get_nthreads
3084 *
3085 * Return the number of threads for the process
3086 */
3087
3088 #if defined (PIOCNTHR) && defined (PIOCTLIST)
3089 /*
3090 * OSF version
3091 */
3092 int
3093 proc_get_nthreads (procinfo *pi)
3094 {
3095 int nthreads = 0;
3096
3097 if (ioctl (pi->ctl_fd, PIOCNTHR, &nthreads) < 0)
3098 proc_warn (pi, "procfs: PIOCNTHR failed", __LINE__);
3099
3100 return nthreads;
3101 }
3102
3103 #else
3104 #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */
3105 /*
3106 * Solaris and Unixware version
3107 */
3108 int
3109 proc_get_nthreads (procinfo *pi)
3110 {
3111 if (!pi->status_valid)
3112 if (!proc_get_status (pi))
3113 return 0;
3114
3115 /*
3116 * NEW_PROC_API: only works for the process procinfo,
3117 * because the LWP procinfos do not get prstatus filled in.
3118 */
3119 #ifdef NEW_PROC_API
3120 if (pi->tid != 0) /* find the parent process procinfo */
3121 pi = find_procinfo_or_die (pi->pid, 0);
3122 #endif
3123 return pi->prstatus.pr_nlwp;
3124 }
3125
3126 #else
3127 /*
3128 * Default version
3129 */
3130 int
3131 proc_get_nthreads (procinfo *pi)
3132 {
3133 return 0;
3134 }
3135 #endif
3136 #endif
3137
3138 /*
3139 * Function: proc_get_current_thread (LWP version)
3140 *
3141 * Return the ID of the thread that had an event of interest.
3142 * (ie. the one that hit a breakpoint or other traced event).
3143 * All other things being equal, this should be the ID of a
3144 * thread that is currently executing.
3145 */
3146
3147 #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */
3148 /*
3149 * Solaris and Unixware version
3150 */
3151 int
3152 proc_get_current_thread (procinfo *pi)
3153 {
3154 /*
3155 * Note: this should be applied to the root procinfo for the process,
3156 * not to the procinfo for an LWP. If applied to the procinfo for
3157 * an LWP, it will simply return that LWP's ID. In that case,
3158 * find the parent process procinfo.
3159 */
3160
3161 if (pi->tid != 0)
3162 pi = find_procinfo_or_die (pi->pid, 0);
3163
3164 if (!pi->status_valid)
3165 if (!proc_get_status (pi))
3166 return 0;
3167
3168 #ifdef NEW_PROC_API
3169 return pi->prstatus.pr_lwp.pr_lwpid;
3170 #else
3171 return pi->prstatus.pr_who;
3172 #endif
3173 }
3174
3175 #else
3176 #if defined (PIOCNTHR) && defined (PIOCTLIST)
3177 /*
3178 * OSF version
3179 */
3180 int
3181 proc_get_current_thread (procinfo *pi)
3182 {
3183 #if 0 /* FIXME: not ready for prime time? */
3184 return pi->prstatus.pr_tid;
3185 #else
3186 return 0;
3187 #endif
3188 }
3189
3190 #else
3191 /*
3192 * Default version
3193 */
3194 int
3195 proc_get_current_thread (procinfo *pi)
3196 {
3197 return 0;
3198 }
3199
3200 #endif
3201 #endif
3202
3203 /*
3204 * Function: proc_update_threads
3205 *
3206 * Discover the IDs of all the threads within the process, and
3207 * create a procinfo for each of them (chained to the parent).
3208 *
3209 * This unfortunately requires a different method on every OS.
3210 *
3211 * Return: non-zero for success, zero for failure.
3212 */
3213
3214 int
3215 proc_delete_dead_threads (procinfo *parent, procinfo *thread, void *ignore)
3216 {
3217 if (thread && parent) /* sanity */
3218 {
3219 thread->status_valid = 0;
3220 if (!proc_get_status (thread))
3221 destroy_one_procinfo (&parent->thread_list, thread);
3222 }
3223 return 0; /* keep iterating */
3224 }
3225
3226 #if defined (PIOCLSTATUS)
3227 /*
3228 * Solaris 2.5 (ioctl) version
3229 */
3230 int
3231 proc_update_threads (procinfo *pi)
3232 {
3233 gdb_prstatus_t *prstatus;
3234 struct cleanup *old_chain = NULL;
3235 procinfo *thread;
3236 int nlwp, i;
3237
3238 /*
3239 * We should never have to apply this operation to any procinfo
3240 * except the one for the main process. If that ever changes
3241 * for any reason, then take out the following clause and
3242 * replace it with one that makes sure the ctl_fd is open.
3243 */
3244
3245 if (pi->tid != 0)
3246 pi = find_procinfo_or_die (pi->pid, 0);
3247
3248 proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3249
3250 if ((nlwp = proc_get_nthreads (pi)) <= 1)
3251 return 1; /* Process is not multi-threaded; nothing to do. */
3252
3253 prstatus = xmalloc (sizeof (gdb_prstatus_t) * (nlwp + 1));
3254
3255 old_chain = make_cleanup (xfree, prstatus);
3256 if (ioctl (pi->ctl_fd, PIOCLSTATUS, prstatus) < 0)
3257 proc_error (pi, "update_threads (PIOCLSTATUS)", __LINE__);
3258
3259 /* Skip element zero, which represents the process as a whole. */
3260 for (i = 1; i < nlwp + 1; i++)
3261 {
3262 if ((thread = create_procinfo (pi->pid, prstatus[i].pr_who)) == NULL)
3263 proc_error (pi, "update_threads, create_procinfo", __LINE__);
3264
3265 memcpy (&thread->prstatus, &prstatus[i], sizeof (*prstatus));
3266 thread->status_valid = 1;
3267 }
3268 pi->threads_valid = 1;
3269 do_cleanups (old_chain);
3270 return 1;
3271 }
3272 #else
3273 #ifdef NEW_PROC_API
3274 /*
3275 * Unixware and Solaris 6 (and later) version
3276 */
3277 static void
3278 do_closedir_cleanup (void *dir)
3279 {
3280 closedir (dir);
3281 }
3282
3283 int
3284 proc_update_threads (procinfo *pi)
3285 {
3286 char pathname[MAX_PROC_NAME_SIZE + 16];
3287 struct dirent *direntry;
3288 struct cleanup *old_chain = NULL;
3289 procinfo *thread;
3290 DIR *dirp;
3291 int lwpid;
3292
3293 /*
3294 * We should never have to apply this operation to any procinfo
3295 * except the one for the main process. If that ever changes
3296 * for any reason, then take out the following clause and
3297 * replace it with one that makes sure the ctl_fd is open.
3298 */
3299
3300 if (pi->tid != 0)
3301 pi = find_procinfo_or_die (pi->pid, 0);
3302
3303 proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3304
3305 /*
3306 * Unixware
3307 *
3308 * Note: this brute-force method is the only way I know of
3309 * to accomplish this task on Unixware. This method will
3310 * also work on Solaris 2.6 and 2.7. There is a much simpler
3311 * and more elegant way to do this on Solaris, but the margins
3312 * of this manuscript are too small to write it here... ;-)
3313 */
3314
3315 strcpy (pathname, pi->pathname);
3316 strcat (pathname, "/lwp");
3317 if ((dirp = opendir (pathname)) == NULL)
3318 proc_error (pi, "update_threads, opendir", __LINE__);
3319
3320 old_chain = make_cleanup (do_closedir_cleanup, dirp);
3321 while ((direntry = readdir (dirp)) != NULL)
3322 if (direntry->d_name[0] != '.') /* skip '.' and '..' */
3323 {
3324 lwpid = atoi (&direntry->d_name[0]);
3325 if ((thread = create_procinfo (pi->pid, lwpid)) == NULL)
3326 proc_error (pi, "update_threads, create_procinfo", __LINE__);
3327 }
3328 pi->threads_valid = 1;
3329 do_cleanups (old_chain);
3330 return 1;
3331 }
3332 #else
3333 #ifdef PIOCTLIST
3334 /*
3335 * OSF version
3336 */
3337 int
3338 proc_update_threads (procinfo *pi)
3339 {
3340 int nthreads, i;
3341 tid_t *threads;
3342
3343 /*
3344 * We should never have to apply this operation to any procinfo
3345 * except the one for the main process. If that ever changes
3346 * for any reason, then take out the following clause and
3347 * replace it with one that makes sure the ctl_fd is open.
3348 */
3349
3350 if (pi->tid != 0)
3351 pi = find_procinfo_or_die (pi->pid, 0);
3352
3353 proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL);
3354
3355 nthreads = proc_get_nthreads (pi);
3356 if (nthreads < 2)
3357 return 0; /* nothing to do for 1 or fewer threads */
3358
3359 threads = xmalloc (nthreads * sizeof (tid_t));
3360
3361 if (ioctl (pi->ctl_fd, PIOCTLIST, threads) < 0)
3362 proc_error (pi, "procfs: update_threads (PIOCTLIST)", __LINE__);
3363
3364 for (i = 0; i < nthreads; i++)
3365 {
3366 if (!find_procinfo (pi->pid, threads[i]))
3367 if (!create_procinfo (pi->pid, threads[i]))
3368 proc_error (pi, "update_threads, create_procinfo", __LINE__);
3369 }
3370 pi->threads_valid = 1;
3371 return 1;
3372 }
3373 #else
3374 /*
3375 * Default version
3376 */
3377 int
3378 proc_update_threads (procinfo *pi)
3379 {
3380 return 0;
3381 }
3382 #endif /* OSF PIOCTLIST */
3383 #endif /* NEW_PROC_API */
3384 #endif /* SOL 2.5 PIOCLSTATUS */
3385
3386 /*
3387 * Function: proc_iterate_over_threads
3388 *
3389 * Description:
3390 * Given a pointer to a function, call that function once
3391 * for each lwp in the procinfo list, until the function
3392 * returns non-zero, in which event return the value
3393 * returned by the function.
3394 *
3395 * Note: this function does NOT call update_threads.
3396 * If you want to discover new threads first, you must
3397 * call that function explicitly. This function just makes
3398 * a quick pass over the currently-known procinfos.
3399 *
3400 * Arguments:
3401 * pi - parent process procinfo
3402 * func - per-thread function
3403 * ptr - opaque parameter for function.
3404 *
3405 * Return:
3406 * First non-zero return value from the callee, or zero.
3407 */
3408
3409 int
3410 proc_iterate_over_threads (procinfo *pi,
3411 int (*func) (procinfo *, procinfo *, void *),
3412 void *ptr)
3413 {
3414 procinfo *thread, *next;
3415 int retval = 0;
3416
3417 /*
3418 * We should never have to apply this operation to any procinfo
3419 * except the one for the main process. If that ever changes
3420 * for any reason, then take out the following clause and
3421 * replace it with one that makes sure the ctl_fd is open.
3422 */
3423
3424 if (pi->tid != 0)
3425 pi = find_procinfo_or_die (pi->pid, 0);
3426
3427 for (thread = pi->thread_list; thread != NULL; thread = next)
3428 {
3429 next = thread->next; /* in case thread is destroyed */
3430 if ((retval = (*func) (pi, thread, ptr)) != 0)
3431 break;
3432 }
3433
3434 return retval;
3435 }
3436
3437 /* =================== END, Thread "MODULE" =================== */
3438
3439 /* =================== END, /proc "MODULE" =================== */
3440
3441 /* =================== GDB "MODULE" =================== */
3442
3443 /*
3444 * Here are all of the gdb target vector functions and their friends.
3445 */
3446
3447 static ptid_t do_attach (ptid_t ptid);
3448 static void do_detach (int signo);
3449 static int register_gdb_signals (procinfo *, gdb_sigset_t *);
3450 static void proc_trace_syscalls_1 (procinfo *pi, int syscallnum,
3451 int entry_or_exit, int mode, int from_tty);
3452 static int insert_dbx_link_breakpoint (procinfo *pi);
3453 static void remove_dbx_link_breakpoint (void);
3454
3455 /* On mips-irix, we need to insert a breakpoint at __dbx_link during
3456 the startup phase. The following two variables are used to record
3457 the address of the breakpoint, and the code that was replaced by
3458 a breakpoint. */
3459 static int dbx_link_bpt_addr = 0;
3460 static void *dbx_link_bpt;
3461
3462 /*
3463 * Function: procfs_debug_inferior
3464 *
3465 * Sets up the inferior to be debugged.
3466 * Registers to trace signals, hardware faults, and syscalls.
3467 * Note: does not set RLC flag: caller may want to customize that.
3468 *
3469 * Returns: zero for success (note! unlike most functions in this module)
3470 * On failure, returns the LINE NUMBER where it failed!
3471 */
3472
3473 static int
3474 procfs_debug_inferior (procinfo *pi)
3475 {
3476 fltset_t traced_faults;
3477 gdb_sigset_t traced_signals;
3478 sysset_t *traced_syscall_entries;
3479 sysset_t *traced_syscall_exits;
3480 int status;
3481
3482 #ifdef PROCFS_DONT_TRACE_FAULTS
3483 /* On some systems (OSF), we don't trace hardware faults.
3484 Apparently it's enough that we catch them as signals.
3485 Wonder why we don't just do that in general? */
3486 premptyset (&traced_faults); /* don't trace faults. */
3487 #else
3488 /* Register to trace hardware faults in the child. */
3489 prfillset (&traced_faults); /* trace all faults... */
3490 prdelset (&traced_faults, FLTPAGE); /* except page fault. */
3491 #endif
3492 if (!proc_set_traced_faults (pi, &traced_faults))
3493 return __LINE__;
3494
3495 /* Register to trace selected signals in the child. */
3496 premptyset (&traced_signals);
3497 if (!register_gdb_signals (pi, &traced_signals))
3498 return __LINE__;
3499
3500
3501 /* Register to trace the 'exit' system call (on entry). */
3502 traced_syscall_entries = sysset_t_alloc (pi);
3503 gdb_premptysysset (traced_syscall_entries);
3504 #ifdef SYS_exit
3505 gdb_praddsysset (traced_syscall_entries, SYS_exit);
3506 #endif
3507 #ifdef SYS_lwpexit
3508 gdb_praddsysset (traced_syscall_entries, SYS_lwpexit); /* And _lwp_exit... */
3509 #endif
3510 #ifdef SYS_lwp_exit
3511 gdb_praddsysset (traced_syscall_entries, SYS_lwp_exit);
3512 #endif
3513 #ifdef DYNAMIC_SYSCALLS
3514 {
3515 int callnum = find_syscall (pi, "_exit");
3516 if (callnum >= 0)
3517 gdb_praddsysset (traced_syscall_entries, callnum);
3518 }
3519 #endif
3520
3521 status = proc_set_traced_sysentry (pi, traced_syscall_entries);
3522 xfree (traced_syscall_entries);
3523 if (!status)
3524 return __LINE__;
3525
3526 #ifdef PRFS_STOPEXEC /* defined on OSF */
3527 /* OSF method for tracing exec syscalls. Quoting:
3528 Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
3529 exits from exec system calls because of the user level loader. */
3530 /* FIXME: make nice and maybe move into an access function. */
3531 {
3532 int prfs_flags;
3533
3534 if (ioctl (pi->ctl_fd, PIOCGSPCACT, &prfs_flags) < 0)
3535 return __LINE__;
3536
3537 prfs_flags |= PRFS_STOPEXEC;
3538
3539 if (ioctl (pi->ctl_fd, PIOCSSPCACT, &prfs_flags) < 0)
3540 return __LINE__;
3541 }
3542 #else /* not PRFS_STOPEXEC */
3543 /* Everyone else's (except OSF) method for tracing exec syscalls */
3544 /* GW: Rationale...
3545 Not all systems with /proc have all the exec* syscalls with the same
3546 names. On the SGI, for example, there is no SYS_exec, but there
3547 *is* a SYS_execv. So, we try to account for that. */
3548
3549 traced_syscall_exits = sysset_t_alloc (pi);
3550 gdb_premptysysset (traced_syscall_exits);
3551 #ifdef SYS_exec
3552 gdb_praddsysset (traced_syscall_exits, SYS_exec);
3553 #endif
3554 #ifdef SYS_execve
3555 gdb_praddsysset (traced_syscall_exits, SYS_execve);
3556 #endif
3557 #ifdef SYS_execv
3558 gdb_praddsysset (traced_syscall_exits, SYS_execv);
3559 #endif
3560
3561 #ifdef SYS_lwpcreate
3562 gdb_praddsysset (traced_syscall_exits, SYS_lwpcreate);
3563 gdb_praddsysset (traced_syscall_exits, SYS_lwpexit);
3564 #endif
3565
3566 #ifdef SYS_lwp_create /* FIXME: once only, please */
3567 gdb_praddsysset (traced_syscall_exits, SYS_lwp_create);
3568 gdb_praddsysset (traced_syscall_exits, SYS_lwp_exit);
3569 #endif
3570
3571 #ifdef DYNAMIC_SYSCALLS
3572 {
3573 int callnum = find_syscall (pi, "execve");
3574 if (callnum >= 0)
3575 gdb_praddsysset (traced_syscall_exits, callnum);
3576 callnum = find_syscall (pi, "ra_execve");
3577 if (callnum >= 0)
3578 gdb_praddsysset (traced_syscall_exits, callnum);
3579 }
3580 #endif
3581
3582 status = proc_set_traced_sysexit (pi, traced_syscall_exits);
3583 xfree (traced_syscall_exits);
3584 if (!status)
3585 return __LINE__;
3586
3587 #endif /* PRFS_STOPEXEC */
3588 return 0;
3589 }
3590
3591 static void
3592 procfs_attach (struct target_ops *ops, char *args, int from_tty)
3593 {
3594 char *exec_file;
3595 int pid;
3596
3597 if (!args)
3598 error_no_arg (_("process-id to attach"));
3599
3600 pid = atoi (args);
3601 if (pid == getpid ())
3602 error (_("Attaching GDB to itself is not a good idea..."));
3603
3604 if (from_tty)
3605 {
3606 exec_file = get_exec_file (0);
3607
3608 if (exec_file)
3609 printf_filtered (_("Attaching to program `%s', %s\n"),
3610 exec_file, target_pid_to_str (pid_to_ptid (pid)));
3611 else
3612 printf_filtered (_("Attaching to %s\n"),
3613 target_pid_to_str (pid_to_ptid (pid)));
3614
3615 fflush (stdout);
3616 }
3617 inferior_ptid = do_attach (pid_to_ptid (pid));
3618 push_target (ops);
3619 }
3620
3621 static void
3622 procfs_detach (struct target_ops *ops, char *args, int from_tty)
3623 {
3624 int sig = 0;
3625 int pid = PIDGET (inferior_ptid);
3626
3627 if (args)
3628 sig = atoi (args);
3629
3630 if (from_tty)
3631 {
3632 char *exec_file;
3633
3634 exec_file = get_exec_file (0);
3635 if (exec_file == NULL)
3636 exec_file = "";
3637
3638 printf_filtered (_("Detaching from program: %s, %s\n"), exec_file,
3639 target_pid_to_str (pid_to_ptid (pid)));
3640 gdb_flush (gdb_stdout);
3641 }
3642
3643 do_detach (sig);
3644
3645 inferior_ptid = null_ptid;
3646 detach_inferior (pid);
3647 unpush_target (ops);
3648 }
3649
3650 static ptid_t
3651 do_attach (ptid_t ptid)
3652 {
3653 procinfo *pi;
3654 struct inferior *inf;
3655 int fail;
3656 int lwpid;
3657
3658 if ((pi = create_procinfo (PIDGET (ptid), 0)) == NULL)
3659 perror (_("procfs: out of memory in 'attach'"));
3660
3661 if (!open_procinfo_files (pi, FD_CTL))
3662 {
3663 fprintf_filtered (gdb_stderr, "procfs:%d -- ", __LINE__);
3664 sprintf (errmsg, "do_attach: couldn't open /proc file for process %d",
3665 PIDGET (ptid));
3666 dead_procinfo (pi, errmsg, NOKILL);
3667 }
3668
3669 /* Stop the process (if it isn't already stopped). */
3670 if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
3671 {
3672 pi->was_stopped = 1;
3673 proc_prettyprint_why (proc_why (pi), proc_what (pi), 1);
3674 }
3675 else
3676 {
3677 pi->was_stopped = 0;
3678 /* Set the process to run again when we close it. */
3679 if (!proc_set_run_on_last_close (pi))
3680 dead_procinfo (pi, "do_attach: couldn't set RLC.", NOKILL);
3681
3682 /* Now stop the process. */
3683 if (!proc_stop_process (pi))
3684 dead_procinfo (pi, "do_attach: couldn't stop the process.", NOKILL);
3685 pi->ignore_next_sigstop = 1;
3686 }
3687 /* Save some of the /proc state to be restored if we detach. */
3688 if (!proc_get_traced_faults (pi, &pi->saved_fltset))
3689 dead_procinfo (pi, "do_attach: couldn't save traced faults.", NOKILL);
3690 if (!proc_get_traced_signals (pi, &pi->saved_sigset))
3691 dead_procinfo (pi, "do_attach: couldn't save traced signals.", NOKILL);
3692 if (!proc_get_traced_sysentry (pi, pi->saved_entryset))
3693 dead_procinfo (pi, "do_attach: couldn't save traced syscall entries.",
3694 NOKILL);
3695 if (!proc_get_traced_sysexit (pi, pi->saved_exitset))
3696 dead_procinfo (pi, "do_attach: couldn't save traced syscall exits.",
3697 NOKILL);
3698 if (!proc_get_held_signals (pi, &pi->saved_sighold))
3699 dead_procinfo (pi, "do_attach: couldn't save held signals.", NOKILL);
3700
3701 if ((fail = procfs_debug_inferior (pi)) != 0)
3702 dead_procinfo (pi, "do_attach: failed in procfs_debug_inferior", NOKILL);
3703
3704 inf = add_inferior (pi->pid);
3705 /* Let GDB know that the inferior was attached. */
3706 inf->attach_flag = 1;
3707
3708 /* Create a procinfo for the current lwp. */
3709 lwpid = proc_get_current_thread (pi);
3710 create_procinfo (pi->pid, lwpid);
3711
3712 /* Add it to gdb's thread list. */
3713 ptid = MERGEPID (pi->pid, lwpid);
3714 add_thread (ptid);
3715
3716 return ptid;
3717 }
3718
3719 static void
3720 do_detach (int signo)
3721 {
3722 procinfo *pi;
3723
3724 /* Find procinfo for the main process */
3725 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); /* FIXME: threads */
3726 if (signo)
3727 if (!proc_set_current_signal (pi, signo))
3728 proc_warn (pi, "do_detach, set_current_signal", __LINE__);
3729
3730 if (!proc_set_traced_signals (pi, &pi->saved_sigset))
3731 proc_warn (pi, "do_detach, set_traced_signal", __LINE__);
3732
3733 if (!proc_set_traced_faults (pi, &pi->saved_fltset))
3734 proc_warn (pi, "do_detach, set_traced_faults", __LINE__);
3735
3736 if (!proc_set_traced_sysentry (pi, pi->saved_entryset))
3737 proc_warn (pi, "do_detach, set_traced_sysentry", __LINE__);
3738
3739 if (!proc_set_traced_sysexit (pi, pi->saved_exitset))
3740 proc_warn (pi, "do_detach, set_traced_sysexit", __LINE__);
3741
3742 if (!proc_set_held_signals (pi, &pi->saved_sighold))
3743 proc_warn (pi, "do_detach, set_held_signals", __LINE__);
3744
3745 if (signo || (proc_flags (pi) & (PR_STOPPED | PR_ISTOP)))
3746 if (signo || !(pi->was_stopped) ||
3747 query (_("Was stopped when attached, make it runnable again? ")))
3748 {
3749 /* Clear any pending signal. */
3750 if (!proc_clear_current_fault (pi))
3751 proc_warn (pi, "do_detach, clear_current_fault", __LINE__);
3752
3753 if (signo == 0 && !proc_clear_current_signal (pi))
3754 proc_warn (pi, "do_detach, clear_current_signal", __LINE__);
3755
3756 if (!proc_set_run_on_last_close (pi))
3757 proc_warn (pi, "do_detach, set_rlc", __LINE__);
3758 }
3759
3760 destroy_procinfo (pi);
3761 }
3762
3763 /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
3764 for all registers.
3765
3766 ??? Is the following note still relevant? We can't get individual
3767 registers with the PT_GETREGS ptrace(2) request either, yet we
3768 don't bother with caching at all in that case.
3769
3770 NOTE: Since the /proc interface cannot give us individual
3771 registers, we pay no attention to REGNUM, and just fetch them all.
3772 This results in the possibility that we will do unnecessarily many
3773 fetches, since we may be called repeatedly for individual
3774 registers. So we cache the results, and mark the cache invalid
3775 when the process is resumed. */
3776
3777 static void
3778 procfs_fetch_registers (struct target_ops *ops,
3779 struct regcache *regcache, int regnum)
3780 {
3781 gdb_gregset_t *gregs;
3782 procinfo *pi;
3783 int pid = PIDGET (inferior_ptid);
3784 int tid = TIDGET (inferior_ptid);
3785 struct gdbarch *gdbarch = get_regcache_arch (regcache);
3786
3787 pi = find_procinfo_or_die (pid, tid);
3788
3789 if (pi == NULL)
3790 error (_("procfs: fetch_registers failed to find procinfo for %s"),
3791 target_pid_to_str (inferior_ptid));
3792
3793 gregs = proc_get_gregs (pi);
3794 if (gregs == NULL)
3795 proc_error (pi, "fetch_registers, get_gregs", __LINE__);
3796
3797 supply_gregset (regcache, (const gdb_gregset_t *) gregs);
3798
3799 if (gdbarch_fp0_regnum (gdbarch) >= 0) /* Do we have an FPU? */
3800 {
3801 gdb_fpregset_t *fpregs;
3802
3803 if ((regnum >= 0 && regnum < gdbarch_fp0_regnum (gdbarch))
3804 || regnum == gdbarch_pc_regnum (gdbarch)
3805 || regnum == gdbarch_sp_regnum (gdbarch))
3806 return; /* Not a floating point register. */
3807
3808 fpregs = proc_get_fpregs (pi);
3809 if (fpregs == NULL)
3810 proc_error (pi, "fetch_registers, get_fpregs", __LINE__);
3811
3812 supply_fpregset (regcache, (const gdb_fpregset_t *) fpregs);
3813 }
3814 }
3815
3816 /* Store register REGNUM back into the inferior. If REGNUM is -1, do
3817 this for all registers.
3818
3819 NOTE: Since the /proc interface will not read individual registers,
3820 we will cache these requests until the process is resumed, and only
3821 then write them back to the inferior process.
3822
3823 FIXME: is that a really bad idea? Have to think about cases where
3824 writing one register might affect the value of others, etc. */
3825
3826 static void
3827 procfs_store_registers (struct target_ops *ops,
3828 struct regcache *regcache, int regnum)
3829 {
3830 gdb_gregset_t *gregs;
3831 procinfo *pi;
3832 int pid = PIDGET (inferior_ptid);
3833 int tid = TIDGET (inferior_ptid);
3834 struct gdbarch *gdbarch = get_regcache_arch (regcache);
3835
3836 pi = find_procinfo_or_die (pid, tid);
3837
3838 if (pi == NULL)
3839 error (_("procfs: store_registers: failed to find procinfo for %s"),
3840 target_pid_to_str (inferior_ptid));
3841
3842 gregs = proc_get_gregs (pi);
3843 if (gregs == NULL)
3844 proc_error (pi, "store_registers, get_gregs", __LINE__);
3845
3846 fill_gregset (regcache, gregs, regnum);
3847 if (!proc_set_gregs (pi))
3848 proc_error (pi, "store_registers, set_gregs", __LINE__);
3849
3850 if (gdbarch_fp0_regnum (gdbarch) >= 0) /* Do we have an FPU? */
3851 {
3852 gdb_fpregset_t *fpregs;
3853
3854 if ((regnum >= 0 && regnum < gdbarch_fp0_regnum (gdbarch))
3855 || regnum == gdbarch_pc_regnum (gdbarch)
3856 || regnum == gdbarch_sp_regnum (gdbarch))
3857 return; /* Not a floating point register. */
3858
3859 fpregs = proc_get_fpregs (pi);
3860 if (fpregs == NULL)
3861 proc_error (pi, "store_registers, get_fpregs", __LINE__);
3862
3863 fill_fpregset (regcache, fpregs, regnum);
3864 if (!proc_set_fpregs (pi))
3865 proc_error (pi, "store_registers, set_fpregs", __LINE__);
3866 }
3867 }
3868
3869 static int
3870 syscall_is_lwp_exit (procinfo *pi, int scall)
3871 {
3872
3873 #ifdef SYS_lwp_exit
3874 if (scall == SYS_lwp_exit)
3875 return 1;
3876 #endif
3877 #ifdef SYS_lwpexit
3878 if (scall == SYS_lwpexit)
3879 return 1;
3880 #endif
3881 return 0;
3882 }
3883
3884 static int
3885 syscall_is_exit (procinfo *pi, int scall)
3886 {
3887 #ifdef SYS_exit
3888 if (scall == SYS_exit)
3889 return 1;
3890 #endif
3891 #ifdef DYNAMIC_SYSCALLS
3892 if (find_syscall (pi, "_exit") == scall)
3893 return 1;
3894 #endif
3895 return 0;
3896 }
3897
3898 static int
3899 syscall_is_exec (procinfo *pi, int scall)
3900 {
3901 #ifdef SYS_exec
3902 if (scall == SYS_exec)
3903 return 1;
3904 #endif
3905 #ifdef SYS_execv
3906 if (scall == SYS_execv)
3907 return 1;
3908 #endif
3909 #ifdef SYS_execve
3910 if (scall == SYS_execve)
3911 return 1;
3912 #endif
3913 #ifdef DYNAMIC_SYSCALLS
3914 if (find_syscall (pi, "_execve"))
3915 return 1;
3916 if (find_syscall (pi, "ra_execve"))
3917 return 1;
3918 #endif
3919 return 0;
3920 }
3921
3922 static int
3923 syscall_is_lwp_create (procinfo *pi, int scall)
3924 {
3925 #ifdef SYS_lwp_create
3926 if (scall == SYS_lwp_create)
3927 return 1;
3928 #endif
3929 #ifdef SYS_lwpcreate
3930 if (scall == SYS_lwpcreate)
3931 return 1;
3932 #endif
3933 return 0;
3934 }
3935
3936 /*
3937 * Function: target_wait
3938 *
3939 * Retrieve the next stop event from the child process.
3940 * If child has not stopped yet, wait for it to stop.
3941 * Translate /proc eventcodes (or possibly wait eventcodes)
3942 * into gdb internal event codes.
3943 *
3944 * Return: id of process (and possibly thread) that incurred the event.
3945 * event codes are returned thru a pointer parameter.
3946 */
3947
3948 static ptid_t
3949 procfs_wait (struct target_ops *ops,
3950 ptid_t ptid, struct target_waitstatus *status)
3951 {
3952 /* First cut: loosely based on original version 2.1 */
3953 procinfo *pi;
3954 int wstat;
3955 int temp_tid;
3956 ptid_t retval, temp_ptid;
3957 int why, what, flags;
3958 int retry = 0;
3959
3960 wait_again:
3961
3962 retry++;
3963 wstat = 0;
3964 retval = pid_to_ptid (-1);
3965
3966 /* Find procinfo for main process */
3967 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
3968 if (pi)
3969 {
3970 /* We must assume that the status is stale now... */
3971 pi->status_valid = 0;
3972 pi->gregs_valid = 0;
3973 pi->fpregs_valid = 0;
3974
3975 #if 0 /* just try this out... */
3976 flags = proc_flags (pi);
3977 why = proc_why (pi);
3978 if ((flags & PR_STOPPED) && (why == PR_REQUESTED))
3979 pi->status_valid = 0; /* re-read again, IMMEDIATELY... */
3980 #endif
3981 /* If child is not stopped, wait for it to stop. */
3982 if (!(proc_flags (pi) & (PR_STOPPED | PR_ISTOP)) &&
3983 !proc_wait_for_stop (pi))
3984 {
3985 /* wait_for_stop failed: has the child terminated? */
3986 if (errno == ENOENT)
3987 {
3988 int wait_retval;
3989
3990 /* /proc file not found; presumably child has terminated. */
3991 wait_retval = wait (&wstat); /* "wait" for the child's exit */
3992
3993 if (wait_retval != PIDGET (inferior_ptid)) /* wrong child? */
3994 error (_("procfs: couldn't stop process %d: wait returned %d."),
3995 PIDGET (inferior_ptid), wait_retval);
3996 /* FIXME: might I not just use waitpid?
3997 Or try find_procinfo to see if I know about this child? */
3998 retval = pid_to_ptid (wait_retval);
3999 }
4000 else if (errno == EINTR)
4001 goto wait_again;
4002 else
4003 {
4004 /* Unknown error from wait_for_stop. */
4005 proc_error (pi, "target_wait (wait_for_stop)", __LINE__);
4006 }
4007 }
4008 else
4009 {
4010 /* This long block is reached if either:
4011 a) the child was already stopped, or
4012 b) we successfully waited for the child with wait_for_stop.
4013 This block will analyze the /proc status, and translate it
4014 into a waitstatus for GDB.
4015
4016 If we actually had to call wait because the /proc file
4017 is gone (child terminated), then we skip this block,
4018 because we already have a waitstatus. */
4019
4020 flags = proc_flags (pi);
4021 why = proc_why (pi);
4022 what = proc_what (pi);
4023
4024 if (flags & (PR_STOPPED | PR_ISTOP))
4025 {
4026 #ifdef PR_ASYNC
4027 /* If it's running async (for single_thread control),
4028 set it back to normal again. */
4029 if (flags & PR_ASYNC)
4030 if (!proc_unset_async (pi))
4031 proc_error (pi, "target_wait, unset_async", __LINE__);
4032 #endif
4033
4034 if (info_verbose)
4035 proc_prettyprint_why (why, what, 1);
4036
4037 /* The 'pid' we will return to GDB is composed of
4038 the process ID plus the lwp ID. */
4039 retval = MERGEPID (pi->pid, proc_get_current_thread (pi));
4040
4041 switch (why) {
4042 case PR_SIGNALLED:
4043 wstat = (what << 8) | 0177;
4044 break;
4045 case PR_SYSENTRY:
4046 if (syscall_is_lwp_exit (pi, what))
4047 {
4048 if (print_thread_events)
4049 printf_unfiltered (_("[%s exited]\n"),
4050 target_pid_to_str (retval));
4051 delete_thread (retval);
4052 status->kind = TARGET_WAITKIND_SPURIOUS;
4053 return retval;
4054 }
4055 else if (syscall_is_exit (pi, what))
4056 {
4057 struct inferior *inf;
4058
4059 /* Handle SYS_exit call only */
4060 /* Stopped at entry to SYS_exit.
4061 Make it runnable, resume it, then use
4062 the wait system call to get its exit code.
4063 Proc_run_process always clears the current
4064 fault and signal.
4065 Then return its exit status. */
4066 pi->status_valid = 0;
4067 wstat = 0;
4068 /* FIXME: what we should do is return
4069 TARGET_WAITKIND_SPURIOUS. */
4070 if (!proc_run_process (pi, 0, 0))
4071 proc_error (pi, "target_wait, run_process", __LINE__);
4072
4073 inf = find_inferior_pid (pi->pid);
4074 if (inf->attach_flag)
4075 {
4076 /* Don't call wait: simulate waiting for exit,
4077 return a "success" exit code. Bogus: what if
4078 it returns something else? */
4079 wstat = 0;
4080 retval = inferior_ptid; /* ? ? ? */
4081 }
4082 else
4083 {
4084 int temp = wait (&wstat);
4085
4086 /* FIXME: shouldn't I make sure I get the right
4087 event from the right process? If (for
4088 instance) I have killed an earlier inferior
4089 process but failed to clean up after it
4090 somehow, I could get its termination event
4091 here. */
4092
4093 /* If wait returns -1, that's what we return to GDB. */
4094 if (temp < 0)
4095 retval = pid_to_ptid (temp);
4096 }
4097 }
4098 else
4099 {
4100 printf_filtered (_("procfs: trapped on entry to "));
4101 proc_prettyprint_syscall (proc_what (pi), 0);
4102 printf_filtered ("\n");
4103 #ifndef PIOCSSPCACT
4104 {
4105 long i, nsysargs, *sysargs;
4106
4107 if ((nsysargs = proc_nsysarg (pi)) > 0 &&
4108 (sysargs = proc_sysargs (pi)) != NULL)
4109 {
4110 printf_filtered (_("%ld syscall arguments:\n"), nsysargs);
4111 for (i = 0; i < nsysargs; i++)
4112 printf_filtered ("#%ld: 0x%08lx\n",
4113 i, sysargs[i]);
4114 }
4115
4116 }
4117 #endif
4118 if (status)
4119 {
4120 /* How to exit gracefully, returning "unknown event" */
4121 status->kind = TARGET_WAITKIND_SPURIOUS;
4122 return inferior_ptid;
4123 }
4124 else
4125 {
4126 /* How to keep going without returning to wfi: */
4127 target_resume (ptid, 0, TARGET_SIGNAL_0);
4128 goto wait_again;
4129 }
4130 }
4131 break;
4132 case PR_SYSEXIT:
4133 if (syscall_is_exec (pi, what))
4134 {
4135 /* Hopefully this is our own "fork-child" execing
4136 the real child. Hoax this event into a trap, and
4137 GDB will see the child about to execute its start
4138 address. */
4139 wstat = (SIGTRAP << 8) | 0177;
4140 }
4141 #ifdef SYS_syssgi
4142 else if (what == SYS_syssgi)
4143 {
4144 /* see if we can break on dbx_link(). If yes, then
4145 we no longer need the SYS_syssgi notifications. */
4146 if (insert_dbx_link_breakpoint (pi))
4147 proc_trace_syscalls_1 (pi, SYS_syssgi, PR_SYSEXIT,
4148 FLAG_RESET, 0);
4149
4150 /* This is an internal event and should be transparent
4151 to wfi, so resume the execution and wait again. See
4152 comment in procfs_init_inferior() for more details. */
4153 target_resume (ptid, 0, TARGET_SIGNAL_0);
4154 goto wait_again;
4155 }
4156 #endif
4157 else if (syscall_is_lwp_create (pi, what))
4158 {
4159 /*
4160 * This syscall is somewhat like fork/exec.
4161 * We will get the event twice: once for the parent LWP,
4162 * and once for the child. We should already know about
4163 * the parent LWP, but the child will be new to us. So,
4164 * whenever we get this event, if it represents a new
4165 * thread, simply add the thread to the list.
4166 */
4167
4168 /* If not in procinfo list, add it. */
4169 temp_tid = proc_get_current_thread (pi);
4170 if (!find_procinfo (pi->pid, temp_tid))
4171 create_procinfo (pi->pid, temp_tid);
4172
4173 temp_ptid = MERGEPID (pi->pid, temp_tid);
4174 /* If not in GDB's thread list, add it. */
4175 if (!in_thread_list (temp_ptid))
4176 add_thread (temp_ptid);
4177
4178 /* Return to WFI, but tell it to immediately resume. */
4179 status->kind = TARGET_WAITKIND_SPURIOUS;
4180 return inferior_ptid;
4181 }
4182 else if (syscall_is_lwp_exit (pi, what))
4183 {
4184 if (print_thread_events)
4185 printf_unfiltered (_("[%s exited]\n"),
4186 target_pid_to_str (retval));
4187 delete_thread (retval);
4188 status->kind = TARGET_WAITKIND_SPURIOUS;
4189 return retval;
4190 }
4191 else if (0)
4192 {
4193 /* FIXME: Do we need to handle SYS_sproc,
4194 SYS_fork, or SYS_vfork here? The old procfs
4195 seemed to use this event to handle threads on
4196 older (non-LWP) systems, where I'm assuming
4197 that threads were actually separate processes.
4198 Irix, maybe? Anyway, low priority for now. */
4199 }
4200 else
4201 {
4202 printf_filtered (_("procfs: trapped on exit from "));
4203 proc_prettyprint_syscall (proc_what (pi), 0);
4204 printf_filtered ("\n");
4205 #ifndef PIOCSSPCACT
4206 {
4207 long i, nsysargs, *sysargs;
4208
4209 if ((nsysargs = proc_nsysarg (pi)) > 0 &&
4210 (sysargs = proc_sysargs (pi)) != NULL)
4211 {
4212 printf_filtered (_("%ld syscall arguments:\n"), nsysargs);
4213 for (i = 0; i < nsysargs; i++)
4214 printf_filtered ("#%ld: 0x%08lx\n",
4215 i, sysargs[i]);
4216 }
4217 }
4218 #endif
4219 status->kind = TARGET_WAITKIND_SPURIOUS;
4220 return inferior_ptid;
4221 }
4222 break;
4223 case PR_REQUESTED:
4224 #if 0 /* FIXME */
4225 wstat = (SIGSTOP << 8) | 0177;
4226 break;
4227 #else
4228 if (retry < 5)
4229 {
4230 printf_filtered (_("Retry #%d:\n"), retry);
4231 pi->status_valid = 0;
4232 goto wait_again;
4233 }
4234 else
4235 {
4236 /* If not in procinfo list, add it. */
4237 temp_tid = proc_get_current_thread (pi);
4238 if (!find_procinfo (pi->pid, temp_tid))
4239 create_procinfo (pi->pid, temp_tid);
4240
4241 /* If not in GDB's thread list, add it. */
4242 temp_ptid = MERGEPID (pi->pid, temp_tid);
4243 if (!in_thread_list (temp_ptid))
4244 add_thread (temp_ptid);
4245
4246 status->kind = TARGET_WAITKIND_STOPPED;
4247 status->value.sig = 0;
4248 return retval;
4249 }
4250 #endif
4251 case PR_JOBCONTROL:
4252 wstat = (what << 8) | 0177;
4253 break;
4254 case PR_FAULTED:
4255 switch (what) {
4256 #ifdef FLTWATCH
4257 case FLTWATCH:
4258 wstat = (SIGTRAP << 8) | 0177;
4259 break;
4260 #endif
4261 #ifdef FLTKWATCH
4262 case FLTKWATCH:
4263 wstat = (SIGTRAP << 8) | 0177;
4264 break;
4265 #endif
4266 /* FIXME: use si_signo where possible. */
4267 case FLTPRIV:
4268 #if (FLTILL != FLTPRIV) /* avoid "duplicate case" error */
4269 case FLTILL:
4270 #endif
4271 wstat = (SIGILL << 8) | 0177;
4272 break;
4273 case FLTBPT:
4274 #if (FLTTRACE != FLTBPT) /* avoid "duplicate case" error */
4275 case FLTTRACE:
4276 #endif
4277 /* If we hit our __dbx_link() internal breakpoint,
4278 then remove it. See comments in procfs_init_inferior()
4279 for more details. */
4280 if (dbx_link_bpt_addr != 0
4281 && dbx_link_bpt_addr == read_pc ())
4282 remove_dbx_link_breakpoint ();
4283
4284 wstat = (SIGTRAP << 8) | 0177;
4285 break;
4286 case FLTSTACK:
4287 case FLTACCESS:
4288 #if (FLTBOUNDS != FLTSTACK) /* avoid "duplicate case" error */
4289 case FLTBOUNDS:
4290 #endif
4291 wstat = (SIGSEGV << 8) | 0177;
4292 break;
4293 case FLTIOVF:
4294 case FLTIZDIV:
4295 #if (FLTFPE != FLTIOVF) /* avoid "duplicate case" error */
4296 case FLTFPE:
4297 #endif
4298 wstat = (SIGFPE << 8) | 0177;
4299 break;
4300 case FLTPAGE: /* Recoverable page fault */
4301 default: /* FIXME: use si_signo if possible for fault */
4302 retval = pid_to_ptid (-1);
4303 printf_filtered ("procfs:%d -- ", __LINE__);
4304 printf_filtered (_("child stopped for unknown reason:\n"));
4305 proc_prettyprint_why (why, what, 1);
4306 error (_("... giving up..."));
4307 break;
4308 }
4309 break; /* case PR_FAULTED: */
4310 default: /* switch (why) unmatched */
4311 printf_filtered ("procfs:%d -- ", __LINE__);
4312 printf_filtered (_("child stopped for unknown reason:\n"));
4313 proc_prettyprint_why (why, what, 1);
4314 error (_("... giving up..."));
4315 break;
4316 }
4317 /*
4318 * Got this far without error:
4319 * If retval isn't in the threads database, add it.
4320 */
4321 if (PIDGET (retval) > 0 &&
4322 !ptid_equal (retval, inferior_ptid) &&
4323 !in_thread_list (retval))
4324 {
4325 /*
4326 * We have a new thread.
4327 * We need to add it both to GDB's list and to our own.
4328 * If we don't create a procinfo, resume may be unhappy
4329 * later.
4330 */
4331 add_thread (retval);
4332 if (find_procinfo (PIDGET (retval), TIDGET (retval)) == NULL)
4333 create_procinfo (PIDGET (retval), TIDGET (retval));
4334 }
4335 }
4336 else /* flags do not indicate STOPPED */
4337 {
4338 /* surely this can't happen... */
4339 printf_filtered ("procfs:%d -- process not stopped.\n",
4340 __LINE__);
4341 proc_prettyprint_flags (flags, 1);
4342 error (_("procfs: ...giving up..."));
4343 }
4344 }
4345
4346 if (status)
4347 store_waitstatus (status, wstat);
4348 }
4349
4350 return retval;
4351 }
4352
4353 /* Perform a partial transfer to/from the specified object. For
4354 memory transfers, fall back to the old memory xfer functions. */
4355
4356 static LONGEST
4357 procfs_xfer_partial (struct target_ops *ops, enum target_object object,
4358 const char *annex, gdb_byte *readbuf,
4359 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4360 {
4361 switch (object)
4362 {
4363 case TARGET_OBJECT_MEMORY:
4364 if (readbuf)
4365 return (*ops->deprecated_xfer_memory) (offset, readbuf,
4366 len, 0/*read*/, NULL, ops);
4367 if (writebuf)
4368 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
4369 len, 1/*write*/, NULL, ops);
4370 return -1;
4371
4372 #ifdef NEW_PROC_API
4373 case TARGET_OBJECT_AUXV:
4374 return procfs_xfer_auxv (ops, object, annex, readbuf, writebuf,
4375 offset, len);
4376 #endif
4377
4378 default:
4379 if (ops->beneath != NULL)
4380 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
4381 readbuf, writebuf, offset, len);
4382 return -1;
4383 }
4384 }
4385
4386
4387 /* Transfer LEN bytes between GDB address MYADDR and target address
4388 MEMADDR. If DOWRITE is non-zero, transfer them to the target,
4389 otherwise transfer them from the target. TARGET is unused.
4390
4391 The return value is 0 if an error occurred or no bytes were
4392 transferred. Otherwise, it will be a positive value which
4393 indicates the number of bytes transferred between gdb and the
4394 target. (Note that the interface also makes provisions for
4395 negative values, but this capability isn't implemented here.) */
4396
4397 static int
4398 procfs_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int dowrite,
4399 struct mem_attrib *attrib, struct target_ops *target)
4400 {
4401 procinfo *pi;
4402 int nbytes = 0;
4403
4404 /* Find procinfo for main process */
4405 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
4406 if (pi->as_fd == 0 &&
4407 open_procinfo_files (pi, FD_AS) == 0)
4408 {
4409 proc_warn (pi, "xfer_memory, open_proc_files", __LINE__);
4410 return 0;
4411 }
4412
4413 if (lseek (pi->as_fd, (off_t) memaddr, SEEK_SET) == (off_t) memaddr)
4414 {
4415 if (dowrite)
4416 {
4417 #ifdef NEW_PROC_API
4418 PROCFS_NOTE ("write memory: ");
4419 #else
4420 PROCFS_NOTE ("write memory: \n");
4421 #endif
4422 nbytes = write (pi->as_fd, myaddr, len);
4423 }
4424 else
4425 {
4426 PROCFS_NOTE ("read memory: \n");
4427 nbytes = read (pi->as_fd, myaddr, len);
4428 }
4429 if (nbytes < 0)
4430 {
4431 nbytes = 0;
4432 }
4433 }
4434 return nbytes;
4435 }
4436
4437 /*
4438 * Function: invalidate_cache
4439 *
4440 * Called by target_resume before making child runnable.
4441 * Mark cached registers and status's invalid.
4442 * If there are "dirty" caches that need to be written back
4443 * to the child process, do that.
4444 *
4445 * File descriptors are also cached.
4446 * As they are a limited resource, we cannot hold onto them indefinitely.
4447 * However, as they are expensive to open, we don't want to throw them
4448 * away indescriminately either. As a compromise, we will keep the
4449 * file descriptors for the parent process, but discard any file
4450 * descriptors we may have accumulated for the threads.
4451 *
4452 * Return value:
4453 * As this function is called by iterate_over_threads, it always
4454 * returns zero (so that iterate_over_threads will keep iterating).
4455 */
4456
4457
4458 static int
4459 invalidate_cache (procinfo *parent, procinfo *pi, void *ptr)
4460 {
4461 /*
4462 * About to run the child; invalidate caches and do any other cleanup.
4463 */
4464
4465 #if 0
4466 if (pi->gregs_dirty)
4467 if (parent == NULL ||
4468 proc_get_current_thread (parent) != pi->tid)
4469 if (!proc_set_gregs (pi)) /* flush gregs cache */
4470 proc_warn (pi, "target_resume, set_gregs",
4471 __LINE__);
4472 if (gdbarch_fp0_regnum (current_gdbarch) >= 0)
4473 if (pi->fpregs_dirty)
4474 if (parent == NULL ||
4475 proc_get_current_thread (parent) != pi->tid)
4476 if (!proc_set_fpregs (pi)) /* flush fpregs cache */
4477 proc_warn (pi, "target_resume, set_fpregs",
4478 __LINE__);
4479 #endif
4480
4481 if (parent != NULL)
4482 {
4483 /* The presence of a parent indicates that this is an LWP.
4484 Close any file descriptors that it might have open.
4485 We don't do this to the master (parent) procinfo. */
4486
4487 close_procinfo_files (pi);
4488 }
4489 pi->gregs_valid = 0;
4490 pi->fpregs_valid = 0;
4491 #if 0
4492 pi->gregs_dirty = 0;
4493 pi->fpregs_dirty = 0;
4494 #endif
4495 pi->status_valid = 0;
4496 pi->threads_valid = 0;
4497
4498 return 0;
4499 }
4500
4501 #if 0
4502 /*
4503 * Function: make_signal_thread_runnable
4504 *
4505 * A callback function for iterate_over_threads.
4506 * Find the asynchronous signal thread, and make it runnable.
4507 * See if that helps matters any.
4508 */
4509
4510 static int
4511 make_signal_thread_runnable (procinfo *process, procinfo *pi, void *ptr)
4512 {
4513 #ifdef PR_ASLWP
4514 if (proc_flags (pi) & PR_ASLWP)
4515 {
4516 if (!proc_run_process (pi, 0, -1))
4517 proc_error (pi, "make_signal_thread_runnable", __LINE__);
4518 return 1;
4519 }
4520 #endif
4521 return 0;
4522 }
4523 #endif
4524
4525 /*
4526 * Function: target_resume
4527 *
4528 * Make the child process runnable. Normally we will then call
4529 * procfs_wait and wait for it to stop again (unles gdb is async).
4530 *
4531 * Arguments:
4532 * step: if true, then arrange for the child to stop again
4533 * after executing a single instruction.
4534 * signo: if zero, then cancel any pending signal.
4535 * If non-zero, then arrange for the indicated signal
4536 * to be delivered to the child when it runs.
4537 * pid: if -1, then allow any child thread to run.
4538 * if non-zero, then allow only the indicated thread to run.
4539 ******* (not implemented yet)
4540 */
4541
4542 static void
4543 procfs_resume (struct target_ops *ops,
4544 ptid_t ptid, int step, enum target_signal signo)
4545 {
4546 procinfo *pi, *thread;
4547 int native_signo;
4548
4549 /* 2.1:
4550 prrun.prflags |= PRSVADDR;
4551 prrun.pr_vaddr = $PC; set resume address
4552 prrun.prflags |= PRSTRACE; trace signals in pr_trace (all)
4553 prrun.prflags |= PRSFAULT; trace faults in pr_fault (all but PAGE)
4554 prrun.prflags |= PRCFAULT; clear current fault.
4555
4556 PRSTRACE and PRSFAULT can be done by other means
4557 (proc_trace_signals, proc_trace_faults)
4558 PRSVADDR is unnecessary.
4559 PRCFAULT may be replaced by a PIOCCFAULT call (proc_clear_current_fault)
4560 This basically leaves PRSTEP and PRCSIG.
4561 PRCSIG is like PIOCSSIG (proc_clear_current_signal).
4562 So basically PR_STEP is the sole argument that must be passed
4563 to proc_run_process (for use in the prrun struct by ioctl). */
4564
4565 /* Find procinfo for main process */
4566 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
4567
4568 /* First cut: ignore pid argument */
4569 errno = 0;
4570
4571 /* Convert signal to host numbering. */
4572 if (signo == 0 ||
4573 (signo == TARGET_SIGNAL_STOP && pi->ignore_next_sigstop))
4574 native_signo = 0;
4575 else
4576 native_signo = target_signal_to_host (signo);
4577
4578 pi->ignore_next_sigstop = 0;
4579
4580 /* Running the process voids all cached registers and status. */
4581 /* Void the threads' caches first */
4582 proc_iterate_over_threads (pi, invalidate_cache, NULL);
4583 /* Void the process procinfo's caches. */
4584 invalidate_cache (NULL, pi, NULL);
4585
4586 if (PIDGET (ptid) != -1)
4587 {
4588 /* Resume a specific thread, presumably suppressing the others. */
4589 thread = find_procinfo (PIDGET (ptid), TIDGET (ptid));
4590 if (thread != NULL)
4591 {
4592 if (thread->tid != 0)
4593 {
4594 /* We're to resume a specific thread, and not the others.
4595 * Set the child process's PR_ASYNC flag.
4596 */
4597 #ifdef PR_ASYNC
4598 if (!proc_set_async (pi))
4599 proc_error (pi, "target_resume, set_async", __LINE__);
4600 #endif
4601 #if 0
4602 proc_iterate_over_threads (pi,
4603 make_signal_thread_runnable,
4604 NULL);
4605 #endif
4606 pi = thread; /* substitute the thread's procinfo for run */
4607 }
4608 }
4609 }
4610
4611 if (!proc_run_process (pi, step, native_signo))
4612 {
4613 if (errno == EBUSY)
4614 warning (_("resume: target already running. Pretend to resume, and hope for the best!"));
4615 else
4616 proc_error (pi, "target_resume", __LINE__);
4617 }
4618 }
4619
4620 /*
4621 * Function: register_gdb_signals
4622 *
4623 * Traverse the list of signals that GDB knows about
4624 * (see "handle" command), and arrange for the target
4625 * to be stopped or not, according to these settings.
4626 *
4627 * Returns non-zero for success, zero for failure.
4628 */
4629
4630 static int
4631 register_gdb_signals (procinfo *pi, gdb_sigset_t *signals)
4632 {
4633 int signo;
4634
4635 for (signo = 0; signo < NSIG; signo ++)
4636 if (signal_stop_state (target_signal_from_host (signo)) == 0 &&
4637 signal_print_state (target_signal_from_host (signo)) == 0 &&
4638 signal_pass_state (target_signal_from_host (signo)) == 1)
4639 prdelset (signals, signo);
4640 else
4641 praddset (signals, signo);
4642
4643 return proc_set_traced_signals (pi, signals);
4644 }
4645
4646 /*
4647 * Function: target_notice_signals
4648 *
4649 * Set up to trace signals in the child process.
4650 */
4651
4652 static void
4653 procfs_notice_signals (ptid_t ptid)
4654 {
4655 gdb_sigset_t signals;
4656 procinfo *pi = find_procinfo_or_die (PIDGET (ptid), 0);
4657
4658 if (proc_get_traced_signals (pi, &signals) &&
4659 register_gdb_signals (pi, &signals))
4660 return;
4661 else
4662 proc_error (pi, "notice_signals", __LINE__);
4663 }
4664
4665 /*
4666 * Function: target_files_info
4667 *
4668 * Print status information about the child process.
4669 */
4670
4671 static void
4672 procfs_files_info (struct target_ops *ignore)
4673 {
4674 struct inferior *inf = current_inferior ();
4675 printf_filtered (_("\tUsing the running image of %s %s via /proc.\n"),
4676 inf->attach_flag? "attached": "child",
4677 target_pid_to_str (inferior_ptid));
4678 }
4679
4680 /*
4681 * Function: target_stop
4682 *
4683 * Stop the child process asynchronously, as when the
4684 * gdb user types control-c or presses a "stop" button.
4685 *
4686 * Works by sending kill(SIGINT) to the child's process group.
4687 */
4688
4689 static void
4690 procfs_stop (ptid_t ptid)
4691 {
4692 kill (-inferior_process_group, SIGINT);
4693 }
4694
4695 /*
4696 * Function: unconditionally_kill_inferior
4697 *
4698 * Make it die. Wait for it to die. Clean up after it.
4699 * Note: this should only be applied to the real process,
4700 * not to an LWP, because of the check for parent-process.
4701 * If we need this to work for an LWP, it needs some more logic.
4702 */
4703
4704 static void
4705 unconditionally_kill_inferior (procinfo *pi)
4706 {
4707 int parent_pid;
4708
4709 parent_pid = proc_parent_pid (pi);
4710 #ifdef PROCFS_NEED_CLEAR_CURSIG_FOR_KILL
4711 /* FIXME: use access functions */
4712 /* Alpha OSF/1-3.x procfs needs a clear of the current signal
4713 before the PIOCKILL, otherwise it might generate a corrupted core
4714 file for the inferior. */
4715 if (ioctl (pi->ctl_fd, PIOCSSIG, NULL) < 0)
4716 {
4717 printf_filtered ("unconditionally_kill: SSIG failed!\n");
4718 }
4719 #endif
4720 #ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
4721 /* Alpha OSF/1-2.x procfs needs a PIOCSSIG call with a SIGKILL signal
4722 to kill the inferior, otherwise it might remain stopped with a
4723 pending SIGKILL.
4724 We do not check the result of the PIOCSSIG, the inferior might have
4725 died already. */
4726 {
4727 gdb_siginfo_t newsiginfo;
4728
4729 memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
4730 newsiginfo.si_signo = SIGKILL;
4731 newsiginfo.si_code = 0;
4732 newsiginfo.si_errno = 0;
4733 newsiginfo.si_pid = getpid ();
4734 newsiginfo.si_uid = getuid ();
4735 /* FIXME: use proc_set_current_signal */
4736 ioctl (pi->ctl_fd, PIOCSSIG, &newsiginfo);
4737 }
4738 #else /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
4739 if (!proc_kill (pi, SIGKILL))
4740 proc_error (pi, "unconditionally_kill, proc_kill", __LINE__);
4741 #endif /* PROCFS_NEED_PIOCSSIG_FOR_KILL */
4742 destroy_procinfo (pi);
4743
4744 /* If pi is GDB's child, wait for it to die. */
4745 if (parent_pid == getpid ())
4746 /* FIXME: should we use waitpid to make sure we get the right event?
4747 Should we check the returned event? */
4748 {
4749 #if 0
4750 int status, ret;
4751
4752 ret = waitpid (pi->pid, &status, 0);
4753 #else
4754 wait (NULL);
4755 #endif
4756 }
4757 }
4758
4759 /*
4760 * Function: target_kill_inferior
4761 *
4762 * We're done debugging it, and we want it to go away.
4763 * Then we want GDB to forget all about it.
4764 */
4765
4766 static void
4767 procfs_kill_inferior (struct target_ops *ops)
4768 {
4769 if (!ptid_equal (inferior_ptid, null_ptid)) /* ? */
4770 {
4771 /* Find procinfo for main process */
4772 procinfo *pi = find_procinfo (PIDGET (inferior_ptid), 0);
4773
4774 if (pi)
4775 unconditionally_kill_inferior (pi);
4776 target_mourn_inferior ();
4777 }
4778 }
4779
4780 /*
4781 * Function: target_mourn_inferior
4782 *
4783 * Forget we ever debugged this thing!
4784 */
4785
4786 static void
4787 procfs_mourn_inferior (struct target_ops *ops)
4788 {
4789 procinfo *pi;
4790
4791 if (!ptid_equal (inferior_ptid, null_ptid))
4792 {
4793 /* Find procinfo for main process */
4794 pi = find_procinfo (PIDGET (inferior_ptid), 0);
4795 if (pi)
4796 destroy_procinfo (pi);
4797 }
4798 unpush_target (ops);
4799
4800 if (dbx_link_bpt != NULL)
4801 {
4802 deprecated_remove_raw_breakpoint (dbx_link_bpt);
4803 dbx_link_bpt_addr = 0;
4804 dbx_link_bpt = NULL;
4805 }
4806
4807 generic_mourn_inferior ();
4808 }
4809
4810 /*
4811 * Function: init_inferior
4812 *
4813 * When GDB forks to create a runnable inferior process,
4814 * this function is called on the parent side of the fork.
4815 * It's job is to do whatever is necessary to make the child
4816 * ready to be debugged, and then wait for the child to synchronize.
4817 */
4818
4819 static void
4820 procfs_init_inferior (struct target_ops *ops, int pid)
4821 {
4822 procinfo *pi;
4823 gdb_sigset_t signals;
4824 int fail;
4825 int lwpid;
4826
4827 /* This routine called on the parent side (GDB side)
4828 after GDB forks the inferior. */
4829 push_target (ops);
4830
4831 if ((pi = create_procinfo (pid, 0)) == NULL)
4832 perror ("procfs: out of memory in 'init_inferior'");
4833
4834 if (!open_procinfo_files (pi, FD_CTL))
4835 proc_error (pi, "init_inferior, open_proc_files", __LINE__);
4836
4837 /*
4838 xmalloc // done
4839 open_procinfo_files // done
4840 link list // done
4841 prfillset (trace)
4842 procfs_notice_signals
4843 prfillset (fault)
4844 prdelset (FLTPAGE)
4845 PIOCWSTOP
4846 PIOCSFAULT
4847 */
4848
4849 /* If not stopped yet, wait for it to stop. */
4850 if (!(proc_flags (pi) & PR_STOPPED) &&
4851 !(proc_wait_for_stop (pi)))
4852 dead_procinfo (pi, "init_inferior: wait_for_stop failed", KILL);
4853
4854 /* Save some of the /proc state to be restored if we detach. */
4855 /* FIXME: Why? In case another debugger was debugging it?
4856 We're it's parent, for Ghu's sake! */
4857 if (!proc_get_traced_signals (pi, &pi->saved_sigset))
4858 proc_error (pi, "init_inferior, get_traced_signals", __LINE__);
4859 if (!proc_get_held_signals (pi, &pi->saved_sighold))
4860 proc_error (pi, "init_inferior, get_held_signals", __LINE__);
4861 if (!proc_get_traced_faults (pi, &pi->saved_fltset))
4862 proc_error (pi, "init_inferior, get_traced_faults", __LINE__);
4863 if (!proc_get_traced_sysentry (pi, pi->saved_entryset))
4864 proc_error (pi, "init_inferior, get_traced_sysentry", __LINE__);
4865 if (!proc_get_traced_sysexit (pi, pi->saved_exitset))
4866 proc_error (pi, "init_inferior, get_traced_sysexit", __LINE__);
4867
4868 /* Register to trace selected signals in the child. */
4869 prfillset (&signals);
4870 if (!register_gdb_signals (pi, &signals))
4871 proc_error (pi, "init_inferior, register_signals", __LINE__);
4872
4873 if ((fail = procfs_debug_inferior (pi)) != 0)
4874 proc_error (pi, "init_inferior (procfs_debug_inferior)", fail);
4875
4876 /* FIXME: logically, we should really be turning OFF run-on-last-close,
4877 and possibly even turning ON kill-on-last-close at this point. But
4878 I can't make that change without careful testing which I don't have
4879 time to do right now... */
4880 /* Turn on run-on-last-close flag so that the child
4881 will die if GDB goes away for some reason. */
4882 if (!proc_set_run_on_last_close (pi))
4883 proc_error (pi, "init_inferior, set_RLC", __LINE__);
4884
4885 /* We now have have access to the lwpid of the main thread/lwp. */
4886 lwpid = proc_get_current_thread (pi);
4887
4888 /* Create a procinfo for the main lwp. */
4889 create_procinfo (pid, lwpid);
4890
4891 /* We already have a main thread registered in the thread table at
4892 this point, but it didn't have any lwp info yet. Notify the core
4893 about it. This changes inferior_ptid as well. */
4894 thread_change_ptid (pid_to_ptid (pid),
4895 MERGEPID (pid, lwpid));
4896
4897 /* Typically two, one trap to exec the shell, one to exec the
4898 program being debugged. Defined by "inferior.h". */
4899 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
4900
4901 #ifdef SYS_syssgi
4902 /* On mips-irix, we need to stop the inferior early enough during
4903 the startup phase in order to be able to load the shared library
4904 symbols and insert the breakpoints that are located in these shared
4905 libraries. Stopping at the program entry point is not good enough
4906 because the -init code is executed before the execution reaches
4907 that point.
4908
4909 So what we need to do is to insert a breakpoint in the runtime
4910 loader (rld), more precisely in __dbx_link(). This procedure is
4911 called by rld once all shared libraries have been mapped, but before
4912 the -init code is executed. Unfortuantely, this is not straightforward,
4913 as rld is not part of the executable we are running, and thus we need
4914 the inferior to run until rld itself has been mapped in memory.
4915
4916 For this, we trace all syssgi() syscall exit events. Each time
4917 we detect such an event, we iterate over each text memory maps,
4918 get its associated fd, and scan the symbol table for __dbx_link().
4919 When found, we know that rld has been mapped, and that we can insert
4920 the breakpoint at the symbol address. Once the dbx_link() breakpoint
4921 has been inserted, the syssgi() notifications are no longer necessary,
4922 so they should be canceled. */
4923 proc_trace_syscalls_1 (pi, SYS_syssgi, PR_SYSEXIT, FLAG_SET, 0);
4924 #endif
4925 }
4926
4927 /*
4928 * Function: set_exec_trap
4929 *
4930 * When GDB forks to create a new process, this function is called
4931 * on the child side of the fork before GDB exec's the user program.
4932 * Its job is to make the child minimally debuggable, so that the
4933 * parent GDB process can connect to the child and take over.
4934 * This function should do only the minimum to make that possible,
4935 * and to synchronize with the parent process. The parent process
4936 * should take care of the details.
4937 */
4938
4939 static void
4940 procfs_set_exec_trap (void)
4941 {
4942 /* This routine called on the child side (inferior side)
4943 after GDB forks the inferior. It must use only local variables,
4944 because it may be sharing data space with its parent. */
4945
4946 procinfo *pi;
4947 sysset_t *exitset;
4948
4949 if ((pi = create_procinfo (getpid (), 0)) == NULL)
4950 perror_with_name (_("procfs: create_procinfo failed in child."));
4951
4952 if (open_procinfo_files (pi, FD_CTL) == 0)
4953 {
4954 proc_warn (pi, "set_exec_trap, open_proc_files", __LINE__);
4955 gdb_flush (gdb_stderr);
4956 /* no need to call "dead_procinfo", because we're going to exit. */
4957 _exit (127);
4958 }
4959
4960 #ifdef PRFS_STOPEXEC /* defined on OSF */
4961 /* OSF method for tracing exec syscalls. Quoting:
4962 Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
4963 exits from exec system calls because of the user level loader. */
4964 /* FIXME: make nice and maybe move into an access function. */
4965 {
4966 int prfs_flags;
4967
4968 if (ioctl (pi->ctl_fd, PIOCGSPCACT, &prfs_flags) < 0)
4969 {
4970 proc_warn (pi, "set_exec_trap (PIOCGSPCACT)", __LINE__);
4971 gdb_flush (gdb_stderr);
4972 _exit (127);
4973 }
4974 prfs_flags |= PRFS_STOPEXEC;
4975
4976 if (ioctl (pi->ctl_fd, PIOCSSPCACT, &prfs_flags) < 0)
4977 {
4978 proc_warn (pi, "set_exec_trap (PIOCSSPCACT)", __LINE__);
4979 gdb_flush (gdb_stderr);
4980 _exit (127);
4981 }
4982 }
4983 #else /* not PRFS_STOPEXEC */
4984 /* Everyone else's (except OSF) method for tracing exec syscalls */
4985 /* GW: Rationale...
4986 Not all systems with /proc have all the exec* syscalls with the same
4987 names. On the SGI, for example, there is no SYS_exec, but there
4988 *is* a SYS_execv. So, we try to account for that. */
4989
4990 exitset = sysset_t_alloc (pi);
4991 gdb_premptysysset (exitset);
4992 #ifdef SYS_exec
4993 gdb_praddsysset (exitset, SYS_exec);
4994 #endif
4995 #ifdef SYS_execve
4996 gdb_praddsysset (exitset, SYS_execve);
4997 #endif
4998 #ifdef SYS_execv
4999 gdb_praddsysset (exitset, SYS_execv);
5000 #endif
5001 #ifdef DYNAMIC_SYSCALLS
5002 {
5003 int callnum = find_syscall (pi, "execve");
5004
5005 if (callnum >= 0)
5006 gdb_praddsysset (exitset, callnum);
5007
5008 callnum = find_syscall (pi, "ra_execve");
5009 if (callnum >= 0)
5010 gdb_praddsysset (exitset, callnum);
5011 }
5012 #endif /* DYNAMIC_SYSCALLS */
5013
5014 if (!proc_set_traced_sysexit (pi, exitset))
5015 {
5016 proc_warn (pi, "set_exec_trap, set_traced_sysexit", __LINE__);
5017 gdb_flush (gdb_stderr);
5018 _exit (127);
5019 }
5020 #endif /* PRFS_STOPEXEC */
5021
5022 /* FIXME: should this be done in the parent instead? */
5023 /* Turn off inherit on fork flag so that all grand-children
5024 of gdb start with tracing flags cleared. */
5025 if (!proc_unset_inherit_on_fork (pi))
5026 proc_warn (pi, "set_exec_trap, unset_inherit", __LINE__);
5027
5028 /* Turn off run on last close flag, so that the child process
5029 cannot run away just because we close our handle on it.
5030 We want it to wait for the parent to attach. */
5031 if (!proc_unset_run_on_last_close (pi))
5032 proc_warn (pi, "set_exec_trap, unset_RLC", __LINE__);
5033
5034 /* FIXME: No need to destroy the procinfo --
5035 we have our own address space, and we're about to do an exec! */
5036 /*destroy_procinfo (pi);*/
5037 }
5038
5039 /*
5040 * Function: create_inferior
5041 *
5042 * This function is called BEFORE gdb forks the inferior process.
5043 * Its only real responsibility is to set things up for the fork,
5044 * and tell GDB which two functions to call after the fork (one
5045 * for the parent, and one for the child).
5046 *
5047 * This function does a complicated search for a unix shell program,
5048 * which it then uses to parse arguments and environment variables
5049 * to be sent to the child. I wonder whether this code could not
5050 * be abstracted out and shared with other unix targets such as
5051 * infptrace?
5052 */
5053
5054 static void
5055 procfs_create_inferior (struct target_ops *ops, char *exec_file,
5056 char *allargs, char **env, int from_tty)
5057 {
5058 char *shell_file = getenv ("SHELL");
5059 char *tryname;
5060 int pid;
5061
5062 if (shell_file != NULL && strchr (shell_file, '/') == NULL)
5063 {
5064
5065 /* We will be looking down the PATH to find shell_file. If we
5066 just do this the normal way (via execlp, which operates by
5067 attempting an exec for each element of the PATH until it
5068 finds one which succeeds), then there will be an exec for
5069 each failed attempt, each of which will cause a PR_SYSEXIT
5070 stop, and we won't know how to distinguish the PR_SYSEXIT's
5071 for these failed execs with the ones for successful execs
5072 (whether the exec has succeeded is stored at that time in the
5073 carry bit or some such architecture-specific and
5074 non-ABI-specified place).
5075
5076 So I can't think of anything better than to search the PATH
5077 now. This has several disadvantages: (1) There is a race
5078 condition; if we find a file now and it is deleted before we
5079 exec it, we lose, even if the deletion leaves a valid file
5080 further down in the PATH, (2) there is no way to know exactly
5081 what an executable (in the sense of "capable of being
5082 exec'd") file is. Using access() loses because it may lose
5083 if the caller is the superuser; failing to use it loses if
5084 there are ACLs or some such. */
5085
5086 char *p;
5087 char *p1;
5088 /* FIXME-maybe: might want "set path" command so user can change what
5089 path is used from within GDB. */
5090 char *path = getenv ("PATH");
5091 int len;
5092 struct stat statbuf;
5093
5094 if (path == NULL)
5095 path = "/bin:/usr/bin";
5096
5097 tryname = alloca (strlen (path) + strlen (shell_file) + 2);
5098 for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
5099 {
5100 p1 = strchr (p, ':');
5101 if (p1 != NULL)
5102 len = p1 - p;
5103 else
5104 len = strlen (p);
5105 strncpy (tryname, p, len);
5106 tryname[len] = '\0';
5107 strcat (tryname, "/");
5108 strcat (tryname, shell_file);
5109 if (access (tryname, X_OK) < 0)
5110 continue;
5111 if (stat (tryname, &statbuf) < 0)
5112 continue;
5113 if (!S_ISREG (statbuf.st_mode))
5114 /* We certainly need to reject directories. I'm not quite
5115 as sure about FIFOs, sockets, etc., but I kind of doubt
5116 that people want to exec() these things. */
5117 continue;
5118 break;
5119 }
5120 if (p == NULL)
5121 /* Not found. This must be an error rather than merely passing
5122 the file to execlp(), because execlp() would try all the
5123 exec()s, causing GDB to get confused. */
5124 error (_("procfs:%d -- Can't find shell %s in PATH"),
5125 __LINE__, shell_file);
5126
5127 shell_file = tryname;
5128 }
5129
5130 pid = fork_inferior (exec_file, allargs, env, procfs_set_exec_trap,
5131 NULL, NULL, shell_file);
5132
5133 procfs_init_inferior (ops, pid);
5134
5135 #ifdef SYS_syssgi
5136 /* Make sure to cancel the syssgi() syscall-exit notifications.
5137 They should normally have been removed by now, but they may still
5138 be activated if the inferior doesn't use shared libraries, or if
5139 we didn't locate __dbx_link, or if we never stopped in __dbx_link.
5140 See procfs_init_inferior() for more details. */
5141 proc_trace_syscalls_1 (find_procinfo_or_die (PIDGET (inferior_ptid), 0),
5142 SYS_syssgi, PR_SYSEXIT, FLAG_RESET, 0);
5143 #endif
5144 }
5145
5146 /*
5147 * Function: notice_thread
5148 *
5149 * Callback for find_new_threads.
5150 * Calls "add_thread".
5151 */
5152
5153 static int
5154 procfs_notice_thread (procinfo *pi, procinfo *thread, void *ptr)
5155 {
5156 ptid_t gdb_threadid = MERGEPID (pi->pid, thread->tid);
5157
5158 if (!in_thread_list (gdb_threadid) || is_exited (gdb_threadid))
5159 add_thread (gdb_threadid);
5160
5161 return 0;
5162 }
5163
5164 /*
5165 * Function: target_find_new_threads
5166 *
5167 * Query all the threads that the target knows about,
5168 * and give them back to GDB to add to its list.
5169 */
5170
5171 void
5172 procfs_find_new_threads (struct target_ops *ops)
5173 {
5174 procinfo *pi;
5175
5176 /* Find procinfo for main process */
5177 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5178 proc_update_threads (pi);
5179 proc_iterate_over_threads (pi, procfs_notice_thread, NULL);
5180 }
5181
5182 /*
5183 * Function: target_thread_alive
5184 *
5185 * Return true if the thread is still 'alive'.
5186 *
5187 * This guy doesn't really seem to be doing his job.
5188 * Got to investigate how to tell when a thread is really gone.
5189 */
5190
5191 static int
5192 procfs_thread_alive (struct target_ops *ops, ptid_t ptid)
5193 {
5194 int proc, thread;
5195 procinfo *pi;
5196
5197 proc = PIDGET (ptid);
5198 thread = TIDGET (ptid);
5199 /* If I don't know it, it ain't alive! */
5200 if ((pi = find_procinfo (proc, thread)) == NULL)
5201 return 0;
5202
5203 /* If I can't get its status, it ain't alive!
5204 What's more, I need to forget about it! */
5205 if (!proc_get_status (pi))
5206 {
5207 destroy_procinfo (pi);
5208 return 0;
5209 }
5210 /* I couldn't have got its status if it weren't alive, so it's alive. */
5211 return 1;
5212 }
5213
5214 /* Convert PTID to a string. Returns the string in a static buffer. */
5215
5216 char *
5217 procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
5218 {
5219 static char buf[80];
5220
5221 if (TIDGET (ptid) == 0)
5222 sprintf (buf, "process %d", PIDGET (ptid));
5223 else
5224 sprintf (buf, "LWP %ld", TIDGET (ptid));
5225
5226 return buf;
5227 }
5228
5229 /*
5230 * Function: procfs_set_watchpoint
5231 * Insert a watchpoint
5232 */
5233
5234 int
5235 procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag,
5236 int after)
5237 {
5238 #ifndef UNIXWARE
5239 #ifndef AIX5
5240 int pflags = 0;
5241 procinfo *pi;
5242
5243 pi = find_procinfo_or_die (PIDGET (ptid) == -1 ?
5244 PIDGET (inferior_ptid) : PIDGET (ptid), 0);
5245
5246 /* Translate from GDB's flags to /proc's */
5247 if (len > 0) /* len == 0 means delete watchpoint */
5248 {
5249 switch (rwflag) { /* FIXME: need an enum! */
5250 case hw_write: /* default watchpoint (write) */
5251 pflags = WRITE_WATCHFLAG;
5252 break;
5253 case hw_read: /* read watchpoint */
5254 pflags = READ_WATCHFLAG;
5255 break;
5256 case hw_access: /* access watchpoint */
5257 pflags = READ_WATCHFLAG | WRITE_WATCHFLAG;
5258 break;
5259 case hw_execute: /* execution HW breakpoint */
5260 pflags = EXEC_WATCHFLAG;
5261 break;
5262 default: /* Something weird. Return error. */
5263 return -1;
5264 }
5265 if (after) /* Stop after r/w access is completed. */
5266 pflags |= AFTER_WATCHFLAG;
5267 }
5268
5269 if (!proc_set_watchpoint (pi, addr, len, pflags))
5270 {
5271 if (errno == E2BIG) /* Typical error for no resources */
5272 return -1; /* fail */
5273 /* GDB may try to remove the same watchpoint twice.
5274 If a remove request returns no match, don't error. */
5275 if (errno == ESRCH && len == 0)
5276 return 0; /* ignore */
5277 proc_error (pi, "set_watchpoint", __LINE__);
5278 }
5279 #endif /* AIX5 */
5280 #endif /* UNIXWARE */
5281 return 0;
5282 }
5283
5284 /* Return non-zero if we can set a hardware watchpoint of type TYPE. TYPE
5285 is one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint,
5286 or bp_hardware_watchpoint. CNT is the number of watchpoints used so
5287 far.
5288
5289 Note: procfs_can_use_hw_breakpoint() is not yet used by all
5290 procfs.c targets due to the fact that some of them still define
5291 TARGET_CAN_USE_HARDWARE_WATCHPOINT. */
5292
5293 static int
5294 procfs_can_use_hw_breakpoint (int type, int cnt, int othertype)
5295 {
5296 #ifndef TARGET_HAS_HARDWARE_WATCHPOINTS
5297 return 0;
5298 #else
5299 /* Due to the way that proc_set_watchpoint() is implemented, host
5300 and target pointers must be of the same size. If they are not,
5301 we can't use hardware watchpoints. This limitation is due to the
5302 fact that proc_set_watchpoint() calls
5303 procfs_address_to_host_pointer(); a close inspection of
5304 procfs_address_to_host_pointer will reveal that an internal error
5305 will be generated when the host and target pointer sizes are
5306 different. */
5307 struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
5308 if (sizeof (void *) != TYPE_LENGTH (ptr_type))
5309 return 0;
5310
5311 /* Other tests here??? */
5312
5313 return 1;
5314 #endif
5315 }
5316
5317 /*
5318 * Function: stopped_by_watchpoint
5319 *
5320 * Returns non-zero if process is stopped on a hardware watchpoint fault,
5321 * else returns zero.
5322 */
5323
5324 int
5325 procfs_stopped_by_watchpoint (ptid_t ptid)
5326 {
5327 procinfo *pi;
5328
5329 pi = find_procinfo_or_die (PIDGET (ptid) == -1 ?
5330 PIDGET (inferior_ptid) : PIDGET (ptid), 0);
5331
5332 if (!pi) /* If no process, then not stopped by watchpoint! */
5333 return 0;
5334
5335 if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
5336 {
5337 if (proc_why (pi) == PR_FAULTED)
5338 {
5339 #ifdef FLTWATCH
5340 if (proc_what (pi) == FLTWATCH)
5341 return 1;
5342 #endif
5343 #ifdef FLTKWATCH
5344 if (proc_what (pi) == FLTKWATCH)
5345 return 1;
5346 #endif
5347 }
5348 }
5349 return 0;
5350 }
5351
5352 /*
5353 * Memory Mappings Functions:
5354 */
5355
5356 /*
5357 * Function: iterate_over_mappings
5358 *
5359 * Call a callback function once for each mapping, passing it the mapping,
5360 * an optional secondary callback function, and some optional opaque data.
5361 * Quit and return the first non-zero value returned from the callback.
5362 *
5363 * Arguments:
5364 * pi -- procinfo struct for the process to be mapped.
5365 * func -- callback function to be called by this iterator.
5366 * data -- optional opaque data to be passed to the callback function.
5367 * child_func -- optional secondary function pointer to be passed
5368 * to the child function.
5369 *
5370 * Return: First non-zero return value from the callback function,
5371 * or zero.
5372 */
5373
5374 static int
5375 iterate_over_mappings (procinfo *pi, int (*child_func) (), void *data,
5376 int (*func) (struct prmap *map,
5377 int (*child_func) (),
5378 void *data))
5379 {
5380 char pathname[MAX_PROC_NAME_SIZE];
5381 struct prmap *prmaps;
5382 struct prmap *prmap;
5383 int funcstat;
5384 int map_fd;
5385 int nmap;
5386 #ifdef NEW_PROC_API
5387 struct stat sbuf;
5388 #endif
5389
5390 /* Get the number of mappings, allocate space,
5391 and read the mappings into prmaps. */
5392 #ifdef NEW_PROC_API
5393 /* Open map fd. */
5394 sprintf (pathname, "/proc/%d/map", pi->pid);
5395 if ((map_fd = open (pathname, O_RDONLY)) < 0)
5396 proc_error (pi, "iterate_over_mappings (open)", __LINE__);
5397
5398 /* Make sure it gets closed again. */
5399 make_cleanup_close (map_fd);
5400
5401 /* Use stat to determine the file size, and compute
5402 the number of prmap_t objects it contains. */
5403 if (fstat (map_fd, &sbuf) != 0)
5404 proc_error (pi, "iterate_over_mappings (fstat)", __LINE__);
5405
5406 nmap = sbuf.st_size / sizeof (prmap_t);
5407 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
5408 if (read (map_fd, (char *) prmaps, nmap * sizeof (*prmaps))
5409 != (nmap * sizeof (*prmaps)))
5410 proc_error (pi, "iterate_over_mappings (read)", __LINE__);
5411 #else
5412 /* Use ioctl command PIOCNMAP to get number of mappings. */
5413 if (ioctl (pi->ctl_fd, PIOCNMAP, &nmap) != 0)
5414 proc_error (pi, "iterate_over_mappings (PIOCNMAP)", __LINE__);
5415
5416 prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps));
5417 if (ioctl (pi->ctl_fd, PIOCMAP, prmaps) != 0)
5418 proc_error (pi, "iterate_over_mappings (PIOCMAP)", __LINE__);
5419 #endif
5420
5421 for (prmap = prmaps; nmap > 0; prmap++, nmap--)
5422 if ((funcstat = (*func) (prmap, child_func, data)) != 0)
5423 return funcstat;
5424
5425 return 0;
5426 }
5427
5428 /*
5429 * Function: solib_mappings_callback
5430 *
5431 * Calls the supplied callback function once for each mapped address
5432 * space in the process. The callback function receives an open
5433 * file descriptor for the file corresponding to that mapped
5434 * address space (if there is one), and the base address of the
5435 * mapped space. Quit when the callback function returns a
5436 * nonzero value, or at teh end of the mappings.
5437 *
5438 * Returns: the first non-zero return value of the callback function,
5439 * or zero.
5440 */
5441
5442 int solib_mappings_callback (struct prmap *map,
5443 int (*func) (int, CORE_ADDR),
5444 void *data)
5445 {
5446 procinfo *pi = data;
5447 int fd;
5448
5449 #ifdef NEW_PROC_API
5450 char name[MAX_PROC_NAME_SIZE + sizeof (map->pr_mapname)];
5451
5452 if (map->pr_vaddr == 0 && map->pr_size == 0)
5453 return -1; /* sanity */
5454
5455 if (map->pr_mapname[0] == 0)
5456 {
5457 fd = -1; /* no map file */
5458 }
5459 else
5460 {
5461 sprintf (name, "/proc/%d/object/%s", pi->pid, map->pr_mapname);
5462 /* Note: caller's responsibility to close this fd! */
5463 fd = open_with_retry (name, O_RDONLY);
5464 /* Note: we don't test the above call for failure;
5465 we just pass the FD on as given. Sometimes there is
5466 no file, so the open may return failure, but that's
5467 not a problem. */
5468 }
5469 #else
5470 fd = ioctl (pi->ctl_fd, PIOCOPENM, &map->pr_vaddr);
5471 /* Note: we don't test the above call for failure;
5472 we just pass the FD on as given. Sometimes there is
5473 no file, so the ioctl may return failure, but that's
5474 not a problem. */
5475 #endif
5476 return (*func) (fd, (CORE_ADDR) map->pr_vaddr);
5477 }
5478
5479 /*
5480 * Function: proc_iterate_over_mappings
5481 *
5482 * Uses the unified "iterate_over_mappings" function
5483 * to implement the exported interface to solib-svr4.c.
5484 *
5485 * Given a pointer to a function, call that function once for every
5486 * mapped address space in the process. The callback function
5487 * receives an open file descriptor for the file corresponding to
5488 * that mapped address space (if there is one), and the base address
5489 * of the mapped space. Quit when the callback function returns a
5490 * nonzero value, or at teh end of the mappings.
5491 *
5492 * Returns: the first non-zero return value of the callback function,
5493 * or zero.
5494 */
5495
5496 int
5497 proc_iterate_over_mappings (int (*func) (int, CORE_ADDR))
5498 {
5499 procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5500
5501 return iterate_over_mappings (pi, func, pi, solib_mappings_callback);
5502 }
5503
5504 /*
5505 * Function: find_memory_regions_callback
5506 *
5507 * Implements the to_find_memory_regions method.
5508 * Calls an external function for each memory region.
5509 * External function will have the signiture:
5510 *
5511 * int callback (CORE_ADDR vaddr,
5512 * unsigned long size,
5513 * int read, int write, int execute,
5514 * void *data);
5515 *
5516 * Returns the integer value returned by the callback.
5517 */
5518
5519 static int
5520 find_memory_regions_callback (struct prmap *map,
5521 int (*func) (CORE_ADDR,
5522 unsigned long,
5523 int, int, int,
5524 void *),
5525 void *data)
5526 {
5527 return (*func) ((CORE_ADDR) map->pr_vaddr,
5528 map->pr_size,
5529 (map->pr_mflags & MA_READ) != 0,
5530 (map->pr_mflags & MA_WRITE) != 0,
5531 (map->pr_mflags & MA_EXEC) != 0,
5532 data);
5533 }
5534
5535 /*
5536 * Function: proc_find_memory_regions
5537 *
5538 * External interface. Calls a callback function once for each
5539 * mapped memory region in the child process, passing as arguments
5540 * CORE_ADDR virtual_address,
5541 * unsigned long size,
5542 * int read, TRUE if region is readable by the child
5543 * int write, TRUE if region is writable by the child
5544 * int execute TRUE if region is executable by the child.
5545 *
5546 * Stops iterating and returns the first non-zero value
5547 * returned by the callback.
5548 */
5549
5550 static int
5551 proc_find_memory_regions (int (*func) (CORE_ADDR,
5552 unsigned long,
5553 int, int, int,
5554 void *),
5555 void *data)
5556 {
5557 procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5558
5559 return iterate_over_mappings (pi, func, data,
5560 find_memory_regions_callback);
5561 }
5562
5563 /* Remove the breakpoint that we inserted in __dbx_link().
5564 Does nothing if the breakpoint hasn't been inserted or has already
5565 been removed. */
5566
5567 static void
5568 remove_dbx_link_breakpoint (void)
5569 {
5570 if (dbx_link_bpt_addr == 0)
5571 return;
5572
5573 if (deprecated_remove_raw_breakpoint (dbx_link_bpt) != 0)
5574 warning (_("Unable to remove __dbx_link breakpoint."));
5575
5576 dbx_link_bpt_addr = 0;
5577 dbx_link_bpt = NULL;
5578 }
5579
5580 /* Return the address of the __dbx_link() function in the file
5581 refernced by ABFD by scanning its symbol table. Return 0 if
5582 the symbol was not found. */
5583
5584 static CORE_ADDR
5585 dbx_link_addr (bfd *abfd)
5586 {
5587 long storage_needed;
5588 asymbol **symbol_table;
5589 long number_of_symbols;
5590 long i;
5591
5592 storage_needed = bfd_get_symtab_upper_bound (abfd);
5593 if (storage_needed <= 0)
5594 return 0;
5595
5596 symbol_table = (asymbol **) xmalloc (storage_needed);
5597 make_cleanup (xfree, symbol_table);
5598
5599 number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
5600
5601 for (i = 0; i < number_of_symbols; i++)
5602 {
5603 asymbol *sym = symbol_table[i];
5604
5605 if ((sym->flags & BSF_GLOBAL)
5606 && sym->name != NULL && strcmp (sym->name, "__dbx_link") == 0)
5607 return (sym->value + sym->section->vma);
5608 }
5609
5610 /* Symbol not found, return NULL. */
5611 return 0;
5612 }
5613
5614 /* Search the symbol table of the file referenced by FD for a symbol
5615 named __dbx_link(). If found, then insert a breakpoint at this location,
5616 and return nonzero. Return zero otherwise. */
5617
5618 static int
5619 insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored)
5620 {
5621 bfd *abfd;
5622 long storage_needed;
5623 CORE_ADDR sym_addr;
5624
5625 abfd = bfd_fdopenr ("unamed", 0, fd);
5626 if (abfd == NULL)
5627 {
5628 warning (_("Failed to create a bfd: %s."), bfd_errmsg (bfd_get_error ()));
5629 return 0;
5630 }
5631
5632 if (!bfd_check_format (abfd, bfd_object))
5633 {
5634 /* Not the correct format, so we can not possibly find the dbx_link
5635 symbol in it. */
5636 bfd_close (abfd);
5637 return 0;
5638 }
5639
5640 sym_addr = dbx_link_addr (abfd);
5641 if (sym_addr != 0)
5642 {
5643 /* Insert the breakpoint. */
5644 dbx_link_bpt_addr = sym_addr;
5645 dbx_link_bpt = deprecated_insert_raw_breakpoint (sym_addr);
5646 if (dbx_link_bpt == NULL)
5647 {
5648 warning (_("Failed to insert dbx_link breakpoint."));
5649 bfd_close (abfd);
5650 return 0;
5651 }
5652 bfd_close (abfd);
5653 return 1;
5654 }
5655
5656 bfd_close (abfd);
5657 return 0;
5658 }
5659
5660 /* If the given memory region MAP contains a symbol named __dbx_link,
5661 insert a breakpoint at this location and return nonzero. Return
5662 zero otherwise. */
5663
5664 static int
5665 insert_dbx_link_bpt_in_region (struct prmap *map,
5666 int (*child_func) (),
5667 void *data)
5668 {
5669 procinfo *pi = (procinfo *) data;
5670
5671 /* We know the symbol we're looking for is in a text region, so
5672 only look for it if the region is a text one. */
5673 if (map->pr_mflags & MA_EXEC)
5674 return solib_mappings_callback (map, insert_dbx_link_bpt_in_file, pi);
5675
5676 return 0;
5677 }
5678
5679 /* Search all memory regions for a symbol named __dbx_link. If found,
5680 insert a breakpoint at its location, and return nonzero. Return zero
5681 otherwise. */
5682
5683 static int
5684 insert_dbx_link_breakpoint (procinfo *pi)
5685 {
5686 return iterate_over_mappings (pi, NULL, pi, insert_dbx_link_bpt_in_region);
5687 }
5688
5689 /*
5690 * Function: mappingflags
5691 *
5692 * Returns an ascii representation of a memory mapping's flags.
5693 */
5694
5695 static char *
5696 mappingflags (long flags)
5697 {
5698 static char asciiflags[8];
5699
5700 strcpy (asciiflags, "-------");
5701 #if defined (MA_PHYS)
5702 if (flags & MA_PHYS)
5703 asciiflags[0] = 'd';
5704 #endif
5705 if (flags & MA_STACK)
5706 asciiflags[1] = 's';
5707 if (flags & MA_BREAK)
5708 asciiflags[2] = 'b';
5709 if (flags & MA_SHARED)
5710 asciiflags[3] = 's';
5711 if (flags & MA_READ)
5712 asciiflags[4] = 'r';
5713 if (flags & MA_WRITE)
5714 asciiflags[5] = 'w';
5715 if (flags & MA_EXEC)
5716 asciiflags[6] = 'x';
5717 return (asciiflags);
5718 }
5719
5720 /*
5721 * Function: info_mappings_callback
5722 *
5723 * Callback function, does the actual work for 'info proc mappings'.
5724 */
5725
5726 static int
5727 info_mappings_callback (struct prmap *map, int (*ignore) (), void *unused)
5728 {
5729 unsigned int pr_off;
5730
5731 #ifdef PCAGENT /* Horrible hack: only defined on Solaris 2.6+ */
5732 pr_off = (unsigned int) map->pr_offset;
5733 #else
5734 pr_off = map->pr_off;
5735 #endif
5736
5737 if (gdbarch_addr_bit (current_gdbarch) == 32)
5738 printf_filtered ("\t%#10lx %#10lx %#10lx %#10x %7s\n",
5739 (unsigned long) map->pr_vaddr,
5740 (unsigned long) map->pr_vaddr + map->pr_size - 1,
5741 (unsigned long) map->pr_size,
5742 pr_off,
5743 mappingflags (map->pr_mflags));
5744 else
5745 printf_filtered (" %#18lx %#18lx %#10lx %#10x %7s\n",
5746 (unsigned long) map->pr_vaddr,
5747 (unsigned long) map->pr_vaddr + map->pr_size - 1,
5748 (unsigned long) map->pr_size,
5749 pr_off,
5750 mappingflags (map->pr_mflags));
5751
5752 return 0;
5753 }
5754
5755 /*
5756 * Function: info_proc_mappings
5757 *
5758 * Implement the "info proc mappings" subcommand.
5759 */
5760
5761 static void
5762 info_proc_mappings (procinfo *pi, int summary)
5763 {
5764 if (summary)
5765 return; /* No output for summary mode. */
5766
5767 printf_filtered (_("Mapped address spaces:\n\n"));
5768 if (gdbarch_ptr_bit (current_gdbarch) == 32)
5769 printf_filtered ("\t%10s %10s %10s %10s %7s\n",
5770 "Start Addr",
5771 " End Addr",
5772 " Size",
5773 " Offset",
5774 "Flags");
5775 else
5776 printf_filtered (" %18s %18s %10s %10s %7s\n",
5777 "Start Addr",
5778 " End Addr",
5779 " Size",
5780 " Offset",
5781 "Flags");
5782
5783 iterate_over_mappings (pi, NULL, NULL, info_mappings_callback);
5784 printf_filtered ("\n");
5785 }
5786
5787 /*
5788 * Function: info_proc_cmd
5789 *
5790 * Implement the "info proc" command.
5791 */
5792
5793 static void
5794 info_proc_cmd (char *args, int from_tty)
5795 {
5796 struct cleanup *old_chain;
5797 procinfo *process = NULL;
5798 procinfo *thread = NULL;
5799 char **argv = NULL;
5800 char *tmp = NULL;
5801 int pid = 0;
5802 int tid = 0;
5803 int mappings = 0;
5804
5805 old_chain = make_cleanup (null_cleanup, 0);
5806 if (args)
5807 {
5808 argv = gdb_buildargv (args);
5809 make_cleanup_freeargv (argv);
5810 }
5811 while (argv != NULL && *argv != NULL)
5812 {
5813 if (isdigit (argv[0][0]))
5814 {
5815 pid = strtoul (argv[0], &tmp, 10);
5816 if (*tmp == '/')
5817 tid = strtoul (++tmp, NULL, 10);
5818 }
5819 else if (argv[0][0] == '/')
5820 {
5821 tid = strtoul (argv[0] + 1, NULL, 10);
5822 }
5823 else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0)
5824 {
5825 mappings = 1;
5826 }
5827 else
5828 {
5829 /* [...] */
5830 }
5831 argv++;
5832 }
5833 if (pid == 0)
5834 pid = PIDGET (inferior_ptid);
5835 if (pid == 0)
5836 error (_("No current process: you must name one."));
5837 else
5838 {
5839 /* Have pid, will travel.
5840 First see if it's a process we're already debugging. */
5841 process = find_procinfo (pid, 0);
5842 if (process == NULL)
5843 {
5844 /* No. So open a procinfo for it, but
5845 remember to close it again when finished. */
5846 process = create_procinfo (pid, 0);
5847 make_cleanup (do_destroy_procinfo_cleanup, process);
5848 if (!open_procinfo_files (process, FD_CTL))
5849 proc_error (process, "info proc, open_procinfo_files", __LINE__);
5850 }
5851 }
5852 if (tid != 0)
5853 thread = create_procinfo (pid, tid);
5854
5855 if (process)
5856 {
5857 printf_filtered (_("process %d flags:\n"), process->pid);
5858 proc_prettyprint_flags (proc_flags (process), 1);
5859 if (proc_flags (process) & (PR_STOPPED | PR_ISTOP))
5860 proc_prettyprint_why (proc_why (process), proc_what (process), 1);
5861 if (proc_get_nthreads (process) > 1)
5862 printf_filtered ("Process has %d threads.\n",
5863 proc_get_nthreads (process));
5864 }
5865 if (thread)
5866 {
5867 printf_filtered (_("thread %d flags:\n"), thread->tid);
5868 proc_prettyprint_flags (proc_flags (thread), 1);
5869 if (proc_flags (thread) & (PR_STOPPED | PR_ISTOP))
5870 proc_prettyprint_why (proc_why (thread), proc_what (thread), 1);
5871 }
5872
5873 if (mappings)
5874 {
5875 info_proc_mappings (process, 0);
5876 }
5877
5878 do_cleanups (old_chain);
5879 }
5880
5881 /* Modify the status of the system call identified by SYSCALLNUM in
5882 the set of syscalls that are currently traced/debugged.
5883
5884 If ENTRY_OR_EXIT is set to PR_SYSENTRY, then the entry syscalls set
5885 will be updated. Otherwise, the exit syscalls set will be updated.
5886
5887 If MODE is FLAG_SET, then traces will be enabled. Otherwise, they
5888 will be disabled. */
5889
5890 static void
5891 proc_trace_syscalls_1 (procinfo *pi, int syscallnum, int entry_or_exit,
5892 int mode, int from_tty)
5893 {
5894 sysset_t *sysset;
5895
5896 if (entry_or_exit == PR_SYSENTRY)
5897 sysset = proc_get_traced_sysentry (pi, NULL);
5898 else
5899 sysset = proc_get_traced_sysexit (pi, NULL);
5900
5901 if (sysset == NULL)
5902 proc_error (pi, "proc-trace, get_traced_sysset", __LINE__);
5903
5904 if (mode == FLAG_SET)
5905 gdb_praddsysset (sysset, syscallnum);
5906 else
5907 gdb_prdelsysset (sysset, syscallnum);
5908
5909 if (entry_or_exit == PR_SYSENTRY)
5910 {
5911 if (!proc_set_traced_sysentry (pi, sysset))
5912 proc_error (pi, "proc-trace, set_traced_sysentry", __LINE__);
5913 }
5914 else
5915 {
5916 if (!proc_set_traced_sysexit (pi, sysset))
5917 proc_error (pi, "proc-trace, set_traced_sysexit", __LINE__);
5918 }
5919 }
5920
5921 static void
5922 proc_trace_syscalls (char *args, int from_tty, int entry_or_exit, int mode)
5923 {
5924 procinfo *pi;
5925
5926 if (PIDGET (inferior_ptid) <= 0)
5927 error (_("you must be debugging a process to use this command."));
5928
5929 if (args == NULL || args[0] == 0)
5930 error_no_arg (_("system call to trace"));
5931
5932 pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
5933 if (isdigit (args[0]))
5934 {
5935 const int syscallnum = atoi (args);
5936
5937 proc_trace_syscalls_1 (pi, syscallnum, entry_or_exit, mode, from_tty);
5938 }
5939 }
5940
5941 static void
5942 proc_trace_sysentry_cmd (char *args, int from_tty)
5943 {
5944 proc_trace_syscalls (args, from_tty, PR_SYSENTRY, FLAG_SET);
5945 }
5946
5947 static void
5948 proc_trace_sysexit_cmd (char *args, int from_tty)
5949 {
5950 proc_trace_syscalls (args, from_tty, PR_SYSEXIT, FLAG_SET);
5951 }
5952
5953 static void
5954 proc_untrace_sysentry_cmd (char *args, int from_tty)
5955 {
5956 proc_trace_syscalls (args, from_tty, PR_SYSENTRY, FLAG_RESET);
5957 }
5958
5959 static void
5960 proc_untrace_sysexit_cmd (char *args, int from_tty)
5961 {
5962 proc_trace_syscalls (args, from_tty, PR_SYSEXIT, FLAG_RESET);
5963 }
5964
5965
5966 void
5967 _initialize_procfs (void)
5968 {
5969 struct target_ops * t;
5970
5971 t = procfs_target ();
5972
5973 add_target (t);
5974
5975 add_info ("proc", info_proc_cmd, _("\
5976 Show /proc process information about any running process.\n\
5977 Specify process id, or use the program being debugged by default.\n\
5978 Specify keyword 'mappings' for detailed info on memory mappings."));
5979 add_com ("proc-trace-entry", no_class, proc_trace_sysentry_cmd,
5980 _("Give a trace of entries into the syscall."));
5981 add_com ("proc-trace-exit", no_class, proc_trace_sysexit_cmd,
5982 _("Give a trace of exits from the syscall."));
5983 add_com ("proc-untrace-entry", no_class, proc_untrace_sysentry_cmd,
5984 _("Cancel a trace of entries into the syscall."));
5985 add_com ("proc-untrace-exit", no_class, proc_untrace_sysexit_cmd,
5986 _("Cancel a trace of exits from the syscall."));
5987 }
5988
5989 /* =================== END, GDB "MODULE" =================== */
5990
5991
5992
5993 /* miscellaneous stubs: */
5994 /* The following satisfy a few random symbols mostly created by */
5995 /* the solaris threads implementation, which I will chase down */
5996 /* later. */
5997
5998 /*
5999 * Return a pid for which we guarantee
6000 * we will be able to find a 'live' procinfo.
6001 */
6002
6003 ptid_t
6004 procfs_first_available (void)
6005 {
6006 return pid_to_ptid (procinfo_list ? procinfo_list->pid : -1);
6007 }
6008
6009 static int
6010 find_signalled_thread (struct thread_info *info, void *data)
6011 {
6012 if (info->stop_signal != TARGET_SIGNAL_0
6013 && ptid_get_pid (info->ptid) == ptid_get_pid (inferior_ptid))
6014 return 1;
6015
6016 return 0;
6017 }
6018
6019 static enum target_signal
6020 find_stop_signal (void)
6021 {
6022 struct thread_info *info =
6023 iterate_over_threads (find_signalled_thread, NULL);
6024
6025 if (info)
6026 return info->stop_signal;
6027 else
6028 return TARGET_SIGNAL_0;
6029 }
6030
6031 /* =================== GCORE .NOTE "MODULE" =================== */
6032 #if defined (UNIXWARE) || defined (PIOCOPENLWP) || defined (PCAGENT)
6033 /* gcore only implemented on solaris and unixware (so far) */
6034
6035 static char *
6036 procfs_do_thread_registers (bfd *obfd, ptid_t ptid,
6037 char *note_data, int *note_size,
6038 enum target_signal stop_signal)
6039 {
6040 struct regcache *regcache = get_thread_regcache (ptid);
6041 gdb_gregset_t gregs;
6042 gdb_fpregset_t fpregs;
6043 unsigned long merged_pid;
6044
6045 merged_pid = TIDGET (ptid) << 16 | PIDGET (ptid);
6046
6047 fill_gregset (regcache, &gregs, -1);
6048 #if defined (UNIXWARE)
6049 note_data = (char *) elfcore_write_lwpstatus (obfd,
6050 note_data,
6051 note_size,
6052 merged_pid,
6053 stop_signal,
6054 &gregs);
6055 #else
6056 note_data = (char *) elfcore_write_prstatus (obfd,
6057 note_data,
6058 note_size,
6059 merged_pid,
6060 stop_signal,
6061 &gregs);
6062 #endif
6063 fill_fpregset (regcache, &fpregs, -1);
6064 note_data = (char *) elfcore_write_prfpreg (obfd,
6065 note_data,
6066 note_size,
6067 &fpregs,
6068 sizeof (fpregs));
6069 return note_data;
6070 }
6071
6072 struct procfs_corefile_thread_data {
6073 bfd *obfd;
6074 char *note_data;
6075 int *note_size;
6076 enum target_signal stop_signal;
6077 };
6078
6079 static int
6080 procfs_corefile_thread_callback (procinfo *pi, procinfo *thread, void *data)
6081 {
6082 struct procfs_corefile_thread_data *args = data;
6083
6084 if (pi != NULL)
6085 {
6086 ptid_t saved_ptid = inferior_ptid;
6087 inferior_ptid = MERGEPID (pi->pid, thread->tid);
6088 args->note_data = procfs_do_thread_registers (args->obfd, inferior_ptid,
6089 args->note_data,
6090 args->note_size,
6091 args->stop_signal);
6092 inferior_ptid = saved_ptid;
6093 }
6094 return 0;
6095 }
6096
6097 static char *
6098 procfs_make_note_section (bfd *obfd, int *note_size)
6099 {
6100 struct cleanup *old_chain;
6101 gdb_gregset_t gregs;
6102 gdb_fpregset_t fpregs;
6103 char fname[16] = {'\0'};
6104 char psargs[80] = {'\0'};
6105 procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0);
6106 char *note_data = NULL;
6107 char *inf_args;
6108 struct procfs_corefile_thread_data thread_args;
6109 gdb_byte *auxv;
6110 int auxv_len;
6111
6112 if (get_exec_file (0))
6113 {
6114 strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
6115 strncpy (psargs, get_exec_file (0),
6116 sizeof (psargs));
6117
6118 inf_args = get_inferior_args ();
6119 if (inf_args && *inf_args &&
6120 strlen (inf_args) < ((int) sizeof (psargs) - (int) strlen (psargs)))
6121 {
6122 strncat (psargs, " ",
6123 sizeof (psargs) - strlen (psargs));
6124 strncat (psargs, inf_args,
6125 sizeof (psargs) - strlen (psargs));
6126 }
6127 }
6128
6129 note_data = (char *) elfcore_write_prpsinfo (obfd,
6130 note_data,
6131 note_size,
6132 fname,
6133 psargs);
6134
6135 #ifdef UNIXWARE
6136 fill_gregset (get_current_regcache (), &gregs, -1);
6137 note_data = elfcore_write_pstatus (obfd, note_data, note_size,
6138 PIDGET (inferior_ptid),
6139 stop_signal, &gregs);
6140 #endif
6141
6142 thread_args.obfd = obfd;
6143 thread_args.note_data = note_data;
6144 thread_args.note_size = note_size;
6145 thread_args.stop_signal = find_stop_signal ();
6146 proc_iterate_over_threads (pi, procfs_corefile_thread_callback, &thread_args);
6147
6148 /* There should be always at least one thread. */
6149 gdb_assert (thread_args.note_data != note_data);
6150 note_data = thread_args.note_data;
6151
6152 auxv_len = target_read_alloc (&current_target, TARGET_OBJECT_AUXV,
6153 NULL, &auxv);
6154 if (auxv_len > 0)
6155 {
6156 note_data = elfcore_write_note (obfd, note_data, note_size,
6157 "CORE", NT_AUXV, auxv, auxv_len);
6158 xfree (auxv);
6159 }
6160
6161 make_cleanup (xfree, note_data);
6162 return note_data;
6163 }
6164 #else /* !(Solaris or Unixware) */
6165 static char *
6166 procfs_make_note_section (bfd *obfd, int *note_size)
6167 {
6168 error (_("gcore not implemented for this host."));
6169 return NULL; /* lint */
6170 }
6171 #endif /* Solaris or Unixware */
6172 /* =================== END GCORE .NOTE "MODULE" =================== */
This page took 0.255538 seconds and 5 git commands to generate.