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