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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [procfs.c] - Blame information for rev 1774

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

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

powered by: WebSVN 2.1.0

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