OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [gdb/] [procfs.c] - Blame information for rev 330

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* 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" =================== */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.