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
33extern "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 */
122typedef 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 */
156typedef 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 */
242typedef 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 */
275typedef 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
323typedef 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 */
337typedef 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 */
381typedef 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 */
395typedef 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 */
405typedef 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 */
421typedef 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 */
430typedef 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 */
468typedef 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 */
475typedef 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 */
497typedef 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 */
547typedef 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 */
581typedef 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 */
616typedef 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 */
648typedef 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 */
690typedef 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 */
704typedef 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 */
725typedef 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 */
739typedef 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 */
749typedef 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 */
758typedef 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 */
796typedef 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 */
803typedef 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 */
817typedef 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