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

Subversion Repositories openrisc_me

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

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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