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