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