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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [proc-api.c] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
/* Machine independent support for SVR4 /proc (process file system) for GDB.
/* Machine independent support for SVR4 /proc (process file system) for GDB.
   Copyright 1999 Free Software Foundation, Inc.
   Copyright 1999 Free Software Foundation, Inc.
   Written by Michael Snyder at Cygnus Solutions.
   Written by Michael Snyder at Cygnus Solutions.
   Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
   Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
 
 
This file is part of GDB.
This file is part of GDB.
 
 
This program is free software; you can redistribute it and/or modify
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 
/*
/*
 * Pretty-print trace of api calls to the /proc api
 * Pretty-print trace of api calls to the /proc api
 * (ioctl or read/write calls).
 * (ioctl or read/write calls).
 *
 *
 */
 */
 
 
#include "defs.h"
#include "defs.h"
#include "gdbcmd.h"
#include "gdbcmd.h"
 
 
#if defined (NEW_PROC_API)
#if defined (NEW_PROC_API)
#define _STRUCTURED_PROC 1
#define _STRUCTURED_PROC 1
#endif
#endif
 
 
#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/procfs.h>
#include <sys/procfs.h>
#include <sys/proc.h>   /* for struct proc */
#include <sys/proc.h>   /* for struct proc */
#ifdef HAVE_SYS_USER_H
#ifdef HAVE_SYS_USER_H
#include <sys/user.h>   /* for struct user */
#include <sys/user.h>   /* for struct user */
#endif
#endif
#include <fcntl.h>      /* for O_RDWR etc. */
#include <fcntl.h>      /* for O_RDWR etc. */
#include <sys/wait.h>
#include <sys/wait.h>
 
 
#include "proc-utils.h"
#include "proc-utils.h"
 
 
/*  Much of the information used in the /proc interface, particularly for
/*  Much of the information used in the /proc interface, particularly for
    printing status information, is kept as tables of structures of the
    printing status information, is kept as tables of structures of the
    following form.  These tables can be used to map numeric values to
    following form.  These tables can be used to map numeric values to
    their symbolic names and to a string that describes their specific use. */
    their symbolic names and to a string that describes their specific use. */
 
 
struct trans {
struct trans {
  long value;                   /* The numeric value */
  long value;                   /* The numeric value */
  char *name;                   /* The equivalent symbolic value */
  char *name;                   /* The equivalent symbolic value */
  char *desc;                   /* Short description of value */
  char *desc;                   /* Short description of value */
};
};
 
 
static int   procfs_trace    = 1;
static int   procfs_trace    = 1;
/*static int   info_verbose    = 1;*/   /* kludge */
/*static int   info_verbose    = 1;*/   /* kludge */
static FILE *procfs_file     = NULL;
static FILE *procfs_file     = NULL;
static char *procfs_filename = "procfs_trace";
static char *procfs_filename = "procfs_trace";
 
 
static void
static void
set_procfs_trace_cmd (args, from_tty, c)
set_procfs_trace_cmd (args, from_tty, c)
     char *args;
     char *args;
     int from_tty;
     int from_tty;
     struct cmd_list_element *c;
     struct cmd_list_element *c;
{
{
#if 0   /* not sure what I might actually need to do here, if anything */
#if 0   /* not sure what I might actually need to do here, if anything */
  if (procfs_file)
  if (procfs_file)
    fflush (procfs_file);
    fflush (procfs_file);
#endif
#endif
}
}
 
 
static void
static void
set_procfs_file_cmd (args, from_tty, c)
set_procfs_file_cmd (args, from_tty, c)
     char *args;
     char *args;
     int from_tty;
     int from_tty;
     struct cmd_list_element *c;
     struct cmd_list_element *c;
{
{
  /* Just changed the filename for procfs tracing.
  /* Just changed the filename for procfs tracing.
     If a file was already open, close it.  */
     If a file was already open, close it.  */
  if (procfs_file)
  if (procfs_file)
    fclose (procfs_file);
    fclose (procfs_file);
  procfs_file = NULL;
  procfs_file = NULL;
}
}
 
 
 
 
#ifndef NEW_PROC_API
#ifndef NEW_PROC_API
 
 
static struct trans ioctl_table[] = {
static struct trans ioctl_table[] = {
#ifdef PIOCACINFO                       /* irix */
#ifdef PIOCACINFO                       /* irix */
  { PIOCACINFO,    "PIOCACINFO",   "get process account info" },
  { PIOCACINFO,    "PIOCACINFO",   "get process account info" },
#endif
#endif
  { PIOCACTION,    "PIOCACTION",   "get signal action structs" },
  { PIOCACTION,    "PIOCACTION",   "get signal action structs" },
#ifdef PIOCARGUMENTS                    /* osf */
#ifdef PIOCARGUMENTS                    /* osf */
  { PIOCARGUMENTS, "PIOCARGUMENTS", "command line args" },
  { PIOCARGUMENTS, "PIOCARGUMENTS", "command line args" },
#endif
#endif
#ifdef PIOCAUXV                         /* solaris aux vectors */
#ifdef PIOCAUXV                         /* solaris aux vectors */
  { PIOCAUXV,      "PIOCAUXV",     "get aux vector" },
  { PIOCAUXV,      "PIOCAUXV",     "get aux vector" },
  { PIOCNAUXV,     "PIOCNAUXV",    "get number of aux vector entries" },
  { PIOCNAUXV,     "PIOCNAUXV",    "get number of aux vector entries" },
#endif /* AUXV */
#endif /* AUXV */
  { PIOCCFAULT,    "PIOCCFAULT",   "clear current fault" },
  { PIOCCFAULT,    "PIOCCFAULT",   "clear current fault" },
  { PIOCCRED,      "PIOCCRED",     "get process credentials" },
  { PIOCCRED,      "PIOCCRED",     "get process credentials" },
#ifdef PIOCENEVCTRS                     /* irix event counters */
#ifdef PIOCENEVCTRS                     /* irix event counters */
  { PIOCENEVCTRS,    "PIOCENEVCTRS",    "acquire and start event counters" },
  { PIOCENEVCTRS,    "PIOCENEVCTRS",    "acquire and start event counters" },
  { PIOCGETEVCTRL,   "PIOCGETEVCTRL",   "get control info of event counters" },
  { PIOCGETEVCTRL,   "PIOCGETEVCTRL",   "get control info of event counters" },
  { PIOCGETEVCTRS,   "PIOCGETEVCTRS",   "dump event counters" },
  { PIOCGETEVCTRS,   "PIOCGETEVCTRS",   "dump event counters" },
  { PIOCGETPREVCTRS, "PIOCGETPREVCTRS", "dump event counters & prusage info" },
  { PIOCGETPREVCTRS, "PIOCGETPREVCTRS", "dump event counters & prusage info" },
  { PIOCRELEVCTRS,   "PIOCRELEVCTRS",   "release/stop event counters" },
  { PIOCRELEVCTRS,   "PIOCRELEVCTRS",   "release/stop event counters" },
  { PIOCSETEVCTRL,   "PIOCSETEVCTRL",   "set control info of event counters" },
  { PIOCSETEVCTRL,   "PIOCSETEVCTRL",   "set control info of event counters" },
  { PIOCGETPTIMER,   "PIOCGETPTIMER",   "get process timers" },
  { PIOCGETPTIMER,   "PIOCGETPTIMER",   "get process timers" },
#endif  /* irix event counters */
#endif  /* irix event counters */
  { PIOCGENTRY,    "PIOCGENTRY",   "get traced syscall entry set" },
  { PIOCGENTRY,    "PIOCGENTRY",   "get traced syscall entry set" },
#if defined (PIOCGETPR)
#if defined (PIOCGETPR)
  { PIOCGETPR,     "PIOCGETPR",    "read struct proc" },
  { PIOCGETPR,     "PIOCGETPR",    "read struct proc" },
#endif
#endif
#if defined (PIOCGETU)
#if defined (PIOCGETU)
  { PIOCGETU,      "PIOCGETU",     "read user area" },
  { PIOCGETU,      "PIOCGETU",     "read user area" },
#endif
#endif
#if defined (PIOCGETUTK) && (defined(KERNEL) || defined(SHOW_UTT)) /* osf */
#if defined (PIOCGETUTK) && (defined(KERNEL) || defined(SHOW_UTT)) /* osf */
  { PIOCGETUTK,  "PIOCGETUTK", "get the utask struct" },
  { PIOCGETUTK,  "PIOCGETUTK", "get the utask struct" },
#endif
#endif
  { PIOCGEXIT,     "PIOCGEXIT",    "get traced syscall exit  set" },
  { PIOCGEXIT,     "PIOCGEXIT",    "get traced syscall exit  set" },
  { PIOCGFAULT,    "PIOCGFAULT",   "get traced fault set" },
  { PIOCGFAULT,    "PIOCGFAULT",   "get traced fault set" },
#ifdef PIOCGFPCR                        /* osf */
#ifdef PIOCGFPCR                        /* osf */
  { PIOCGFPCR,     "PIOCGFPCR",    "get FP control register" },
  { PIOCGFPCR,     "PIOCGFPCR",    "get FP control register" },
  { PIOCSFPCR,     "PIOCSFPCR",    "set FP conrtol register" },
  { PIOCSFPCR,     "PIOCSFPCR",    "set FP conrtol register" },
#endif
#endif
  { PIOCGFPREG,    "PIOCGFPREG",   "get floating point registers" },
  { PIOCGFPREG,    "PIOCGFPREG",   "get floating point registers" },
  { PIOCGHOLD,     "PIOCGHOLD",    "get held signal set" },
  { PIOCGHOLD,     "PIOCGHOLD",    "get held signal set" },
  { PIOCGREG,      "PIOCGREG",     "get general registers" },
  { PIOCGREG,      "PIOCGREG",     "get general registers" },
  { PIOCGROUPS,    "PIOCGROUPS",   "get supplementary groups" },
  { PIOCGROUPS,    "PIOCGROUPS",   "get supplementary groups" },
#ifdef PIOCGSPCACT                      /* osf */
#ifdef PIOCGSPCACT                      /* osf */
  { PIOCGSPCACT,   "PIOCGSPCACT",  "get special action" },
  { PIOCGSPCACT,   "PIOCGSPCACT",  "get special action" },
  { PIOCSSPCACT,   "PIOCSSPCACT",  "set special action" },
  { PIOCSSPCACT,   "PIOCSSPCACT",  "set special action" },
#endif
#endif
  { PIOCGTRACE,    "PIOCGTRACE",   "get traced signal set" },
  { PIOCGTRACE,    "PIOCGTRACE",   "get traced signal set" },
#ifdef PIOCGWATCH                       /* irix watchpoints */
#ifdef PIOCGWATCH                       /* irix watchpoints */
  { PIOCGWATCH,    "PIOCGWATCH",   "get watchpoint" },
  { PIOCGWATCH,    "PIOCGWATCH",   "get watchpoint" },
  { PIOCSWATCH,    "PIOCSWATCH",   "set watchpoint" },
  { PIOCSWATCH,    "PIOCSWATCH",   "set watchpoint" },
  { PIOCNWATCH,    "PIOCNWATCH",   "get number of watchpoints" },
  { PIOCNWATCH,    "PIOCNWATCH",   "get number of watchpoints" },
#endif  /* irix watchpoints */
#endif  /* irix watchpoints */
#ifdef PIOCGWIN                         /* solaris sparc */
#ifdef PIOCGWIN                         /* solaris sparc */
  { PIOCGWIN,      "PIOCGWIN",     "get gwindows_t" },
  { PIOCGWIN,      "PIOCGWIN",     "get gwindows_t" },
#endif
#endif
#ifdef PIOCGXREG                        /* solaris sparc extra regs */
#ifdef PIOCGXREG                        /* solaris sparc extra regs */
  { PIOCGXREGSIZE, "PIOCXREGSIZE", "get extra register state size" },
  { PIOCGXREGSIZE, "PIOCXREGSIZE", "get extra register state size" },
  { PIOCGXREG,     "PIOCGXREG",    "get extra register state" },
  { PIOCGXREG,     "PIOCGXREG",    "get extra register state" },
  { PIOCSXREG,     "PIOCSXREG",    "set extra register state" },
  { PIOCSXREG,     "PIOCSXREG",    "set extra register state" },
#endif /* XREG */
#endif /* XREG */
  { PIOCKILL,      "PIOCKILL",     "send signal" },
  { PIOCKILL,      "PIOCKILL",     "send signal" },
#ifdef PIOCLDT                          /* solaris i386 */
#ifdef PIOCLDT                          /* solaris i386 */
  { PIOCLDT,       "PIOCLDT",      "get LDT" },
  { PIOCLDT,       "PIOCLDT",      "get LDT" },
  { PIOCNLDT,      "PIOCNLDT",     "get number of LDT entries" },
  { PIOCNLDT,      "PIOCNLDT",     "get number of LDT entries" },
#endif
#endif
#ifdef PIOCLSTATUS                      /* solaris and unixware */
#ifdef PIOCLSTATUS                      /* solaris and unixware */
  { PIOCLSTATUS,   "PIOCLSTATUS",  "get status of all lwps" },
  { PIOCLSTATUS,   "PIOCLSTATUS",  "get status of all lwps" },
  { PIOCLUSAGE,    "PIOCLUSAGE",   "get resource usage of all lwps" },
  { PIOCLUSAGE,    "PIOCLUSAGE",   "get resource usage of all lwps" },
  { PIOCOPENLWP,   "PIOCOPENLWP",  "get lwp file descriptor" },
  { PIOCOPENLWP,   "PIOCOPENLWP",  "get lwp file descriptor" },
  { PIOCLWPIDS,    "PIOCLWPIDS",   "get lwp identifiers" },
  { PIOCLWPIDS,    "PIOCLWPIDS",   "get lwp identifiers" },
#endif /* LWP */
#endif /* LWP */
  { PIOCMAP,       "PIOCMAP",      "get memory map information" },
  { PIOCMAP,       "PIOCMAP",      "get memory map information" },
  { PIOCMAXSIG,    "PIOCMAXSIG",   "get max signal number" },
  { PIOCMAXSIG,    "PIOCMAXSIG",   "get max signal number" },
  { PIOCNICE,      "PIOCNICE",     "set nice priority" },
  { PIOCNICE,      "PIOCNICE",     "set nice priority" },
  { PIOCNMAP,      "PIOCNMAP",     "get number of memory mappings" },
  { PIOCNMAP,      "PIOCNMAP",     "get number of memory mappings" },
  { PIOCOPENM,     "PIOCOPENM",    "open mapped object for reading" },
  { PIOCOPENM,     "PIOCOPENM",    "open mapped object for reading" },
#ifdef PIOCOPENMOBS                     /* osf */
#ifdef PIOCOPENMOBS                     /* osf */
  { PIOCOPENMOBS,  "PIOCOPENMOBS", "open mapped object" },
  { PIOCOPENMOBS,  "PIOCOPENMOBS", "open mapped object" },
#endif
#endif
#ifdef PIOCOPENPD       /* solaris */
#ifdef PIOCOPENPD       /* solaris */
  { PIOCOPENPD,    "PIOCOPENPD",   "get page data file descriptor" },
  { PIOCOPENPD,    "PIOCOPENPD",   "get page data file descriptor" },
#endif
#endif
  { PIOCPSINFO,    "PIOCPSINFO",   "get ps(1) information" },
  { PIOCPSINFO,    "PIOCPSINFO",   "get ps(1) information" },
  { PIOCRESET,     "PIOCRESET",    "reset process flags" },
  { PIOCRESET,     "PIOCRESET",    "reset process flags" },
  { PIOCRFORK,     "PIOCRFORK",    "reset inherit-on-fork flag" },
  { PIOCRFORK,     "PIOCRFORK",    "reset inherit-on-fork flag" },
  { PIOCRRLC,      "PIOCRRLC",     "reset run-on-last-close flag" },
  { PIOCRRLC,      "PIOCRRLC",     "reset run-on-last-close flag" },
  { PIOCRUN,       "PIOCRUN",      "make process runnable" },
  { PIOCRUN,       "PIOCRUN",      "make process runnable" },
#ifdef PIOCSAVECCNTRS                   /* irix */
#ifdef PIOCSAVECCNTRS                   /* irix */
  { PIOCSAVECCNTRS, "PIOCSAVECCNTRS", "parent gets child cntrs" },
  { PIOCSAVECCNTRS, "PIOCSAVECCNTRS", "parent gets child cntrs" },
#endif
#endif
  { PIOCSENTRY,    "PIOCSENTRY",   "set traced syscall entry set" },
  { PIOCSENTRY,    "PIOCSENTRY",   "set traced syscall entry set" },
  { PIOCSET,       "PIOCSET",      "set process flags" },
  { PIOCSET,       "PIOCSET",      "set process flags" },
  { PIOCSEXIT,     "PIOCSEXIT",    "set traced syscall exit  set" },
  { PIOCSEXIT,     "PIOCSEXIT",    "set traced syscall exit  set" },
  { PIOCSFAULT,    "PIOCSFAULT",   "set traced fault set" },
  { PIOCSFAULT,    "PIOCSFAULT",   "set traced fault set" },
  { PIOCSFORK,     "PIOCSFORK",    "set inherit-on-fork flag" },
  { PIOCSFORK,     "PIOCSFORK",    "set inherit-on-fork flag" },
  { PIOCSFPREG,    "PIOCSFPREG",   "set floating point registers" },
  { PIOCSFPREG,    "PIOCSFPREG",   "set floating point registers" },
  { PIOCSHOLD,     "PIOCSHOLD",    "set held signal set" },
  { PIOCSHOLD,     "PIOCSHOLD",    "set held signal set" },
  { PIOCSREG,      "PIOCSREG",     "set general registers" },
  { PIOCSREG,      "PIOCSREG",     "set general registers" },
  { PIOCSRLC,      "PIOCSRLC",     "set run-on-last-close flag" },
  { PIOCSRLC,      "PIOCSRLC",     "set run-on-last-close flag" },
  { PIOCSSIG,      "PIOCSSIG",     "set current signal" },
  { PIOCSSIG,      "PIOCSSIG",     "set current signal" },
  { PIOCSTATUS,    "PIOCSTATUS",   "get process status" },
  { PIOCSTATUS,    "PIOCSTATUS",   "get process status" },
  { PIOCSTOP,      "PIOCSTOP",     "post stop request" },
  { PIOCSTOP,      "PIOCSTOP",     "post stop request" },
  { PIOCSTRACE,    "PIOCSTRACE",   "set traced signal set" },
  { PIOCSTRACE,    "PIOCSTRACE",   "set traced signal set" },
  { PIOCUNKILL,    "PIOCUNKILL",   "delete a signal" },
  { PIOCUNKILL,    "PIOCUNKILL",   "delete a signal" },
#ifdef PIOCUSAGE        /* solaris */
#ifdef PIOCUSAGE        /* solaris */
  { PIOCUSAGE,     "PIOCUSAGE",    "get resource usage" },
  { PIOCUSAGE,     "PIOCUSAGE",    "get resource usage" },
#endif
#endif
  { PIOCWSTOP,     "PIOCWSTOP",    "wait for process to stop" },
  { PIOCWSTOP,     "PIOCWSTOP",    "wait for process to stop" },
 
 
#ifdef PIOCNTHR                         /* osf threads */
#ifdef PIOCNTHR                         /* osf threads */
  { PIOCNTHR,      "PIOCNTHR",     "get thread count" },
  { PIOCNTHR,      "PIOCNTHR",     "get thread count" },
  { PIOCRTINH,     "PIOCRTINH",    "reset inherit-on-thread-creation" },
  { PIOCRTINH,     "PIOCRTINH",    "reset inherit-on-thread-creation" },
  { PIOCSTINH,     "PIOCSTINH",    "set   inherit-on-thread-creation" },
  { PIOCSTINH,     "PIOCSTINH",    "set   inherit-on-thread-creation" },
  { PIOCTLIST,     "PIOCTLIST",    "get thread ids" },
  { PIOCTLIST,     "PIOCTLIST",    "get thread ids" },
  { PIOCXPTH,      "PIOCXPTH",     "translate port to thread handle" },
  { PIOCXPTH,      "PIOCXPTH",     "translate port to thread handle" },
  { PIOCTRUN,      "PIOCTRUN",     "make thread runnable" },
  { PIOCTRUN,      "PIOCTRUN",     "make thread runnable" },
  { PIOCTSTATUS,   "PIOCTSTATUS",  "get thread status" },
  { PIOCTSTATUS,   "PIOCTSTATUS",  "get thread status" },
  { PIOCTSTOP,     "PIOCTSTOP",    "stop a thread" },
  { PIOCTSTOP,     "PIOCTSTOP",    "stop a thread" },
  /* ... TGTRACE TSTRACE TSSIG TKILL TUNKILL TCFAULT TGFAULT TSFAULT
  /* ... TGTRACE TSTRACE TSSIG TKILL TUNKILL TCFAULT TGFAULT TSFAULT
     TGFPREG TSFPREG TGREG TSREG TACTION TTERM TABRUN TGENTRY TSENTRY
     TGFPREG TSFPREG TGREG TSREG TACTION TTERM TABRUN TGENTRY TSENTRY
     TGEXIT TSEXIT TSHOLD ... thread functions */
     TGEXIT TSEXIT TSHOLD ... thread functions */
#endif /* osf threads */
#endif /* osf threads */
  { -1,            NULL,           NULL }
  { -1,            NULL,           NULL }
};
};
 
 
int
int
ioctl_with_trace (fd, opcode, ptr, file, line)
ioctl_with_trace (fd, opcode, ptr, file, line)
     int  fd;
     int  fd;
     long opcode;
     long opcode;
     void *ptr;
     void *ptr;
     char *file;
     char *file;
     int  line;
     int  line;
{
{
  int i, ret, arg1;
  int i, ret, arg1;
 
 
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      for (i = 0; ioctl_table[i].name != NULL; i++)
      for (i = 0; ioctl_table[i].name != NULL; i++)
        if (ioctl_table[i].value == opcode)
        if (ioctl_table[i].value == opcode)
          break;
          break;
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      switch (opcode) {
      switch (opcode) {
      case PIOCSET:
      case PIOCSET:
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSET,   %s) %s\n",
                 "ioctl (PIOCSET,   %s) %s\n",
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_RLC   ? "PR_RLC"   :
                 arg1 == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? ioctl_table[i].desc : "");
                 info_verbose ? ioctl_table[i].desc : "");
        break;
        break;
      case PIOCRESET:
      case PIOCRESET:
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCRESET, %s) %s\n",
                 "ioctl (PIOCRESET, %s) %s\n",
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_RLC   ? "PR_RLC"   :
                 arg1 == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? ioctl_table[i].desc : "");
                 info_verbose ? ioctl_table[i].desc : "");
        break;
        break;
      case PIOCSTRACE:
      case PIOCSTRACE:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSTRACE) ");
                 "ioctl (PIOCSTRACE) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) ptr, 0);
                                     (sigset_t *) ptr, 0);
        break;
        break;
      case PIOCSFAULT:
      case PIOCSFAULT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSFAULT ? "PIOCSFAULT" : "PIOCGFAULT");
                 opcode == PIOCSFAULT ? "PIOCSFAULT" : "PIOCGFAULT");
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
                                    (fltset_t *) ptr, 0);
                                    (fltset_t *) ptr, 0);
        break;
        break;
      case PIOCSENTRY:
      case PIOCSENTRY:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSENTRY ? "PIOCSENTRY" : "PIOCGENTRY");
                 opcode == PIOCSENTRY ? "PIOCSENTRY" : "PIOCGENTRY");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) ptr, 0);
                                    (sysset_t *) ptr, 0);
        break;
        break;
      case PIOCSEXIT:
      case PIOCSEXIT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSEXIT ? "PIOCSEXIT" : "PIOCGEXIT");
                 opcode == PIOCSEXIT ? "PIOCSEXIT" : "PIOCGEXIT");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) ptr, 0);
                                    (sysset_t *) ptr, 0);
        break;
        break;
      case PIOCSHOLD:
      case PIOCSHOLD:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSHOLD ? "PIOCSHOLD" : "PIOCGHOLD");
                 opcode == PIOCSHOLD ? "PIOCSHOLD" : "PIOCGHOLD");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) ptr, 0);
                                     (sigset_t *) ptr, 0);
        break;
        break;
      case PIOCSSIG:
      case PIOCSSIG:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSSIG) ");
                 "ioctl (PIOCSSIG) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  ptr ? ((siginfo_t *) ptr)->si_signo : 0,
                                  ptr ? ((siginfo_t *) ptr)->si_signo : 0,
                                  0);
                                  0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PIOCRUN:
      case PIOCRUN:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCRUN) ");
                 "ioctl (PIOCRUN) ");
 
 
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        if (arg1 & PRCSIG)
        if (arg1 & PRCSIG)
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
        if (arg1 & PRCFAULT)
        if (arg1 & PRCFAULT)
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
        if (arg1 & PRSTRACE)
        if (arg1 & PRSTRACE)
          fprintf (procfs_file ? procfs_file : stdout, "setTrace ");
          fprintf (procfs_file ? procfs_file : stdout, "setTrace ");
        if (arg1 & PRSHOLD)
        if (arg1 & PRSHOLD)
          fprintf (procfs_file ? procfs_file : stdout, "setHold ");
          fprintf (procfs_file ? procfs_file : stdout, "setHold ");
        if (arg1 & PRSFAULT)
        if (arg1 & PRSFAULT)
          fprintf (procfs_file ? procfs_file : stdout, "setFlt ");
          fprintf (procfs_file ? procfs_file : stdout, "setFlt ");
        if (arg1 & PRSVADDR)
        if (arg1 & PRSVADDR)
          fprintf (procfs_file ? procfs_file : stdout, "setVaddr ");
          fprintf (procfs_file ? procfs_file : stdout, "setVaddr ");
        if (arg1 & PRSTEP)
        if (arg1 & PRSTEP)
          fprintf (procfs_file ? procfs_file : stdout, "step ");
          fprintf (procfs_file ? procfs_file : stdout, "step ");
        if (arg1 & PRSABORT)
        if (arg1 & PRSABORT)
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
        if (arg1 & PRSTOP)
        if (arg1 & PRSTOP)
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
 
 
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PIOCKILL:
      case PIOCKILL:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCKILL) ");
                 "ioctl (PIOCKILL) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  ptr ? *(long *) ptr : 0, 0);
                                  ptr ? *(long *) ptr : 0, 0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
#ifdef PIOCSSPCACT
#ifdef PIOCSSPCACT
      case PIOCSSPCACT:
      case PIOCSSPCACT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSSPCACT) ");
                 "ioctl (PIOCSSPCACT) ");
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        if (arg1 & PRFS_STOPFORK)
        if (arg1 & PRFS_STOPFORK)
          fprintf (procfs_file ? procfs_file : stdout, "stopFork ");
          fprintf (procfs_file ? procfs_file : stdout, "stopFork ");
        if (arg1 & PRFS_STOPEXEC)
        if (arg1 & PRFS_STOPEXEC)
          fprintf (procfs_file ? procfs_file : stdout, "stopExec ");
          fprintf (procfs_file ? procfs_file : stdout, "stopExec ");
        if (arg1 & PRFS_STOPTERM)
        if (arg1 & PRFS_STOPTERM)
          fprintf (procfs_file ? procfs_file : stdout, "stopTerm ");
          fprintf (procfs_file ? procfs_file : stdout, "stopTerm ");
        if (arg1 & PRFS_STOPTCR)
        if (arg1 & PRFS_STOPTCR)
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadCreate ");
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadCreate ");
        if (arg1 & PRFS_STOPTTERM)
        if (arg1 & PRFS_STOPTTERM)
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadTerm ");
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadTerm ");
        if (arg1 & PRFS_KOLC)
        if (arg1 & PRFS_KOLC)
          fprintf (procfs_file ? procfs_file : stdout, "killOnLastClose ");
          fprintf (procfs_file ? procfs_file : stdout, "killOnLastClose ");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
#endif /* PIOCSSPCACT */
#endif /* PIOCSSPCACT */
      default:
      default:
        if (ioctl_table[i].name)
        if (ioctl_table[i].name)
          fprintf (procfs_file ? procfs_file : stdout,
          fprintf (procfs_file ? procfs_file : stdout,
                   "ioctl (%s) %s\n",
                   "ioctl (%s) %s\n",
                   ioctl_table[i].name,
                   ioctl_table[i].name,
                   info_verbose ? ioctl_table[i].desc : "");
                   info_verbose ? ioctl_table[i].desc : "");
        else
        else
          fprintf (procfs_file ? procfs_file : stdout,
          fprintf (procfs_file ? procfs_file : stdout,
                   "ioctl (<unknown %ld (0x%lx)) \n", opcode, opcode);
                   "ioctl (<unknown %ld (0x%lx)) \n", opcode, opcode);
        break;
        break;
      }
      }
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  ret = ioctl (fd, opcode, ptr);
  ret = ioctl (fd, opcode, ptr);
  if (procfs_trace && ret < 0)
  if (procfs_trace && ret < 0)
    {
    {
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "[ioctl (%s) FAILED!]\n",
               "[ioctl (%s) FAILED!]\n",
               ioctl_table[i].name != NULL ?
               ioctl_table[i].name != NULL ?
               ioctl_table[i].name : "<unknown>");
               ioctl_table[i].name : "<unknown>");
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
#else   /* NEW_PROC_API */
#else   /* NEW_PROC_API */
 
 
static struct trans rw_table[] = {
static struct trans rw_table[] = {
#ifdef PCAGENT                  /* solaris */
#ifdef PCAGENT                  /* solaris */
  { PCAGENT,  "PCAGENT",  "create agent lwp with regs from argument" },
  { PCAGENT,  "PCAGENT",  "create agent lwp with regs from argument" },
#endif
#endif
  { PCCFAULT, "PCCFAULT", "clear current fault" },
  { PCCFAULT, "PCCFAULT", "clear current fault" },
#ifdef PCCSIG                   /* solaris */
#ifdef PCCSIG                   /* solaris */
  { PCCSIG,   "PCCSIG",   "clear current signal" },
  { PCCSIG,   "PCCSIG",   "clear current signal" },
#endif
#endif
  { PCDSTOP,  "PCDSTOP",  "post stop request" },
  { PCDSTOP,  "PCDSTOP",  "post stop request" },
  { PCKILL,   "PCKILL",   "post a signal" },
  { PCKILL,   "PCKILL",   "post a signal" },
  { PCNICE,   "PCNICE",   "set nice priority" },
  { PCNICE,   "PCNICE",   "set nice priority" },
#ifdef PCREAD                   /* solaris */
#ifdef PCREAD                   /* solaris */
  { PCREAD,   "PCREAD",   "read from the address space" },
  { PCREAD,   "PCREAD",   "read from the address space" },
  { PCWRITE,  "PCWRITE",  "write to the address space" },
  { PCWRITE,  "PCWRITE",  "write to the address space" },
#endif
#endif
#ifdef PCRESET                  /* unixware */
#ifdef PCRESET                  /* unixware */
  { PCRESET,  "PCRESET",  "unset modes" },
  { PCRESET,  "PCRESET",  "unset modes" },
#endif
#endif
  { PCRUN,    "PCRUN",    "make process/lwp runnable" },
  { PCRUN,    "PCRUN",    "make process/lwp runnable" },
#ifdef PCSASRS                  /* solaris 2.7 only */
#ifdef PCSASRS                  /* solaris 2.7 only */
  { PCSASRS,  "PCSASRS",  "set ancillary state registers" },
  { PCSASRS,  "PCSASRS",  "set ancillary state registers" },
#endif
#endif
#ifdef PCSCRED                  /* solaris */
#ifdef PCSCRED                  /* solaris */
  { PCSCRED,  "PCSCRED",  "set process credentials" },
  { PCSCRED,  "PCSCRED",  "set process credentials" },
#endif
#endif
  { PCSENTRY, "PCSENTRY", "set traced syscall entry set" },
  { PCSENTRY, "PCSENTRY", "set traced syscall entry set" },
  { PCSET,    "PCSET",    "set modes" },
  { PCSET,    "PCSET",    "set modes" },
  { PCSEXIT,  "PCSEXIT",  "set traced syscall exit  set" },
  { PCSEXIT,  "PCSEXIT",  "set traced syscall exit  set" },
  { PCSFAULT, "PCSFAULT", "set traced fault set" },
  { PCSFAULT, "PCSFAULT", "set traced fault set" },
  { PCSFPREG, "PCSFPREG", "set floating point registers" },
  { PCSFPREG, "PCSFPREG", "set floating point registers" },
  { PCSHOLD,  "PCSHOLD",  "set signal mask" },
  { PCSHOLD,  "PCSHOLD",  "set signal mask" },
  { PCSREG,   "PCSREG",   "set general registers" },
  { PCSREG,   "PCSREG",   "set general registers" },
  { PCSSIG,   "PCSSIG",   "set current signal" },
  { PCSSIG,   "PCSSIG",   "set current signal" },
  { PCSTOP,   "PCSTOP",   "post stop request and wait" },
  { PCSTOP,   "PCSTOP",   "post stop request and wait" },
  { PCSTRACE, "PCSTRACE", "set traced signal set" },
  { PCSTRACE, "PCSTRACE", "set traced signal set" },
#ifdef PCSVADDR                 /* solaris */
#ifdef PCSVADDR                 /* solaris */
  { PCSVADDR, "PCSVADDR", "set pc virtual address" },
  { PCSVADDR, "PCSVADDR", "set pc virtual address" },
#endif
#endif
#ifdef PCSXREG                  /* solaris sparc only */
#ifdef PCSXREG                  /* solaris sparc only */
  { PCSXREG,  "PCSXREG",  "set extra registers" },
  { PCSXREG,  "PCSXREG",  "set extra registers" },
#endif
#endif
#ifdef PCTWSTOP                 /* solaris */
#ifdef PCTWSTOP                 /* solaris */
  { PCTWSTOP, "PCTWSTOP", "wait for stop, with timeout arg" },
  { PCTWSTOP, "PCTWSTOP", "wait for stop, with timeout arg" },
#endif
#endif
  { PCUNKILL, "PCUNKILL", "delete a pending signal" },
  { PCUNKILL, "PCUNKILL", "delete a pending signal" },
#ifdef PCUNSET                  /* solaris */
#ifdef PCUNSET                  /* solaris */
  { PCUNSET,  "PCUNSET",  "unset modes" },
  { PCUNSET,  "PCUNSET",  "unset modes" },
#endif
#endif
#ifdef PCWATCH                  /* solaris */
#ifdef PCWATCH                  /* solaris */
  { PCWATCH,  "PCWATCH",  "set/unset watched memory area" },
  { PCWATCH,  "PCWATCH",  "set/unset watched memory area" },
#endif
#endif
  { PCWSTOP,  "PCWSTOP",  "wait for process/lwp to stop, no timeout" },
  { PCWSTOP,  "PCWSTOP",  "wait for process/lwp to stop, no timeout" },
  { 0,        NULL,      NULL }
  { 0,        NULL,      NULL }
};
};
 
 
static off_t lseek_offset;
static off_t lseek_offset;
 
 
int
int
write_with_trace (fd, arg, len, file, line)
write_with_trace (fd, arg, len, file, line)
     int  fd;
     int  fd;
     long *arg;
     long *arg;
     size_t len;
     size_t len;
     char *file;
     char *file;
     int  line;
     int  line;
{
{
  int  i;
  int  i;
  long opcode = arg[0];
  long opcode = arg[0];
  int ret;
  int ret;
 
 
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      for (i = 0; rw_table[i].name != NULL; i++)
      for (i = 0; rw_table[i].name != NULL; i++)
        if (rw_table[i].value == opcode)
        if (rw_table[i].value == opcode)
          break;
          break;
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      switch (opcode) {
      switch (opcode) {
      case PCSET:
      case PCSET:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSET,   %s) %s\n",
                 "write (PCSET,   %s) %s\n",
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? rw_table[i].desc : "");
                 info_verbose ? rw_table[i].desc : "");
        break;
        break;
#ifdef PCUNSET
#ifdef PCUNSET
      case PCUNSET:
      case PCUNSET:
#endif
#endif
#ifdef PCRESET
#ifdef PCRESET
      case PCRESET:
      case PCRESET:
#endif
#endif
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCRESET, %s) %s\n",
                 "write (PCRESET, %s) %s\n",
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? rw_table[i].desc : "");
                 info_verbose ? rw_table[i].desc : "");
        break;
        break;
      case PCSTRACE:
      case PCSTRACE:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSTRACE) ");
                 "write (PCSTRACE) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) &arg[1], 0);
                                     (sigset_t *) &arg[1], 0);
        break;
        break;
      case PCSFAULT:
      case PCSFAULT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSFAULT) ");
                 "write (PCSFAULT) ");
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
                                    (fltset_t *) &arg[1], 0);
                                    (fltset_t *) &arg[1], 0);
        break;
        break;
      case PCSENTRY:
      case PCSENTRY:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSENTRY) ");
                 "write (PCSENTRY) ");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) &arg[1], 0);
                                    (sysset_t *) &arg[1], 0);
        break;
        break;
      case PCSEXIT:
      case PCSEXIT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSEXIT) ");
                 "write (PCSEXIT) ");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) &arg[1], 0);
                                    (sysset_t *) &arg[1], 0);
        break;
        break;
      case PCSHOLD:
      case PCSHOLD:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSHOLD) ");
                 "write (PCSHOLD) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) &arg[1], 0);
                                     (sigset_t *) &arg[1], 0);
        break;
        break;
      case PCSSIG:
      case PCSSIG:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSSIG) ");
                 "write (PCSSIG) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  arg[1] ? ((siginfo_t *) &arg[1])->si_signo
                                  arg[1] ? ((siginfo_t *) &arg[1])->si_signo
                                         : 0,
                                         : 0,
                                  0);
                                  0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PCRUN:
      case PCRUN:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCRUN) ");
                 "write (PCRUN) ");
        if (arg[1] & PRCSIG)
        if (arg[1] & PRCSIG)
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
        if (arg[1] & PRCFAULT)
        if (arg[1] & PRCFAULT)
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
        if (arg[1] & PRSTEP)
        if (arg[1] & PRSTEP)
          fprintf (procfs_file ? procfs_file : stdout, "step ");
          fprintf (procfs_file ? procfs_file : stdout, "step ");
        if (arg[1] & PRSABORT)
        if (arg[1] & PRSABORT)
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
        if (arg[1] & PRSTOP)
        if (arg[1] & PRSTOP)
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
 
 
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PCKILL:
      case PCKILL:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCKILL) ");
                 "write (PCKILL) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  arg[1], 0);
                                  arg[1], 0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      default:
      default:
        {
        {
          static unsigned char break_insn[] = BREAKPOINT;
          static unsigned char break_insn[] = BREAKPOINT;
 
 
          if (len == sizeof (break_insn) &&
          if (len == sizeof (break_insn) &&
              memcmp (arg, &break_insn, len) == 0)
              memcmp (arg, &break_insn, len) == 0)
            fprintf (procfs_file ? procfs_file : stdout,
            fprintf (procfs_file ? procfs_file : stdout,
                     "write (<breakpoint at 0x%08x>) \n", lseek_offset);
                     "write (<breakpoint at 0x%08x>) \n", lseek_offset);
          else if (rw_table[i].name)
          else if (rw_table[i].name)
            fprintf (procfs_file ? procfs_file : stdout,
            fprintf (procfs_file ? procfs_file : stdout,
                     "write (%s) %s\n",
                     "write (%s) %s\n",
                     rw_table[i].name,
                     rw_table[i].name,
                     info_verbose ? rw_table[i].desc : "");
                     info_verbose ? rw_table[i].desc : "");
          else
          else
            {
            {
              if (lseek_offset != -1)
              if (lseek_offset != -1)
                fprintf (procfs_file ? procfs_file : stdout,
                fprintf (procfs_file ? procfs_file : stdout,
                         "write (<unknown>, %d bytes at 0x%08x) \n",
                         "write (<unknown>, %d bytes at 0x%08x) \n",
                         len, lseek_offset);
                         len, lseek_offset);
              else
              else
                fprintf (procfs_file ? procfs_file : stdout,
                fprintf (procfs_file ? procfs_file : stdout,
                         "write (<unknown>, %d bytes) \n", len);
                         "write (<unknown>, %d bytes) \n", len);
            }
            }
          break;
          break;
        }
        }
      }
      }
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  ret = write (fd, arg, len);
  ret = write (fd, arg, len);
  if (procfs_trace && ret != len)
  if (procfs_trace && ret != len)
    {
    {
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "[write (%s) FAILED!\n",
               "[write (%s) FAILED!\n",
               rw_table[i].name != NULL ?
               rw_table[i].name != NULL ?
               rw_table[i].name : "<unknown>");
               rw_table[i].name : "<unknown>");
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  lseek_offset = -1;
  lseek_offset = -1;
  return ret;
  return ret;
}
}
 
 
off_t
off_t
lseek_with_trace (fd, offset, whence, file, line)
lseek_with_trace (fd, offset, whence, file, line)
     int fd;
     int fd;
     off_t offset;
     off_t offset;
     int whence;
     int whence;
     char *file;
     char *file;
     int line;
     int line;
{
{
  off_t ret;
  off_t ret;
 
 
#if 0   /* don't need output, just need address */
#if 0   /* don't need output, just need address */
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "lseek (0x%08x, %s) \n", offset,
               "lseek (0x%08x, %s) \n", offset,
               whence == SEEK_SET ? "SEEK_SET" :
               whence == SEEK_SET ? "SEEK_SET" :
               whence == SEEK_CUR ? "SEEK_CUR" :
               whence == SEEK_CUR ? "SEEK_CUR" :
               whence == SEEK_END ? "SEEK_END" :
               whence == SEEK_END ? "SEEK_END" :
               "<unknown whence>");
               "<unknown whence>");
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
#endif
#endif
  ret = lseek (fd, offset, whence);
  ret = lseek (fd, offset, whence);
  lseek_offset = ret;
  lseek_offset = ret;
  if (procfs_trace && ret == -1)
  if (procfs_trace && ret == -1)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "[lseek (0x%08x) FAILED!\n", offset);
               "[lseek (0x%08x) FAILED!\n", offset);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
#endif /* NEW_PROC_API */
#endif /* NEW_PROC_API */
 
 
int
int
open_with_trace (filename, mode, file, line)
open_with_trace (filename, mode, file, line)
     char *filename;
     char *filename;
     int   mode;
     int   mode;
     char *file;
     char *file;
     int   line;
     int   line;
{
{
  int ret = open (filename, mode);
  int ret = open (filename, mode);
 
 
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "%d = open (%s, ", ret, filename);
               "%d = open (%s, ", ret, filename);
      if (mode == O_RDONLY)
      if (mode == O_RDONLY)
        fprintf (procfs_file ? procfs_file : stdout, "O_RDONLY) %d\n", line);
        fprintf (procfs_file ? procfs_file : stdout, "O_RDONLY) %d\n", line);
      else if (mode == O_WRONLY)
      else if (mode == O_WRONLY)
        fprintf (procfs_file ? procfs_file : stdout, "O_WRONLY) %d\n", line);
        fprintf (procfs_file ? procfs_file : stdout, "O_WRONLY) %d\n", line);
      else if (mode == O_RDWR)
      else if (mode == O_RDWR)
        fprintf (procfs_file ? procfs_file : stdout, "O_RDWR)   %d\n", line);
        fprintf (procfs_file ? procfs_file : stdout, "O_RDWR)   %d\n", line);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
int
int
close_with_trace (fd, file, line)
close_with_trace (fd, file, line)
     int   fd;
     int   fd;
     char *file;
     char *file;
     int   line;
     int   line;
{
{
  int ret = close (fd);
  int ret = close (fd);
 
 
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "%d = close (%d)\n", ret, fd);
               "%d = close (%d)\n", ret, fd);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
int
int
wait_with_trace (wstat, file, line)
wait_with_trace (wstat, file, line)
     int  *wstat;
     int  *wstat;
     char *file;
     char *file;
     int   line;
     int   line;
{
{
  int ret, lstat = 0;
  int ret, lstat = 0;
 
 
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "wait (line %d) ", line);
               "wait (line %d) ", line);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  ret = wait (&lstat);
  ret = wait (&lstat);
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "returned pid %d, status 0x%x\n", ret, lstat);
               "returned pid %d, status 0x%x\n", ret, lstat);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  if (wstat)
  if (wstat)
    *wstat = lstat;
    *wstat = lstat;
 
 
  return ret;
  return ret;
}
}
 
 
void
void
procfs_note (msg, file, line)
procfs_note (msg, file, line)
     char *msg;
     char *msg;
     char *file;
     char *file;
     int   line;
     int   line;
{
{
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      fprintf (procfs_file ? procfs_file : stdout, msg);
      fprintf (procfs_file ? procfs_file : stdout, msg);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
}
}
 
 
void
void
proc_prettyfprint_status (flags, why, what, thread)
proc_prettyfprint_status (flags, why, what, thread)
     long flags;
     long flags;
     int  why;
     int  why;
     int  what;
     int  what;
     int  thread;
     int  thread;
{
{
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (procfs_file == NULL && procfs_filename != NULL)
      if (procfs_file == NULL && procfs_filename != NULL)
        procfs_file = fopen (procfs_filename, "a");
        procfs_file = fopen (procfs_filename, "a");
 
 
      if (thread)
      if (thread)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "Thread %d: ", thread);
                 "Thread %d: ", thread);
 
 
      proc_prettyfprint_flags (procfs_file ? procfs_file : stdout,
      proc_prettyfprint_flags (procfs_file ? procfs_file : stdout,
                               flags, 0);
                               flags, 0);
 
 
      if (flags & (PR_STOPPED | PR_ISTOP))
      if (flags & (PR_STOPPED | PR_ISTOP))
        proc_prettyfprint_why (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_why (procfs_file ? procfs_file : stdout,
                               why, what, 0);
                               why, what, 0);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
}
}
 
 
 
 
void
void
_initialize_proc_api ()
_initialize_proc_api ()
{
{
  struct cmd_list_element *c;
  struct cmd_list_element *c;
 
 
  c = add_set_cmd ("procfs-trace", no_class,
  c = add_set_cmd ("procfs-trace", no_class,
                   var_boolean, (char *) &procfs_trace,
                   var_boolean, (char *) &procfs_trace,
                   "Set tracing for /proc ioctl calls.\n", &setlist);
                   "Set tracing for /proc ioctl calls.\n", &setlist);
 
 
  add_show_from_set (c, &showlist);
  add_show_from_set (c, &showlist);
  c->function.sfunc = set_procfs_trace_cmd;
  c->function.sfunc = set_procfs_trace_cmd;
 
 
  c = add_set_cmd ("procfs-file", no_class, var_filename,
  c = add_set_cmd ("procfs-file", no_class, var_filename,
                   (char *) &procfs_filename,
                   (char *) &procfs_filename,
                   "Set filename for /proc tracefile.\n", &setlist);
                   "Set filename for /proc tracefile.\n", &setlist);
 
 
  add_show_from_set (c, &showlist);
  add_show_from_set (c, &showlist);
  c->function.sfunc = set_procfs_file_cmd;
  c->function.sfunc = set_procfs_file_cmd;
 
 
#ifdef TRACE_PROCFS
#ifdef TRACE_PROCFS
  if (procfs_file == NULL && procfs_filename != NULL)
  if (procfs_file == NULL && procfs_filename != NULL)
    procfs_file = fopen (procfs_filename, "a");
    procfs_file = fopen (procfs_filename, "a");
#endif
#endif
}
}
 
 

powered by: WebSVN 2.1.0

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