1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 /*
  27  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  28  * Copyright 2018 Joyent, Inc.
  29  * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
  30  */
  31 
  32 #ifndef _SYS_PROCFS_H
  33 #define _SYS_PROCFS_H
  34 
  35 #ifdef  __cplusplus
  36 extern "C" {
  37 #endif
  38 
  39 /*
  40  * This definition is temporary.  Structured proc is the preferred API,
  41  * and the older ioctl-based interface will be removed in a future version
  42  * of Solaris.  Until then, by default, including <sys/procfs.h> will
  43  * provide the older ioctl-based /proc definitions.  To get the structured
  44  * /proc definitions, either include <procfs.h> or define _STRUCTURED_PROC
  45  * to be 1 before including <sys/procfs.h>.
  46  */
  47 #ifndef _STRUCTURED_PROC
  48 #define _STRUCTURED_PROC        0
  49 #endif
  50 
  51 #if !defined(_KERNEL) && _STRUCTURED_PROC == 0
  52 
  53 #include <sys/old_procfs.h>
  54 
  55 #else   /* !defined(_KERNEL) && _STRUCTURED_PROC == 0 */
  56 
  57 #include <sys/feature_tests.h>
  58 #include <sys/types.h>
  59 #include <sys/time_impl.h>
  60 #include <sys/signal.h>
  61 #include <sys/siginfo.h>
  62 #include <sys/fault.h>
  63 #include <sys/syscall.h>
  64 #include <sys/pset.h>
  65 #include <sys/procfs_isa.h>
  66 #include <sys/priv.h>
  67 #include <sys/stat.h>
  68 #include <sys/param.h>
  69 #include <sys/secflags.h>
  70 #include <sys/thread.h>
  71 
  72 /*
  73  * System call interfaces for /proc.
  74  */
  75 
  76 /*
  77  * Control codes (long values) for messages written to ctl and lwpctl files.
  78  */
  79 #define PCNULL   0L     /* null request, advance to next message */
  80 #define PCSTOP   1L     /* direct process or lwp to stop and wait for stop */
  81 #define PCDSTOP  2L     /* direct process or lwp to stop */
  82 #define PCWSTOP  3L     /* wait for process or lwp to stop, no timeout */
  83 #define PCTWSTOP 4L     /* wait for stop, with long millisecond timeout arg */
  84 #define PCRUN    5L     /* make process/lwp runnable, w/ long flags argument */
  85 #define PCCSIG   6L     /* clear current signal from lwp */
  86 #define PCCFAULT 7L     /* clear current fault from lwp */
  87 #define PCSSIG   8L     /* set current signal from siginfo_t argument */
  88 #define PCKILL   9L     /* post a signal to process/lwp, long argument */
  89 #define PCUNKILL 10L    /* delete a pending signal from process/lwp, long arg */
  90 #define PCSHOLD  11L    /* set lwp signal mask from sigset_t argument */
  91 #define PCSTRACE 12L    /* set traced signal set from sigset_t argument */
  92 #define PCSFAULT 13L    /* set traced fault set from fltset_t argument */
  93 #define PCSENTRY 14L    /* set traced syscall entry set from sysset_t arg */
  94 #define PCSEXIT  15L    /* set traced syscall exit set from sysset_t arg */
  95 #define PCSET    16L    /* set modes from long argument */
  96 #define PCUNSET  17L    /* unset modes from long argument */
  97 #define PCSREG   18L    /* set lwp general registers from prgregset_t arg */
  98 #define PCSFPREG 19L    /* set lwp floating-point registers from prfpregset_t */
  99 #define PCSXREG  20L    /* set lwp extra registers from prxregset_t arg */
 100 #define PCNICE   21L    /* set nice priority from long argument */
 101 #define PCSVADDR 22L    /* set %pc virtual address from long argument */
 102 #define PCWATCH  23L    /* set/unset watched memory area from prwatch_t arg */
 103 #define PCAGENT  24L    /* create agent lwp with regs from prgregset_t arg */
 104 #define PCREAD   25L    /* read from the address space via priovec_t arg */
 105 #define PCWRITE  26L    /* write to the address space via priovec_t arg */
 106 #define PCSCRED  27L    /* set process credentials from prcred_t argument */
 107 #define PCSASRS  28L    /* set ancillary state registers from asrset_t arg */
 108 #define PCSPRIV  29L    /* set process privileges from prpriv_t argument */
 109 #define PCSZONE  30L    /* set zoneid from zoneid_t argument */
 110 #define PCSCREDX 31L    /* as PCSCRED but with supplemental groups */
 111 /*
 112  * PCRUN long operand flags.
 113  */
 114 #define PRCSIG          0x01    /* clear current signal, if any */
 115 #define PRCFAULT        0x02    /* clear current fault, if any */
 116 #define PRSTEP          0x04    /* direct the lwp to single-step */
 117 #define PRSABORT        0x08    /* abort syscall, if in syscall */
 118 #define PRSTOP          0x10    /* set directed stop request */
 119 
 120 /*
 121  * lwp status file.  /proc/<pid>/lwp/<lwpid>/lwpstatus
 122  */
 123 #define PRCLSZ          8       /* maximum size of scheduling class name */
 124 #define PRSYSARGS       8       /* maximum number of syscall arguments */
 125 typedef struct lwpstatus {
 126         int     pr_flags;       /* flags (see below) */
 127         id_t    pr_lwpid;       /* specific lwp identifier */
 128         short   pr_why;         /* reason for lwp stop, if stopped */
 129         short   pr_what;        /* more detailed reason */
 130         short   pr_cursig;      /* current signal, if any */
 131         short   pr_pad1;
 132         siginfo_t pr_info;      /* info associated with signal or fault */
 133         sigset_t pr_lwppend;    /* set of signals pending to the lwp */
 134         sigset_t pr_lwphold;    /* set of signals blocked by the lwp */
 135         struct sigaction pr_action;     /* signal action for current signal */
 136         stack_t pr_altstack;    /* alternate signal stack info */
 137         uintptr_t pr_oldcontext;        /* address of previous ucontext */
 138         short   pr_syscall;     /* system call number (if in syscall) */
 139         short   pr_nsysarg;     /* number of arguments to this syscall */
 140         int     pr_errno;       /* errno for failed syscall, 0 if successful */
 141         long    pr_sysarg[PRSYSARGS];   /* arguments to this syscall */
 142         long    pr_rval1;       /* primary syscall return value */
 143         long    pr_rval2;       /* second syscall return value, if any */
 144         char    pr_clname[PRCLSZ];      /* scheduling class name */
 145         timestruc_t pr_tstamp;  /* real-time time stamp of stop */
 146         timestruc_t pr_utime;   /* lwp user cpu time */
 147         timestruc_t pr_stime;   /* lwp system cpu time */
 148         int     pr_filler[11 - 2 * sizeof (timestruc_t) / sizeof (int)];
 149         int     pr_errpriv;     /* missing privilege */
 150         uintptr_t pr_ustack;    /* address of stack boundary data (stack_t) */
 151         ulong_t pr_instr;       /* current instruction */
 152         prgregset_t pr_reg;     /* general registers */
 153         prfpregset_t pr_fpreg;  /* floating-point registers */
 154 } lwpstatus_t;
 155 
 156 /*
 157  * process status file.  /proc/<pid>/status
 158  */
 159 typedef struct pstatus {
 160         int     pr_flags;       /* flags (see below) */
 161         int     pr_nlwp;        /* number of active lwps in the process */
 162         pid_t   pr_pid;         /* process id */
 163         pid_t   pr_ppid;        /* parent process id */
 164         pid_t   pr_pgid;        /* process group id */
 165         pid_t   pr_sid;         /* session id */
 166         id_t    pr_aslwpid;     /* historical; now always zero */
 167         id_t    pr_agentid;     /* lwp id of the /proc agent lwp, if any */
 168         sigset_t pr_sigpend;    /* set of process pending signals */
 169         uintptr_t pr_brkbase;   /* address of the process heap */
 170         size_t  pr_brksize;     /* size of the process heap, in bytes */
 171         uintptr_t pr_stkbase;   /* address of the process stack */
 172         size_t  pr_stksize;     /* size of the process stack, in bytes */
 173         timestruc_t pr_utime;   /* process user cpu time */
 174         timestruc_t pr_stime;   /* process system cpu time */
 175         timestruc_t pr_cutime;  /* sum of children's user times */
 176         timestruc_t pr_cstime;  /* sum of children's system times */
 177         sigset_t pr_sigtrace;   /* set of traced signals */
 178         fltset_t pr_flttrace;   /* set of traced faults */
 179         sysset_t pr_sysentry;   /* set of system calls traced on entry */
 180         sysset_t pr_sysexit;    /* set of system calls traced on exit */
 181         char    pr_dmodel;      /* data model of the process (see below) */
 182         char    pr_pad[3];
 183         taskid_t pr_taskid;     /* task id */
 184         projid_t pr_projid;     /* project id */
 185         int     pr_nzomb;       /* number of zombie lwps in the process */
 186         zoneid_t pr_zoneid;     /* zone id */
 187         int     pr_filler[15];  /* reserved for future use */
 188         lwpstatus_t pr_lwp;     /* status of the representative lwp */
 189 } pstatus_t;
 190 
 191 /*
 192  * pr_flags (same values appear in both pstatus_t and lwpstatus_t pr_flags).
 193  *
 194  * These flags do *not* apply to psinfo_t.pr_flag or lwpsinfo_t.pr_flag
 195  * (which are both deprecated).
 196  */
 197 /* The following flags apply to the specific or representative lwp */
 198 #define PR_STOPPED 0x00000001   /* lwp is stopped */
 199 #define PR_ISTOP   0x00000002   /* lwp is stopped on an event of interest */
 200 #define PR_DSTOP   0x00000004   /* lwp has a stop directive in effect */
 201 #define PR_STEP    0x00000008   /* lwp has a single-step directive in effect */
 202 #define PR_ASLEEP  0x00000010   /* lwp is sleeping in a system call */
 203 #define PR_PCINVAL 0x00000020   /* contents of pr_instr undefined */
 204 #define PR_ASLWP   0x00000040   /* obsolete flag; never set */
 205 #define PR_AGENT   0x00000080   /* this lwp is the /proc agent lwp */
 206 #define PR_DETACH  0x00000100   /* this is a detached lwp */
 207 #define PR_DAEMON  0x00000200   /* this is a daemon lwp */
 208 #define PR_IDLE    0x00000400   /* lwp is a cpu's idle thread */
 209 /* The following flags apply to the process, not to an individual lwp */
 210 #define PR_ISSYS   0x00001000   /* this is a system process */
 211 #define PR_VFORKP  0x00002000   /* process is the parent of a vfork()d child */
 212 #define PR_ORPHAN  0x00004000   /* process's process group is orphaned */
 213 #define PR_NOSIGCHLD 0x00008000 /* process will not generate SIGCHLD on exit */
 214 #define PR_WAITPID 0x00010000   /* only waitid(P_PID, pid) can reap the child */
 215 /* The following process flags are modes settable by PCSET/PCUNSET */
 216 #define PR_FORK    0x00100000   /* inherit-on-fork is in effect */
 217 #define PR_RLC     0x00200000   /* run-on-last-close is in effect */
 218 #define PR_KLC     0x00400000   /* kill-on-last-close is in effect */
 219 #define PR_ASYNC   0x00800000   /* asynchronous-stop is in effect */
 220 #define PR_MSACCT  0x01000000   /* micro-state usage accounting is in effect */
 221 #define PR_BPTADJ  0x02000000   /* breakpoint trap pc adjustment is in effect */
 222 #define PR_PTRACE  0x04000000   /* ptrace-compatibility mode is in effect */
 223 #define PR_MSFORK  0x08000000   /* micro-state accounting inherited on fork */
 224 
 225 /*
 226  * See <sys/procfs_isa.h> for possible values of pr_dmodel.
 227  */
 228 
 229 /*
 230  * Reasons for stopping (pr_why).
 231  */
 232 #define PR_REQUESTED    1
 233 #define PR_SIGNALLED    2
 234 #define PR_SYSENTRY     3
 235 #define PR_SYSEXIT      4
 236 #define PR_JOBCONTROL   5
 237 #define PR_FAULTED      6
 238 #define PR_SUSPENDED    7
 239 #define PR_CHECKPOINT   8
 240 
 241 /*
 242  * lwp ps(1) information file.  /proc/<pid>/lwp/<lwpid>/lwpsinfo
 243  */
 244 #define PRFNSZ          16      /* Maximum size of execed filename */
 245 typedef struct lwpsinfo {
 246         int     pr_flag;        /* lwp flags (DEPRECATED; do not use) */
 247         id_t    pr_lwpid;       /* lwp id */
 248         uintptr_t pr_addr;      /* internal address of lwp */
 249         uintptr_t pr_wchan;     /* wait addr for sleeping lwp */
 250         char    pr_stype;       /* synchronization event type */
 251         char    pr_state;       /* numeric lwp state */
 252         char    pr_sname;       /* printable character for pr_state */
 253         char    pr_nice;        /* nice for cpu usage */
 254         short   pr_syscall;     /* system call number (if in syscall) */
 255         char    pr_oldpri;      /* pre-SVR4, low value is high priority */
 256         char    pr_cpu;         /* pre-SVR4, cpu usage for scheduling */
 257         int     pr_pri;         /* priority, high value is high priority */
 258                         /* The following percent number is a 16-bit binary */
 259                         /* fraction [0 .. 1] with the binary point to the */
 260                         /* right of the high-order bit (1.0 == 0x8000) */
 261         ushort_t pr_pctcpu;     /* % of recent cpu time used by this lwp */
 262         ushort_t pr_pad;
 263         timestruc_t pr_start;   /* lwp start time, from the epoch */
 264         timestruc_t pr_time;    /* usr+sys cpu time for this lwp */
 265         char    pr_clname[PRCLSZ];      /* scheduling class name */
 266         char    pr_name[PRFNSZ];        /* name of system lwp */
 267         processorid_t pr_onpro;         /* processor which last ran this lwp */
 268         processorid_t pr_bindpro;       /* processor to which lwp is bound */
 269         psetid_t pr_bindpset;   /* processor set to which lwp is bound */
 270         int     pr_lgrp;        /* lwp home lgroup */
 271         int     pr_filler[4];   /* reserved for future use */
 272 } lwpsinfo_t;
 273 
 274 /*
 275  * process ps(1) information file.  /proc/<pid>/psinfo
 276  */
 277 #define PRARGSZ         80      /* number of chars of arguments */
 278 typedef struct psinfo {
 279         int     pr_flag;        /* process flags (DEPRECATED; do not use) */
 280         int     pr_nlwp;        /* number of active lwps in the process */
 281         pid_t   pr_pid;         /* unique process id */
 282         pid_t   pr_ppid;        /* process id of parent */
 283         pid_t   pr_pgid;        /* pid of process group leader */
 284         pid_t   pr_sid;         /* session id */
 285         uid_t   pr_uid;         /* real user id */
 286         uid_t   pr_euid;        /* effective user id */
 287         gid_t   pr_gid;         /* real group id */
 288         gid_t   pr_egid;        /* effective group id */
 289         uintptr_t pr_addr;      /* address of process */
 290         size_t  pr_size;        /* size of process image in Kbytes */
 291         size_t  pr_rssize;      /* resident set size in Kbytes */
 292         size_t  pr_pad1;
 293         dev_t   pr_ttydev;      /* controlling tty device (or PRNODEV) */
 294                         /* The following percent numbers are 16-bit binary */
 295                         /* fractions [0 .. 1] with the binary point to the */
 296                         /* right of the high-order bit (1.0 == 0x8000) */
 297         ushort_t pr_pctcpu;     /* % of recent cpu time used by all lwps */
 298         ushort_t pr_pctmem;     /* % of system memory used by process */
 299         timestruc_t pr_start;   /* process start time, from the epoch */
 300         timestruc_t pr_time;    /* usr+sys cpu time for this process */
 301         timestruc_t pr_ctime;   /* usr+sys cpu time for reaped children */
 302         char    pr_fname[PRFNSZ];       /* name of execed file */
 303         char    pr_psargs[PRARGSZ];     /* initial characters of arg list */
 304         int     pr_wstat;       /* if zombie, the wait() status */
 305         int     pr_argc;        /* initial argument count */
 306         uintptr_t pr_argv;      /* address of initial argument vector */
 307         uintptr_t pr_envp;      /* address of initial environment vector */
 308         char    pr_dmodel;      /* data model of the process */
 309         char    pr_pad2[3];
 310         taskid_t pr_taskid;     /* task id */
 311         projid_t pr_projid;     /* project id */
 312         int     pr_nzomb;       /* number of zombie lwps in the process */
 313         poolid_t pr_poolid;     /* pool id */
 314         zoneid_t pr_zoneid;     /* zone id */
 315         id_t    pr_contract;    /* process contract */
 316         int     pr_filler[1];   /* reserved for future use */
 317         lwpsinfo_t pr_lwp;      /* information for representative lwp */
 318 } psinfo_t;
 319 
 320 #define PRNODEV (dev_t)(-1)     /* non-existent device */
 321 
 322 /*
 323  * Memory-map interface.  /proc/<pid>/map /proc/<pid>/rmap
 324  */
 325 #define PRMAPSZ 64
 326 typedef struct prmap {
 327         uintptr_t pr_vaddr;     /* virtual address of mapping */
 328         size_t  pr_size;        /* size of mapping in bytes */
 329         char    pr_mapname[PRMAPSZ];    /* name in /proc/<pid>/object */
 330         offset_t pr_offset;     /* offset into mapped object, if any */
 331         int     pr_mflags;      /* protection and attribute flags (see below) */
 332         int     pr_pagesize;    /* pagesize (bytes) for this mapping */
 333         int     pr_shmid;       /* SysV shmid, -1 if not SysV shared memory */
 334         int     pr_filler[1];   /* filler for future expansion */
 335 } prmap_t;
 336 
 337 /*
 338  * HAT memory-map interface.  /proc/<pid>/xmap
 339  */
 340 typedef struct prxmap {
 341         uintptr_t pr_vaddr;     /* virtual address of mapping */
 342         size_t  pr_size;        /* size of mapping in bytes */
 343         char    pr_mapname[PRMAPSZ];    /* name in /proc/<pid>/object */
 344         offset_t pr_offset;     /* offset into mapped object, if any */
 345         int     pr_mflags;      /* protection and attribute flags (see below) */
 346         int     pr_pagesize;    /* pagesize (bytes) for this mapping */
 347         int     pr_shmid;       /* SysV shmid, -1 if not SysV shared memory */
 348         dev_t   pr_dev; /* st_dev from stat64() of mapped object, or PRNODEV */
 349         uint64_t pr_ino; /* st_ino from stat64() of mapped object, if any */
 350         size_t  pr_rss;         /* pages of resident memory */
 351         size_t  pr_anon;        /* pages of resident anonymous memory */
 352         size_t  pr_locked;      /* pages of locked memory */
 353         size_t  pr_pad;         /* currently unused */
 354         uint64_t pr_hatpagesize; /* pagesize of the hat mapping */
 355 #ifdef  _ILP32
 356         ulong_t pr_filler[6];   /* filler for future expansion */
 357 #else
 358         ulong_t pr_filler[7];   /* filler for future expansion */
 359 #endif
 360 } prxmap_t;
 361 
 362 
 363 /* Protection and attribute flags */
 364 #define MA_READ         0x04    /* readable by the traced process */
 365 #define MA_WRITE        0x02    /* writable by the traced process */
 366 #define MA_EXEC         0x01    /* executable by the traced process */
 367 #define MA_SHARED       0x08    /* changes are shared by mapped object */
 368 #define MA_ANON         0x40    /* anonymous memory (e.g. /dev/zero) */
 369 #define MA_ISM          0x80    /* intimate shared mem (shared MMU resources) */
 370 #define MA_NORESERVE    0x100   /* mapped with MAP_NORESERVE */
 371 #define MA_SHM          0x200   /* System V shared memory */
 372 #define MA_RESERVED1    0x400   /* reserved for future use */
 373 
 374 /*
 375  * These are obsolete and unreliable.
 376  * They are included here only for historical compatibility.
 377  */
 378 #define MA_BREAK        0x10    /* grown by brk(2) */
 379 #define MA_STACK        0x20    /* grown automatically on stack faults */
 380 
 381 /*
 382  * Process credentials.  PCSCRED and /proc/<pid>/cred
 383  */
 384 typedef struct prcred {
 385         uid_t   pr_euid;        /* effective user id */
 386         uid_t   pr_ruid;        /* real user id */
 387         uid_t   pr_suid;        /* saved user id (from exec) */
 388         gid_t   pr_egid;        /* effective group id */
 389         gid_t   pr_rgid;        /* real group id */
 390         gid_t   pr_sgid;        /* saved group id (from exec) */
 391         int     pr_ngroups;     /* number of supplementary groups */
 392         gid_t   pr_groups[1];   /* array of supplementary groups */
 393 } prcred_t;
 394 
 395 /*
 396  * Process privileges.  PCSPRIV and /proc/<pid>/priv
 397  */
 398 typedef struct prpriv {
 399         uint32_t        pr_nsets;               /* number of privilege set */
 400         uint32_t        pr_setsize;             /* size of privilege set */
 401         uint32_t        pr_infosize;            /* size of supplementary data */
 402         priv_chunk_t    pr_sets[1];             /* array of sets */
 403 } prpriv_t;
 404 
 405 #define PRSECFLAGS_VERSION_1            1
 406 #define PRSECFLAGS_VERSION_CURRENT      PRSECFLAGS_VERSION_1
 407 typedef struct prsecflags {
 408         uint32_t pr_version;
 409         char pr_pad[4];
 410         secflagset_t pr_effective;
 411         secflagset_t pr_inherit;
 412         secflagset_t pr_lower;
 413         secflagset_t pr_upper;
 414 } prsecflags_t;
 415 
 416 /*
 417  * Watchpoint interface.  PCWATCH and /proc/<pid>/watch
 418  */
 419 typedef struct prwatch {
 420         uintptr_t pr_vaddr;     /* virtual address of watched area */
 421         size_t  pr_size;        /* size of watched area in bytes */
 422         int     pr_wflags;      /* watch type flags */
 423         int     pr_pad;
 424 } prwatch_t;
 425 
 426 /* pr_wflags */
 427 #define WA_READ         0x04    /* trap on read access */
 428 #define WA_WRITE        0x02    /* trap on write access */
 429 #define WA_EXEC         0x01    /* trap on execute access */
 430 #define WA_TRAPAFTER    0x08    /* trap after instruction completes */
 431 
 432 /*
 433  * PCREAD/PCWRITE I/O interface.
 434  */
 435 typedef struct priovec {
 436         void    *pio_base;      /* buffer in controlling process */
 437         size_t  pio_len;        /* size of read/write request */
 438         off_t   pio_offset;     /* virtual address in target process */
 439 } priovec_t;
 440 
 441 /*
 442  * Resource usage.  /proc/<pid>/usage /proc/<pid>/lwp/<lwpid>/lwpusage
 443  */
 444 typedef struct prusage {
 445         id_t            pr_lwpid;       /* lwp id.  0: process or defunct */
 446         int             pr_count;       /* number of contributing lwps */
 447         timestruc_t     pr_tstamp;      /* current time stamp */
 448         timestruc_t     pr_create;      /* process/lwp creation time stamp */
 449         timestruc_t     pr_term;        /* process/lwp termination time stamp */
 450         timestruc_t     pr_rtime;       /* total lwp real (elapsed) time */
 451         timestruc_t     pr_utime;       /* user level cpu time */
 452         timestruc_t     pr_stime;       /* system call cpu time */
 453         timestruc_t     pr_ttime;       /* other system trap cpu time */
 454         timestruc_t     pr_tftime;      /* text page fault sleep time */
 455         timestruc_t     pr_dftime;      /* data page fault sleep time */
 456         timestruc_t     pr_kftime;      /* kernel page fault sleep time */
 457         timestruc_t     pr_ltime;       /* user lock wait sleep time */
 458         timestruc_t     pr_slptime;     /* all other sleep time */
 459         timestruc_t     pr_wtime;       /* wait-cpu (latency) time */
 460         timestruc_t     pr_stoptime;    /* stopped time */
 461         timestruc_t     filltime[6];    /* filler for future expansion */
 462         ulong_t         pr_minf;        /* minor page faults */
 463         ulong_t         pr_majf;        /* major page faults */
 464         ulong_t         pr_nswap;       /* swaps */
 465         ulong_t         pr_inblk;       /* input blocks */
 466         ulong_t         pr_oublk;       /* output blocks */
 467         ulong_t         pr_msnd;        /* messages sent */
 468         ulong_t         pr_mrcv;        /* messages received */
 469         ulong_t         pr_sigs;        /* signals received */
 470         ulong_t         pr_vctx;        /* voluntary context switches */
 471         ulong_t         pr_ictx;        /* involuntary context switches */
 472         ulong_t         pr_sysc;        /* system calls */
 473         ulong_t         pr_ioch;        /* chars read and written */
 474         ulong_t         filler[10];     /* filler for future expansion */
 475 } prusage_t;
 476 
 477 /*
 478  * Page data file.  /proc/<pid>/pagedata
 479  */
 480 
 481 /* page data file header */
 482 typedef struct prpageheader {
 483         timestruc_t     pr_tstamp;      /* real time stamp */
 484         long            pr_nmap;        /* number of address space mappings */
 485         long            pr_npage;       /* total number of pages */
 486 } prpageheader_t;
 487 
 488 /* page data mapping header */
 489 typedef struct prasmap {
 490         uintptr_t pr_vaddr;     /* virtual address of mapping */
 491         size_t  pr_npage;       /* number of pages in mapping */
 492         char    pr_mapname[PRMAPSZ];    /* name in /proc/<pid>/object */
 493         offset_t pr_offset;     /* offset into mapped object, if any */
 494         int     pr_mflags;      /* protection and attribute flags */
 495         int     pr_pagesize;    /* pagesize (bytes) for this mapping */
 496         int     pr_shmid;       /* SysV shmid, -1 if not SysV shared memory */
 497         int     pr_filler[1];   /* filler for future expansion */
 498 } prasmap_t;
 499 
 500 /*
 501  * pr_npage bytes (plus 0-7 null bytes to round up to an 8-byte boundary)
 502  * follow each mapping header, each containing zero or more of these flags.
 503  */
 504 #define PG_REFERENCED   0x02            /* page referenced since last read */
 505 #define PG_MODIFIED     0x01            /* page modified since last read */
 506 #define PG_HWMAPPED     0x04            /* page is present and mapped */
 507 
 508 /*
 509  * Open files.  Only in core files (for now).  Note that we'd like to use
 510  * the stat or stat64 structure, but both of these structures are unfortunately
 511  * not consistent between 32 and 64 bit modes.  To keep our lives simpler, we
 512  * just define our own structure with types that are not sensitive to this
 513  * difference.  Also, it turns out that pfiles omits a lot of info from the
 514  * struct stat (e.g. times, device sizes, etc.) so we don't bother adding those
 515  * here.
 516  */
 517 typedef struct prfdinfov1 {
 518         int             pr_fd;
 519         mode_t          pr_mode;
 520 
 521         uid_t           pr_uid;
 522         gid_t           pr_gid;
 523 
 524         major_t         pr_major;       /* think stat.st_dev */
 525         minor_t         pr_minor;
 526 
 527         major_t         pr_rmajor;      /* think stat.st_rdev */
 528         minor_t         pr_rminor;
 529 
 530         ino64_t         pr_ino;
 531         off64_t         pr_offset;
 532         off64_t         pr_size;
 533 
 534         int             pr_fileflags;   /* fcntl(F_GETXFL), etc */
 535         int             pr_fdflags;     /* fcntl(F_GETFD), etc. */
 536 
 537         char            pr_path[MAXPATHLEN];
 538 } prfdinfov1_t;
 539 
 540 typedef prfdinfov1_t prfdinfo_t;
 541 
 542 typedef struct prfdinfov2 {
 543         int             pr_fd;          /* file descriptor number */
 544         mode_t          pr_mode;        /* (see st_mode in stat(2)) */
 545         ino64_t         pr_ino;         /* inode number */
 546         off64_t         pr_size;        /* file size */
 547         off64_t         pr_offset;      /* current offset of file descriptor */
 548         uid_t           pr_uid;         /* owner's user id */
 549         gid_t           pr_gid;         /* owner's group id */
 550         major_t         pr_major;       /* major number of device */
 551         minor_t         pr_minor;       /* minor number of device */
 552         major_t         pr_rmajor;      /* major number (if special file) */
 553         minor_t         pr_rminor;      /* minor number (if special file) */
 554         int             pr_fileflags;   /* (see F_GETXFL in fcntl(2)) */
 555         int             pr_fdflags;     /* (see F_GETFD in fcntl(2)) */
 556         short           pr_locktype;    /* (see F_GETLK in fcntl(2)) */
 557         pid_t           pr_lockpid;     /* process holding file lock */
 558                                         /* (see F_GETLK) */
 559         int             pr_locksysid;   /* sysid of locking process */
 560                                         /* (see F_GETLK) */
 561         pid_t           pr_peerpid;     /* peer process (socket, door) */
 562         int             pr_filler[25];  /* reserved for future use */
 563         char            pr_peername[PRFNSZ];    /* peer process name */
 564 #if     __STDC_VERSION__ >= 199901L
 565         char    pr_misc[];      /* self describing structures */
 566 #else
 567         char    pr_misc[1];
 568 #endif
 569 } prfdinfov2_t;
 570 
 571 typedef struct pr_misc_header {
 572         uint_t          pr_misc_size;
 573         uint_t          pr_misc_type;
 574 } pr_misc_header_t;
 575 
 576 enum PR_MISC_TYPES
 577 {
 578         PR_PATHNAME,
 579         PR_SOCKETNAME,
 580         PR_PEERSOCKNAME,
 581         PR_SOCKOPTS_BOOL_OPTS,
 582         PR_SOCKOPT_LINGER,
 583         PR_SOCKOPT_SNDBUF,
 584         PR_SOCKOPT_RCVBUF,
 585         PR_SOCKOPT_IP_NEXTHOP,
 586         PR_SOCKOPT_IPV6_NEXTHOP,
 587         PR_SOCKOPT_TYPE,
 588         __UNIMPL_PR_SOCKOPT_LISTENQLIMIT,
 589         PR_SOCKOPT_TCP_CONGESTION,
 590         __UNIMPL_PR_SOCKOPT_FLOW_NAME,
 591         __UNIMPL_PR_SOCKOPTS_PRIV,
 592         PR_SOCKFILTERS_PRIV,
 593         PR_MISC_TYPES_MAX
 594 };
 595 
 596 typedef struct prsockopts_bool_opts {
 597         unsigned int prsock_bool_opts;
 598 } prsockopts_bool_opts_t;
 599 
 600 #define PR_SO_DEBUG             (1 << 0)
 601 #define PR_SO_REUSEADDR         (1 << 1)
 602 #define PR_SO_REUSEPORT         (1 << 2)
 603 #define PR_SO_KEEPALIVE         (1 << 3)
 604 #define PR_SO_DONTROUTE         (1 << 4)
 605 #define PR_SO_BROADCAST         (1 << 5)
 606 #define PR_SO_OOBINLINE         (1 << 7)
 607 #define PR_SO_DGRAM_ERRIND      (1 << 8)
 608 #define PR_SO_ALLZONES          (1 << 9)
 609 #define PR_SO_MAC_EXEMPT        (1 << 10)
 610 #define PR_SO_EXCLBIND          (1 << 11)
 611 #define PR_SO_PASSIVE_CONNECT   (1 << 12)
 612 #define PR_SO_ACCEPTCONN        (1 << 13)
 613 #define PR_UDP_NAT_T_ENDPOINT   (1 << 14)
 614 #define PR_SO_VRRP              (1 << 15)
 615 #define PR_SO_MAC_IMPLICIT      (1 << 16)
 616 
 617 /*
 618  * Representation of LWP name in core files.  In /proc, we use a simple char
 619  * array, but in core files we need to make it easy to correlate the note back
 620  * to the right LWP.  For simplicity, we'll use 32/64 consistent types.
 621  */
 622 typedef struct prlwpname {
 623         uint64_t pr_lwpid;
 624         char pr_lwpname[THREAD_NAME_MAX];
 625 } prlwpname_t;
 626 
 627 /*
 628  * Header for /proc/<pid>/lstatus /proc/<pid>/lpsinfo /proc/<pid>/lusage
 629  */
 630 typedef struct prheader {
 631         long    pr_nent;        /* number of entries */
 632         long    pr_entsize;     /* size of each entry, in bytes */
 633 } prheader_t;
 634 
 635 /*
 636  * Macros for manipulating sets of flags.
 637  * sp must be a pointer to one of sigset_t, fltset_t, or sysset_t.
 638  * flag must be a member of the enumeration corresponding to *sp.
 639  */
 640 
 641 /* turn on all flags in set */
 642 #define prfillset(sp) \
 643         { register int _i_ = sizeof (*(sp))/sizeof (uint32_t); \
 644                 while (_i_) ((uint32_t *)(sp))[--_i_] = (uint32_t)0xFFFFFFFF; }
 645 
 646 /* turn off all flags in set */
 647 #define premptyset(sp) \
 648         { register int _i_ = sizeof (*(sp))/sizeof (uint32_t); \
 649                 while (_i_) ((uint32_t *)(sp))[--_i_] = (uint32_t)0; }
 650 
 651 /* turn on specified flag in set */
 652 #define praddset(sp, flag) \
 653         ((void)(((unsigned)((flag)-1) < 32*sizeof (*(sp))/sizeof (uint32_t)) ? \
 654         (((uint32_t *)(sp))[((flag)-1)/32] |= (1U<<(((flag)-1)%32))) : 0))
 655 
 656 /* turn off specified flag in set */
 657 #define prdelset(sp, flag) \
 658         ((void)(((unsigned)((flag)-1) < 32*sizeof (*(sp))/sizeof (uint32_t)) ? \
 659             (((uint32_t *)(sp))[((flag)-1)/32] &= ~(1U<<(((flag)-1)%32))) : 0))
 660 
 661 /* query: != 0 iff flag is turned on in set */
 662 #define prismember(sp, flag) \
 663         (((unsigned)((flag)-1) < 32*sizeof (*(sp))/sizeof (uint32_t)) && \
 664             (((uint32_t *)(sp))[((flag)-1)/32] & (1U<<(((flag)-1)%32))))
 665 
 666 #if defined(_SYSCALL32)
 667 
 668 /*
 669  * dev32_t version of PRNODEV
 670  */
 671 #define PRNODEV32 (dev32_t)(-1)
 672 
 673 /*
 674  * Kernel view of /proc structures for _ILP32 programs.
 675  */
 676 
 677 /*
 678  * _ILP32 lwp status file.  /proc/<pid>/lwp/<lwpid>/lwpstatus
 679  */
 680 typedef struct lwpstatus32 {
 681         int     pr_flags;       /* flags */
 682         id32_t  pr_lwpid;       /* specific lwp identifier */
 683         short   pr_why;         /* reason for lwp stop, if stopped */
 684         short   pr_what;        /* more detailed reason */
 685         short   pr_cursig;      /* current signal, if any */
 686         short   pr_pad1;
 687         siginfo32_t pr_info;    /* info associated with signal or fault */
 688         sigset_t pr_lwppend;    /* set of signals pending to the lwp */
 689         sigset_t pr_lwphold;    /* set of signals blocked by the lwp */
 690         struct sigaction32 pr_action;   /* signal action for current signal */
 691         stack32_t pr_altstack;  /* alternate signal stack info */
 692         caddr32_t pr_oldcontext;        /* address of previous ucontext */
 693         short   pr_syscall;     /* system call number (if in syscall) */
 694         short   pr_nsysarg;     /* number of arguments to this syscall */
 695         int     pr_errno;       /* errno for failed syscall, 0 if successful */
 696         int32_t pr_sysarg[PRSYSARGS];   /* arguments to this syscall */
 697         int32_t pr_rval1;       /* primary syscall return value */
 698         int32_t pr_rval2;       /* second syscall return value, if any */
 699         char    pr_clname[PRCLSZ];      /* scheduling class name */
 700         timestruc32_t pr_tstamp;        /* real-time time stamp of stop */
 701         timestruc32_t pr_utime; /* lwp user cpu time */
 702         timestruc32_t pr_stime; /* lwp system cpu time */
 703         int     pr_filler[11 - 2 * sizeof (timestruc32_t) / sizeof (int)];
 704         int     pr_errpriv;     /* missing privilege */
 705         caddr32_t pr_ustack;    /* address of stack boundary data (stack32_t) */
 706         uint32_t pr_instr;      /* current instruction */
 707         prgregset32_t pr_reg;   /* general registers */
 708         prfpregset32_t pr_fpreg; /* floating-point registers */
 709 } lwpstatus32_t;
 710 
 711 /*
 712  * _ILP32 process status file.  /proc/<pid>/status
 713  */
 714 typedef struct pstatus32 {
 715         int     pr_flags;       /* flags */
 716         int     pr_nlwp;        /* number of active lwps in the process */
 717         pid32_t pr_pid;         /* process id */
 718         pid32_t pr_ppid;        /* parent process id */
 719         pid32_t pr_pgid;        /* process group id */
 720         pid32_t pr_sid;         /* session id */
 721         id32_t  pr_aslwpid;     /* historical; now always zero */
 722         id32_t  pr_agentid;     /* lwp id of the /proc agent lwp, if any */
 723         sigset_t pr_sigpend;    /* set of process pending signals */
 724         caddr32_t pr_brkbase;   /* address of the process heap */
 725         size32_t pr_brksize;    /* size of the process heap, in bytes */
 726         caddr32_t pr_stkbase;   /* address of the process stack */
 727         size32_t pr_stksize;    /* size of the process stack, in bytes */
 728         timestruc32_t pr_utime; /* process user cpu time */
 729         timestruc32_t pr_stime; /* process system cpu time */
 730         timestruc32_t pr_cutime;        /* sum of children's user times */
 731         timestruc32_t pr_cstime;        /* sum of children's system times */
 732         sigset_t pr_sigtrace;   /* set of traced signals */
 733         fltset_t pr_flttrace;   /* set of traced faults */
 734         sysset_t pr_sysentry;   /* set of system calls traced on entry */
 735         sysset_t pr_sysexit;    /* set of system calls traced on exit */
 736         char    pr_dmodel;      /* data model of the process */
 737         char    pr_pad[3];
 738         id32_t  pr_taskid;      /* task id */
 739         id32_t  pr_projid;      /* project id */
 740         int     pr_nzomb;       /* number of zombie lwps in the process */
 741         id32_t  pr_zoneid;      /* zone id */
 742         int     pr_filler[15];  /* reserved for future use */
 743         lwpstatus32_t pr_lwp;   /* status of the representative lwp */
 744 } pstatus32_t;
 745 
 746 /*
 747  * _ILP32 lwp ps(1) information file.  /proc/<pid>/lwp/<lwpid>/lwpsinfo
 748  */
 749 typedef struct lwpsinfo32 {
 750         int     pr_flag;        /* lwp flags */
 751         id32_t  pr_lwpid;       /* lwp id */
 752         caddr32_t pr_addr;      /* internal address of lwp */
 753         caddr32_t pr_wchan;     /* wait addr for sleeping lwp */
 754         char    pr_stype;       /* synchronization event type */
 755         char    pr_state;       /* numeric lwp state */
 756         char    pr_sname;       /* printable character for pr_state */
 757         char    pr_nice;        /* nice for cpu usage */
 758         short   pr_syscall;     /* system call number (if in syscall) */
 759         char    pr_oldpri;      /* pre-SVR4, low value is high priority */
 760         char    pr_cpu;         /* pre-SVR4, cpu usage for scheduling */
 761         int     pr_pri;         /* priority, high value is high priority */
 762                         /* The following percent number is a 16-bit binary */
 763                         /* fraction [0 .. 1] with the binary point to the */
 764                         /* right of the high-order bit (1.0 == 0x8000) */
 765         ushort_t pr_pctcpu;     /* % of recent cpu time used by this lwp */
 766         ushort_t pr_pad;
 767         timestruc32_t pr_start; /* lwp start time, from the epoch */
 768         timestruc32_t pr_time;  /* usr+sys cpu time for this lwp */
 769         char    pr_clname[PRCLSZ];      /* scheduling class name */
 770         char    pr_name[PRFNSZ];        /* name of system lwp */
 771         processorid_t pr_onpro;         /* processor which last ran this lwp */
 772         processorid_t pr_bindpro;       /* processor to which lwp is bound */
 773         psetid_t pr_bindpset;   /* processor set to which lwp is bound */
 774         int     pr_lgrp;        /* lwp home lgroup */
 775         int     pr_filler[4];   /* reserved for future use */
 776 } lwpsinfo32_t;
 777 
 778 /*
 779  * _ILP32 process ps(1) information file.  /proc/<pid>/psinfo
 780  */
 781 typedef struct psinfo32 {
 782         int     pr_flag;        /* process flags */
 783         int     pr_nlwp;        /* number of active lwps in the process */
 784         pid32_t pr_pid;         /* unique process id */
 785         pid32_t pr_ppid;        /* process id of parent */
 786         pid32_t pr_pgid;        /* pid of process group leader */
 787         pid32_t pr_sid;         /* session id */
 788         uid32_t pr_uid;         /* real user id */
 789         uid32_t pr_euid;        /* effective user id */
 790         gid32_t pr_gid;         /* real group id */
 791         gid32_t pr_egid;        /* effective group id */
 792         caddr32_t pr_addr;      /* address of process */
 793         size32_t pr_size;       /* size of process image in Kbytes */
 794         size32_t pr_rssize;     /* resident set size in Kbytes */
 795         size32_t pr_pad1;
 796         dev32_t pr_ttydev;      /* controlling tty device (or PRNODEV) */
 797         ushort_t pr_pctcpu;     /* % of recent cpu time used by all lwps */
 798         ushort_t pr_pctmem;     /* % of system memory used by process */
 799         timestruc32_t pr_start; /* process start time, from the epoch */
 800         timestruc32_t pr_time;  /* usr+sys cpu time for this process */
 801         timestruc32_t pr_ctime; /* usr+sys cpu time for reaped children */
 802         char    pr_fname[PRFNSZ];       /* name of execed file */
 803         char    pr_psargs[PRARGSZ];     /* initial characters of arg list */
 804         int     pr_wstat;       /* if zombie, the wait() status */
 805         int     pr_argc;        /* initial argument count */
 806         caddr32_t pr_argv;      /* address of initial argument vector */
 807         caddr32_t pr_envp;      /* address of initial environment vector */
 808         char    pr_dmodel;      /* data model of the process */
 809         char    pr_pad2[3];
 810         id32_t  pr_taskid;      /* task id */
 811         id32_t  pr_projid;      /* project id */
 812         int     pr_nzomb;       /* number of zombie lwps in the process */
 813         id32_t  pr_poolid;      /* pool id */
 814         id32_t  pr_zoneid;      /* zone id */
 815         id32_t  pr_contract;    /* process contract */
 816         int     pr_filler[1];   /* reserved for future use */
 817         lwpsinfo32_t pr_lwp;    /* information for representative lwp */
 818 } psinfo32_t;
 819 
 820 /*
 821  * _ILP32 Memory-management interface.  /proc/<pid>/map /proc/<pid>/rmap
 822  */
 823 typedef struct prmap32 {
 824         caddr32_t pr_vaddr;     /* virtual address of mapping */
 825         size32_t pr_size;       /* size of mapping in bytes */
 826         char    pr_mapname[64]; /* name in /proc/<pid>/object */
 827         offset_t pr_offset;     /* offset into mapped object, if any */
 828         int     pr_mflags;      /* protection and attribute flags */
 829         int     pr_pagesize;    /* pagesize (bytes) for this mapping */
 830         int     pr_shmid;       /* SysV shmid, -1 if not SysV shared memory */
 831         int     pr_filler[1];   /* filler for future expansion */
 832 } prmap32_t;
 833 
 834 /*
 835  * _ILP32 HAT memory-map interface.  /proc/<pid>/xmap
 836  */
 837 typedef struct prxmap32 {
 838         caddr32_t pr_vaddr;     /* virtual address of mapping */
 839         size32_t pr_size;       /* size of mapping in bytes */
 840         char    pr_mapname[PRMAPSZ];    /* name in /proc/<pid>/object */
 841         offset_t pr_offset;     /* offset into mapped object, if any */
 842         int     pr_mflags;      /* protection and attribute flags (see below) */
 843         int     pr_pagesize;    /* pagesize (bytes) for this mapping */
 844         int     pr_shmid;       /* SysV shmid, -1 if not SysV shared memory */
 845         dev32_t pr_dev;  /* st_dev from stat64() of mapped object, or PRNODEV */
 846         uint64_t pr_ino; /* st_ino from stat64() of mapped object, if any */
 847         uint32_t pr_rss;        /* pages of resident memory */
 848         uint32_t pr_anon;       /* pages of resident anonymous memory */
 849         uint32_t pr_locked;     /* pages of locked memory */
 850         uint32_t pr_pad;        /* currently unused */
 851         uint64_t pr_hatpagesize; /* pagesize of the hat mapping */
 852         uint32_t pr_filler[6];  /* filler for future expansion */
 853 } prxmap32_t;
 854 
 855 /*
 856  * _ILP32 Process credentials.  PCSCRED and /proc/<pid>/cred
 857  */
 858 typedef struct prcred32 {
 859         uid32_t pr_euid;        /* effective user id */
 860         uid32_t pr_ruid;        /* real user id */
 861         uid32_t pr_suid;        /* saved user id (from exec) */
 862         gid32_t pr_egid;        /* effective group id */
 863         gid32_t pr_rgid;        /* real group id */
 864         gid32_t pr_sgid;        /* saved group id (from exec) */
 865         int     pr_ngroups;     /* number of supplementary groups */
 866         gid32_t pr_groups[1];   /* array of supplementary groups */
 867 } prcred32_t;
 868 
 869 /*
 870  * _ILP32 Watchpoint interface.  PCWATCH and /proc/<pid>/watch
 871  */
 872 typedef struct prwatch32 {
 873         caddr32_t pr_vaddr;     /* virtual address of watched area */
 874         size32_t pr_size;       /* size of watched area in bytes */
 875         int     pr_wflags;      /* watch type flags */
 876         int     pr_pad;
 877 } prwatch32_t;
 878 
 879 /*
 880  * _ILP32 PCREAD/PCWRITE I/O interface.
 881  */
 882 typedef struct priovec32 {
 883         caddr32_t pio_base;     /* buffer in controlling process */
 884         size32_t pio_len;       /* size of read/write request */
 885         off32_t pio_offset;     /* virtual address in target process */
 886 } priovec32_t;
 887 
 888 /*
 889  * _ILP32 Resource usage.  /proc/<pid>/usage /proc/<pid>/lwp/<lwpid>/lwpusage
 890  */
 891 typedef struct prusage32 {
 892         id32_t          pr_lwpid;       /* lwp id.  0: process or defunct */
 893         int32_t         pr_count;       /* number of contributing lwps */
 894         timestruc32_t   pr_tstamp;      /* current time stamp */
 895         timestruc32_t   pr_create;      /* process/lwp creation time stamp */
 896         timestruc32_t   pr_term;        /* process/lwp termination time stamp */
 897         timestruc32_t   pr_rtime;       /* total lwp real (elapsed) time */
 898         timestruc32_t   pr_utime;       /* user level cpu time */
 899         timestruc32_t   pr_stime;       /* system call cpu time */
 900         timestruc32_t   pr_ttime;       /* other system trap cpu time */
 901         timestruc32_t   pr_tftime;      /* text page fault sleep time */
 902         timestruc32_t   pr_dftime;      /* data page fault sleep time */
 903         timestruc32_t   pr_kftime;      /* kernel page fault sleep time */
 904         timestruc32_t   pr_ltime;       /* user lock wait sleep time */
 905         timestruc32_t   pr_slptime;     /* all other sleep time */
 906         timestruc32_t   pr_wtime;       /* wait-cpu (latency) time */
 907         timestruc32_t   pr_stoptime;    /* stopped time */
 908         timestruc32_t   filltime[6];    /* filler for future expansion */
 909         uint32_t        pr_minf;        /* minor page faults */
 910         uint32_t        pr_majf;        /* major page faults */
 911         uint32_t        pr_nswap;       /* swaps */
 912         uint32_t        pr_inblk;       /* input blocks */
 913         uint32_t        pr_oublk;       /* output blocks */
 914         uint32_t        pr_msnd;        /* messages sent */
 915         uint32_t        pr_mrcv;        /* messages received */
 916         uint32_t        pr_sigs;        /* signals received */
 917         uint32_t        pr_vctx;        /* voluntary context switches */
 918         uint32_t        pr_ictx;        /* involuntary context switches */
 919         uint32_t        pr_sysc;        /* system calls */
 920         uint32_t        pr_ioch;        /* chars read and written */
 921         uint32_t        filler[10];     /* filler for future expansion */
 922 } prusage32_t;
 923 
 924 /*
 925  * _ILP32 Page data file.  /proc/<pid>/pagedata
 926  */
 927 
 928 /* _ILP32 page data file header */
 929 typedef struct prpageheader32 {
 930         timestruc32_t   pr_tstamp;      /* real time stamp */
 931         int32_t         pr_nmap;        /* number of address space mappings */
 932         int32_t         pr_npage;       /* total number of pages */
 933 } prpageheader32_t;
 934 
 935 /* _ILP32 page data mapping header */
 936 typedef struct prasmap32 {
 937         caddr32_t pr_vaddr;     /* virtual address of mapping */
 938         size32_t pr_npage;      /* number of pages in mapping */
 939         char    pr_mapname[64]; /* name in /proc/<pid>/object */
 940         offset_t pr_offset;     /* offset into mapped object, if any */
 941         int     pr_mflags;      /* protection and attribute flags */
 942         int     pr_pagesize;    /* pagesize (bytes) for this mapping */
 943         int     pr_shmid;       /* SysV shmid, -1 if not SysV shared memory */
 944         int     pr_filler[1];   /* filler for future expansion */
 945 } prasmap32_t;
 946 
 947 /*
 948  * _ILP32 Header for /proc/<pid>/lstatus /proc/<pid>/lpsinfo /proc/<pid>/lusage
 949  */
 950 typedef struct prheader32 {
 951         int32_t pr_nent;        /* number of entries */
 952         int32_t pr_entsize;     /* size of each entry, in bytes */
 953 } prheader32_t;
 954 
 955 #endif  /* _SYSCALL32 */
 956 
 957 #endif  /* !_KERNEL && _STRUCTURED_PROC == 0 */
 958 
 959 #ifdef  __cplusplus
 960 }
 961 #endif
 962 
 963 #endif  /* _SYS_PROCFS_H */