xref: /netbsd/sys/sys/sysctl.h (revision 6550d01e)
1 /*	$NetBSD: sysctl.h,v 1.192 2011/01/29 17:35:23 matt Exp $	*/
2 
3 /*
4  * Copyright (c) 1989, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * Mike Karels at Berkeley Software Design, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *	@(#)sysctl.h	8.1 (Berkeley) 6/2/93
35  */
36 
37 #ifndef _SYS_SYSCTL_H_
38 #define	_SYS_SYSCTL_H_
39 
40 /*
41  * These are for the eproc structure defined below.
42  */
43 #include <sys/time.h>
44 #include <sys/ucred.h>
45 #include <sys/ucontext.h>
46 #include <sys/proc.h>
47 #include <uvm/uvm_extern.h>
48 
49 
50 /* For offsetof() */
51 #if defined(_KERNEL) || defined(_STANDALONE)
52 #include <sys/systm.h>
53 #else
54 #include <stddef.h>
55 #include <stdbool.h>
56 #endif
57 
58 /*
59  * Definitions for sysctl call.  The sysctl call uses a hierarchical name
60  * for objects that can be examined or modified.  The name is expressed as
61  * a sequence of integers.  Like a file path name, the meaning of each
62  * component depends on its place in the hierarchy.  The top-level and kern
63  * identifiers are defined here, and other identifiers are defined in the
64  * respective subsystem header files.
65  */
66 
67 #define	CTL_MAXNAME	12	/* largest number of components supported */
68 #define SYSCTL_NAMELEN	32	/* longest name allowed for a node */
69 
70 #define CREATE_BASE	(1024)	/* start of dynamic mib allocation */
71 #define SYSCTL_DEFSIZE	8	/* initial size of a child set */
72 
73 /*
74  * Each subsystem defined by sysctl defines a list of variables
75  * for that subsystem. Each name is either a node with further
76  * levels defined below it, or it is a leaf of some particular
77  * type given below. Each sysctl level defines a set of name/type
78  * pairs to be used by sysctl(1) in manipulating the subsystem.
79  */
80 struct ctlname {
81 	const char *ctl_name;	/* subsystem name */
82 	int	ctl_type;	/* type of name */
83 };
84 #define	CTLTYPE_NODE	1	/* name is a node */
85 #define	CTLTYPE_INT	2	/* name describes an integer */
86 #define	CTLTYPE_STRING	3	/* name describes a string */
87 #define	CTLTYPE_QUAD	4	/* name describes a 64-bit number */
88 #define	CTLTYPE_STRUCT	5	/* name describes a structure */
89 #define	CTLTYPE_BOOL	6	/* name describes a bool */
90 
91 /*
92  * Flags that apply to each node, governing access and other features
93  */
94 #define CTLFLAG_READONLY	0x00000000
95 /* #define CTLFLAG_UNUSED1		0x00000010 */
96 /* #define CTLFLAG_UNUSED2		0x00000020 */
97 /* #define CTLFLAG_READ*	0x00000040 */
98 #define CTLFLAG_READWRITE	0x00000070
99 #define CTLFLAG_ANYWRITE	0x00000080
100 #define CTLFLAG_PRIVATE		0x00000100
101 #define CTLFLAG_PERMANENT	0x00000200
102 #define CTLFLAG_OWNDATA		0x00000400
103 #define CTLFLAG_IMMEDIATE	0x00000800
104 #define CTLFLAG_HEX		0x00001000
105 #define CTLFLAG_ROOT		0x00002000
106 #define CTLFLAG_ANYNUMBER	0x00004000
107 #define CTLFLAG_HIDDEN		0x00008000
108 #define CTLFLAG_ALIAS		0x00010000
109 #define CTLFLAG_MMAP		0x00020000
110 #define CTLFLAG_OWNDESC		0x00040000
111 
112 /*
113  * sysctl API version
114  */
115 #define SYSCTL_VERS_MASK	0xff000000
116 #define SYSCTL_VERS_0		0x00000000
117 #define SYSCTL_VERS_1		0x01000000
118 #define SYSCTL_VERSION		SYSCTL_VERS_1
119 #define SYSCTL_VERS(f)		((f) & SYSCTL_VERS_MASK)
120 
121 /*
122  * Flags that can be set by a create request from user-space
123  */
124 #define SYSCTL_USERFLAGS	(CTLFLAG_READWRITE|\
125 				CTLFLAG_ANYWRITE|\
126 				CTLFLAG_PRIVATE|\
127 				CTLFLAG_OWNDATA|\
128 				CTLFLAG_IMMEDIATE|\
129 				CTLFLAG_HEX|\
130 				CTLFLAG_HIDDEN)
131 
132 /*
133  * Accessor macros
134  */
135 #define SYSCTL_TYPEMASK		0x0000000f
136 #define SYSCTL_TYPE(x)		((x) & SYSCTL_TYPEMASK)
137 #define SYSCTL_FLAGMASK		0x00fffff0
138 #define SYSCTL_FLAGS(x)		((x) & SYSCTL_FLAGMASK)
139 
140 /*
141  * Meta-identifiers
142  */
143 #define CTL_EOL		-1		/* end of createv/destroyv list */
144 #define CTL_QUERY	-2		/* enumerates children of a node */
145 #define CTL_CREATE	-3		/* node create request */
146 #define CTL_CREATESYM	-4		/* node create request with symbol */
147 #define CTL_DESTROY	-5		/* node destroy request */
148 #define CTL_MMAP	-6		/* mmap request */
149 #define CTL_DESCRIBE	-7		/* get node descriptions */
150 
151 /*
152  * Top-level identifiers
153  */
154 #define	CTL_UNSPEC	0		/* unused */
155 #define	CTL_KERN	1		/* "high kernel": proc, limits */
156 #define	CTL_VM		2		/* virtual memory */
157 #define	CTL_VFS		3		/* file system, mount type is next */
158 #define	CTL_NET		4		/* network, see socket.h */
159 #define	CTL_DEBUG	5		/* debugging parameters */
160 #define	CTL_HW		6		/* generic CPU/io */
161 #define	CTL_MACHDEP	7		/* machine dependent */
162 #define	CTL_USER	8		/* user-level */
163 #define	CTL_DDB		9		/* in-kernel debugger */
164 #define	CTL_PROC	10		/* per-proc attr */
165 #define	CTL_VENDOR	11		/* vendor-specific data */
166 #define	CTL_EMUL	12		/* emulation-specific data */
167 #define	CTL_SECURITY	13		/* security */
168 #define	CTL_MAXID	14		/* number of valid top-level ids */
169 
170 /*
171  * The "vendor" toplevel name is to be used by vendors who wish to
172  * have their own private MIB tree. If you do that, please use
173  * vendor.<yourname>.*
174  */
175 
176 /*
177  * CTL_KERN identifiers
178  */
179 #define	KERN_OSTYPE	 	 1	/* string: system version */
180 #define	KERN_OSRELEASE	 	 2	/* string: system release */
181 #define	KERN_OSREV	 	 3	/* int: system revision */
182 #define	KERN_VERSION	 	 4	/* string: compile time info */
183 #define	KERN_MAXVNODES	 	 5	/* int: max vnodes */
184 #define	KERN_MAXPROC	 	 6	/* int: max processes */
185 #define	KERN_MAXFILES	 	 7	/* int: max open files */
186 #define	KERN_ARGMAX	 	 8	/* int: max arguments to exec */
187 #define	KERN_SECURELVL	 	 9	/* int: system security level */
188 #define	KERN_HOSTNAME		10	/* string: hostname */
189 #define	KERN_HOSTID		11	/* int: host identifier */
190 #define	KERN_CLOCKRATE		12	/* struct: struct clockinfo */
191 #define	KERN_VNODE		13	/* struct: vnode structures */
192 #define	KERN_PROC		14	/* struct: process entries */
193 #define	KERN_FILE		15	/* struct: file entries */
194 #define	KERN_PROF		16	/* node: kernel profiling info */
195 #define	KERN_POSIX1		17	/* int: POSIX.1 version */
196 #define	KERN_NGROUPS		18	/* int: # of supplemental group ids */
197 #define	KERN_JOB_CONTROL	19	/* int: is job control available */
198 #define	KERN_SAVED_IDS		20	/* int: saved set-user/group-ID */
199 #define	KERN_OBOOTTIME		21	/* struct: time kernel was booted */
200 #define	KERN_DOMAINNAME		22	/* string: (YP) domainname */
201 #define	KERN_MAXPARTITIONS	23	/* int: number of partitions/disk */
202 #define	KERN_RAWPARTITION	24	/* int: raw partition number */
203 #define	KERN_NTPTIME		25	/* struct: extended-precision time */
204 #define	KERN_TIMEX		26	/* struct: ntp timekeeping state */
205 #define	KERN_AUTONICETIME	27	/* int: proc time before autonice */
206 #define	KERN_AUTONICEVAL	28	/* int: auto nice value */
207 #define	KERN_RTC_OFFSET		29	/* int: offset of rtc from gmt */
208 #define	KERN_ROOT_DEVICE	30	/* string: root device */
209 #define	KERN_MSGBUFSIZE		31	/* int: max # of chars in msg buffer */
210 #define	KERN_FSYNC		32	/* int: file synchronization support */
211 #define	KERN_OLDSYSVMSG		33	/* old: SysV message queue suppoprt */
212 #define	KERN_OLDSYSVSEM		34	/* old: SysV semaphore support */
213 #define	KERN_OLDSYSVSHM		35	/* old: SysV shared memory support */
214 #define	KERN_OLDSHORTCORENAME	36	/* old, unimplemented */
215 #define	KERN_SYNCHRONIZED_IO	37	/* int: POSIX synchronized I/O */
216 #define	KERN_IOV_MAX		38	/* int: max iovec's for readv(2) etc. */
217 #define	KERN_MBUF		39	/* node: mbuf parameters */
218 #define	KERN_MAPPED_FILES	40	/* int: POSIX memory mapped files */
219 #define	KERN_MEMLOCK		41	/* int: POSIX memory locking */
220 #define	KERN_MEMLOCK_RANGE	42	/* int: POSIX memory range locking */
221 #define	KERN_MEMORY_PROTECTION	43	/* int: POSIX memory protections */
222 #define	KERN_LOGIN_NAME_MAX	44	/* int: max length login name + NUL */
223 #define	KERN_DEFCORENAME	45	/* old: sort core name format */
224 #define	KERN_LOGSIGEXIT		46	/* int: log signalled processes */
225 #define	KERN_PROC2		47	/* struct: process entries */
226 #define	KERN_PROC_ARGS		48	/* struct: process argv/env */
227 #define	KERN_FSCALE		49	/* int: fixpt FSCALE */
228 #define	KERN_CCPU		50	/* old: fixpt ccpu */
229 #define	KERN_CP_TIME		51	/* struct: CPU time counters */
230 #define	KERN_OLDSYSVIPC_INFO	52	/* old: number of valid kern ids */
231 #define	KERN_MSGBUF		53	/* kernel message buffer */
232 #define	KERN_CONSDEV		54	/* dev_t: console terminal device */
233 #define	KERN_MAXPTYS		55	/* int: maximum number of ptys */
234 #define	KERN_PIPE		56	/* node: pipe limits */
235 #define	KERN_MAXPHYS		57	/* int: kernel value of MAXPHYS */
236 #define	KERN_SBMAX		58	/* int: max socket buffer size */
237 #define	KERN_TKSTAT		59	/* tty in/out counters */
238 #define	KERN_MONOTONIC_CLOCK	60	/* int: POSIX monotonic clock */
239 #define	KERN_URND		61	/* int: random integer from urandom */
240 #define	KERN_LABELSECTOR	62	/* int: disklabel sector */
241 #define	KERN_LABELOFFSET	63	/* int: offset of label within sector */
242 #define	KERN_LWP		64	/* struct: lwp entries */
243 #define	KERN_FORKFSLEEP		65	/* int: sleep length on failed fork */
244 #define	KERN_POSIX_THREADS	66	/* int: POSIX Threads option */
245 #define	KERN_POSIX_SEMAPHORES	67	/* int: POSIX Semaphores option */
246 #define	KERN_POSIX_BARRIERS	68	/* int: POSIX Barriers option */
247 #define	KERN_POSIX_TIMERS	69	/* int: POSIX Timers option */
248 #define	KERN_POSIX_SPIN_LOCKS	70	/* int: POSIX Spin Locks option */
249 #define	KERN_POSIX_READER_WRITER_LOCKS 71 /* int: POSIX R/W Locks option */
250 #define	KERN_DUMP_ON_PANIC	72	/* int: dump on panic */
251 #define	KERN_SOMAXKVA		73	/* int: max socket kernel virtual mem */
252 #define	KERN_ROOT_PARTITION	74	/* int: root partition */
253 #define	KERN_DRIVERS		75	/* struct: driver names and majors #s */
254 #define	KERN_BUF		76	/* struct: buffers */
255 #define	KERN_FILE2		77	/* struct: file entries */
256 #define	KERN_VERIEXEC		78	/* node: verified exec */
257 #define	KERN_CP_ID		79	/* struct: cpu id numbers */
258 #define	KERN_HARDCLOCK_TICKS	80	/* int: number of hardclock ticks */
259 #define	KERN_ARND		81	/* void *buf, size_t siz random */
260 #define	KERN_SYSVIPC		82	/* node: SysV IPC parameters */
261 #define	KERN_BOOTTIME		83	/* struct: time kernel was booted */
262 #define	KERN_EVCNT		84	/* struct: evcnts */
263 #define	KERN_MAXID		85	/* number of valid kern ids */
264 
265 
266 #define	CTL_KERN_NAMES { \
267 	{ 0, 0 }, \
268 	{ "ostype", CTLTYPE_STRING }, \
269 	{ "osrelease", CTLTYPE_STRING }, \
270 	{ "osrevision", CTLTYPE_INT }, \
271 	{ "version", CTLTYPE_STRING }, \
272 	{ "maxvnodes", CTLTYPE_INT }, \
273 	{ "maxproc", CTLTYPE_INT }, \
274 	{ "maxfiles", CTLTYPE_INT }, \
275 	{ "argmax", CTLTYPE_INT }, \
276 	{ "securelevel", CTLTYPE_INT }, \
277 	{ "hostname", CTLTYPE_STRING }, \
278 	{ "hostid", CTLTYPE_INT }, \
279 	{ "clockrate", CTLTYPE_STRUCT }, \
280 	{ "vnode", CTLTYPE_STRUCT }, \
281 	{ "proc", CTLTYPE_STRUCT }, \
282 	{ "file", CTLTYPE_STRUCT }, \
283 	{ "profiling", CTLTYPE_NODE }, \
284 	{ "posix1version", CTLTYPE_INT }, \
285 	{ "ngroups", CTLTYPE_INT }, \
286 	{ "job_control", CTLTYPE_INT }, \
287 	{ "saved_ids", CTLTYPE_INT }, \
288 	{ 0, 0 }, \
289 	{ "domainname", CTLTYPE_STRING }, \
290 	{ "maxpartitions", CTLTYPE_INT }, \
291 	{ "rawpartition", CTLTYPE_INT }, \
292 	{ "ntptime", CTLTYPE_STRUCT }, \
293 	{ "timex", CTLTYPE_STRUCT }, \
294 	{ "autonicetime", CTLTYPE_INT }, \
295 	{ "autoniceval", CTLTYPE_INT }, \
296 	{ "rtc_offset", CTLTYPE_INT }, \
297 	{ "root_device", CTLTYPE_STRING }, \
298 	{ "msgbufsize", CTLTYPE_INT }, \
299 	{ "fsync", CTLTYPE_INT }, \
300 	{ 0, 0 }, \
301 	{ 0, 0 }, \
302 	{ 0, 0 }, \
303 	{ 0, 0 }, \
304 	{ "synchronized_io", CTLTYPE_INT }, \
305 	{ "iov_max", CTLTYPE_INT }, \
306 	{ "mbuf", CTLTYPE_NODE }, \
307 	{ "mapped_files", CTLTYPE_INT }, \
308 	{ "memlock", CTLTYPE_INT }, \
309 	{ "memlock_range", CTLTYPE_INT }, \
310 	{ "memory_protection", CTLTYPE_INT }, \
311 	{ "login_name_max", CTLTYPE_INT }, \
312 	{ "defcorename", CTLTYPE_STRING }, \
313 	{ "logsigexit", CTLTYPE_INT }, \
314 	{ "proc2", CTLTYPE_STRUCT }, \
315 	{ "proc_args", CTLTYPE_STRING }, \
316 	{ "fscale", CTLTYPE_INT }, \
317 	{ 0, 0 }, \
318 	{ "cp_time", CTLTYPE_STRUCT }, \
319 	{ 0, 0 }, \
320 	{ "msgbuf", CTLTYPE_STRUCT }, \
321 	{ "consdev", CTLTYPE_STRUCT }, \
322 	{ "maxptys", CTLTYPE_INT }, \
323 	{ "pipe", CTLTYPE_NODE }, \
324 	{ "maxphys", CTLTYPE_INT }, \
325 	{ "sbmax", CTLTYPE_INT }, \
326 	{ "tkstat", CTLTYPE_NODE }, \
327 	{ "monotonic_clock", CTLTYPE_INT }, \
328 	{ "urandom", CTLTYPE_INT }, \
329 	{ "labelsector", CTLTYPE_INT }, \
330 	{ "labeloffset", CTLTYPE_INT }, \
331 	{ "lwp", CTLTYPE_STRUCT }, \
332 	{ "forkfsleep", CTLTYPE_INT }, \
333 	{ "posix_threads", CTLTYPE_INT }, \
334 	{ "posix_semaphores", CTLTYPE_INT }, \
335 	{ "posix_barriers", CTLTYPE_INT }, \
336 	{ "posix_timers", CTLTYPE_INT }, \
337 	{ "posix_spin_locks", CTLTYPE_INT }, \
338 	{ "posix_reader_writer_locks", CTLTYPE_INT }, \
339 	{ "dump_on_panic", CTLTYPE_INT}, \
340 	{ "somaxkva", CTLTYPE_INT}, \
341 	{ "root_partition", CTLTYPE_INT}, \
342 	{ "drivers", CTLTYPE_STRUCT }, \
343 	{ "buf", CTLTYPE_NODE }, \
344 	{ "file2", CTLTYPE_STRUCT }, \
345 	{ "veriexec", CTLTYPE_NODE }, \
346 	{ "cp_id", CTLTYPE_STRUCT }, \
347 	{ "hardclock_ticks", CTLTYPE_INT }, \
348 	{ "arandom", CTLTYPE_STRUCT }, \
349 	{ "sysvipc", CTLTYPE_STRUCT }, \
350 	{ "boottime", CTLTYPE_STRUCT }, \
351 	{ "evcnt", CTLTYPE_STRUCT }, \
352 }
353 
354 /*
355  *  KERN_CLOCKRATE structure
356  */
357 struct clockinfo {
358 	int	hz;		/* clock frequency */
359 	int	tick;		/* micro-seconds per hz tick */
360 	int	tickadj;	/* clock skew rate for adjtime() */
361 	int	stathz;		/* statistics clock frequency */
362 	int	profhz;		/* profiling clock frequency */
363 };
364 
365 /*
366  * KERN_PROC subtypes
367  */
368 #define	KERN_PROC_ALL		 0	/* everything */
369 #define	KERN_PROC_PID		 1	/* by process id */
370 #define	KERN_PROC_PGRP		 2	/* by process group id */
371 #define	KERN_PROC_SESSION	 3	/* by session of pid */
372 #define	KERN_PROC_TTY		 4	/* by controlling tty */
373 #define	KERN_PROC_UID		 5	/* by effective uid */
374 #define	KERN_PROC_RUID		 6	/* by real uid */
375 #define	KERN_PROC_GID		 7	/* by effective gid */
376 #define	KERN_PROC_RGID		 8	/* by real gid */
377 
378 /*
379  * KERN_PROC_TTY sub-subtypes
380  */
381 #define	KERN_PROC_TTY_NODEV	NODEV		/* no controlling tty */
382 #define	KERN_PROC_TTY_REVOKE	((dev_t)-2)	/* revoked tty */
383 
384 struct ki_pcred {
385 	void		*p_pad;
386 	uid_t		p_ruid;		/* Real user id */
387 	uid_t		p_svuid;	/* Saved effective user id */
388 	gid_t		p_rgid;		/* Real group id */
389 	gid_t		p_svgid;	/* Saved effective group id */
390 	int		p_refcnt;	/* Number of references */
391 };
392 
393 struct ki_ucred {
394 	uint32_t	cr_ref;			/* reference count */
395 	uid_t		cr_uid;			/* effective user id */
396 	gid_t		cr_gid;			/* effective group id */
397 	uint32_t	cr_ngroups;		/* number of groups */
398 	gid_t		cr_groups[NGROUPS];	/* groups */
399 };
400 
401 /*
402  * KERN_PROC subtype ops return arrays of augmented proc structures:
403  */
404 struct kinfo_proc {
405 	struct	proc kp_proc;			/* proc structure */
406 	struct	eproc {
407 		struct	proc *e_paddr;		/* address of proc */
408 		struct	session *e_sess;	/* session pointer */
409 		struct	ki_pcred e_pcred;	/* process credentials */
410 		struct	ki_ucred e_ucred;	/* current credentials */
411 		struct	vmspace e_vm;		/* address space */
412 		pid_t	e_ppid;			/* parent process id */
413 		pid_t	e_pgid;			/* process group id */
414 		short	e_jobc;			/* job control counter */
415 		uint32_t e_tdev;		/* XXX: controlling tty dev */
416 		pid_t	e_tpgid;		/* tty process group id */
417 		struct	session *e_tsess;	/* tty session pointer */
418 #define	WMESGLEN	8
419 		char	e_wmesg[WMESGLEN];	/* wchan message */
420 		segsz_t e_xsize;		/* text size */
421 		short	e_xrssize;		/* text rss */
422 		short	e_xccount;		/* text references */
423 		short	e_xswrss;
424 		long	e_flag;
425 #define	EPROC_CTTY	0x01	/* controlling tty vnode active */
426 #define	EPROC_SLEADER	0x02	/* session leader */
427 		char	e_login[MAXLOGNAME];	/* setlogin() name */
428 		pid_t	e_sid;			/* session id */
429 		long	e_spare[3];
430 	} kp_eproc;
431 };
432 
433 /*
434  * Convert pointer to 64 bit unsigned integer for struct
435  * kinfo_proc2, etc.
436  */
437 #define PTRTOUINT64(p) ((uint64_t)(uintptr_t)(p))
438 #define UINT64TOPTR(u) ((void *)(uintptr_t)(u))
439 
440 /*
441  * KERN_PROC2 subtype ops return arrays of relatively fixed size
442  * structures of process info.   Use 8 byte alignment, and new
443  * elements should only be added to the end of this structure so
444  * binary compatibility can be preserved.
445  */
446 #define	KI_NGROUPS	16
447 #define	KI_MAXCOMLEN	24	/* extra for 8 byte alignment */
448 #define	KI_WMESGLEN	8
449 #define	KI_MAXLOGNAME	24	/* extra for 8 byte alignment */
450 #define	KI_MAXEMULLEN	16
451 #define	KI_LNAMELEN	20	/* extra 4 for alignment */
452 
453 #define KI_NOCPU	(~(uint64_t)0)
454 
455 typedef struct {
456 	uint32_t	__bits[4];
457 } ki_sigset_t;
458 
459 struct kinfo_proc2 {
460 	uint64_t p_forw;		/* PTR: linked run/sleep queue. */
461 	uint64_t p_back;
462 	uint64_t p_paddr;		/* PTR: address of proc */
463 
464 	uint64_t p_addr;		/* PTR: Kernel virtual addr of u-area */
465 	uint64_t p_fd;			/* PTR: Ptr to open files structure. */
466 	uint64_t p_cwdi;		/* PTR: cdir/rdir/cmask info */
467 	uint64_t p_stats;		/* PTR: Accounting/statistics */
468 	uint64_t p_limit;		/* PTR: Process limits. */
469 	uint64_t p_vmspace;		/* PTR: Address space. */
470 	uint64_t p_sigacts;		/* PTR: Signal actions, state */
471 	uint64_t p_sess;		/* PTR: session pointer */
472 	uint64_t p_tsess;		/* PTR: tty session pointer */
473 	uint64_t p_ru;			/* PTR: Exit information. XXX */
474 
475 	int32_t	p_eflag;		/* LONG: extra kinfo_proc2 flags */
476 	int32_t	p_exitsig;		/* INT: signal to sent to parent on exit */
477 	int32_t	p_flag;			/* INT: P_* flags. */
478 
479 	int32_t	p_pid;			/* PID_T: Process identifier. */
480 	int32_t	p_ppid;			/* PID_T: Parent process id */
481 	int32_t	p_sid;			/* PID_T: session id */
482 	int32_t	p__pgid;		/* PID_T: process group id */
483 					/* XXX: <sys/proc.h> hijacks p_pgid */
484 	int32_t	p_tpgid;		/* PID_T: tty process group id */
485 
486 	uint32_t p_uid;			/* UID_T: effective user id */
487 	uint32_t p_ruid;		/* UID_T: real user id */
488 	uint32_t p_gid;			/* GID_T: effective group id */
489 	uint32_t p_rgid;		/* GID_T: real group id */
490 
491 	uint32_t p_groups[KI_NGROUPS];	/* GID_T: groups */
492 	int16_t	p_ngroups;		/* SHORT: number of groups */
493 
494 	int16_t	p_jobc;			/* SHORT: job control counter */
495 	uint32_t p_tdev;		/* XXX: DEV_T: controlling tty dev */
496 
497 	uint32_t p_estcpu;		/* U_INT: Time averaged value of p_cpticks. */
498 	uint32_t p_rtime_sec;		/* STRUCT TIMEVAL: Real time. */
499 	uint32_t p_rtime_usec;		/* STRUCT TIMEVAL: Real time. */
500 	int32_t	p_cpticks;		/* INT: Ticks of CPU time. */
501 	uint32_t p_pctcpu;		/* FIXPT_T: %cpu for this process during p_swtime */
502 	uint32_t p_swtime;		/* U_INT: Time swapped in or out. */
503 	uint32_t p_slptime;		/* U_INT: Time since last blocked. */
504 	int32_t	p_schedflags;		/* INT: PSCHED_* flags */
505 
506 	uint64_t p_uticks;		/* U_QUAD_T: Statclock hits in user mode. */
507 	uint64_t p_sticks;		/* U_QUAD_T: Statclock hits in system mode. */
508 	uint64_t p_iticks;		/* U_QUAD_T: Statclock hits processing intr. */
509 
510 	uint64_t p_tracep;		/* PTR: Trace to vnode or file */
511 	int32_t	p_traceflag;		/* INT: Kernel trace points. */
512 
513 	int32_t	p_holdcnt;              /* INT: If non-zero, don't swap. */
514 
515 	ki_sigset_t p_siglist;		/* SIGSET_T: Signals arrived but not delivered. */
516 	ki_sigset_t p_sigmask;		/* SIGSET_T: Current signal mask. */
517 	ki_sigset_t p_sigignore;	/* SIGSET_T: Signals being ignored. */
518 	ki_sigset_t p_sigcatch;		/* SIGSET_T: Signals being caught by user. */
519 
520 	int8_t	p_stat;			/* CHAR: S* process status (from LWP). */
521 	uint8_t p_priority;		/* U_CHAR: Process priority. */
522 	uint8_t p_usrpri;		/* U_CHAR: User-priority based on p_cpu and p_nice. */
523 	uint8_t p_nice;			/* U_CHAR: Process "nice" value. */
524 
525 	uint16_t p_xstat;		/* U_SHORT: Exit status for wait; also stop signal. */
526 	uint16_t p_acflag;		/* U_SHORT: Accounting flags. */
527 
528 	char	p_comm[KI_MAXCOMLEN];
529 
530 	char	p_wmesg[KI_WMESGLEN];	/* wchan message */
531 	uint64_t p_wchan;		/* PTR: sleep address. */
532 
533 	char	p_login[KI_MAXLOGNAME];	/* setlogin() name */
534 
535 	int32_t	p_vm_rssize;		/* SEGSZ_T: current resident set size in pages */
536 	int32_t	p_vm_tsize;		/* SEGSZ_T: text size (pages) */
537 	int32_t	p_vm_dsize;		/* SEGSZ_T: data size (pages) */
538 	int32_t	p_vm_ssize;		/* SEGSZ_T: stack size (pages) */
539 
540 	int64_t	p_uvalid;		/* CHAR: following p_u* parameters are valid */
541 					/* XXX 64 bits for alignment */
542 	uint32_t p_ustart_sec;		/* STRUCT TIMEVAL: starting time. */
543 	uint32_t p_ustart_usec;		/* STRUCT TIMEVAL: starting time. */
544 
545 	uint32_t p_uutime_sec;		/* STRUCT TIMEVAL: user time. */
546 	uint32_t p_uutime_usec;		/* STRUCT TIMEVAL: user time. */
547 	uint32_t p_ustime_sec;		/* STRUCT TIMEVAL: system time. */
548 	uint32_t p_ustime_usec;		/* STRUCT TIMEVAL: system time. */
549 
550 	uint64_t p_uru_maxrss;		/* LONG: max resident set size. */
551 	uint64_t p_uru_ixrss;		/* LONG: integral shared memory size. */
552 	uint64_t p_uru_idrss;		/* LONG: integral unshared data ". */
553 	uint64_t p_uru_isrss;		/* LONG: integral unshared stack ". */
554 	uint64_t p_uru_minflt;		/* LONG: page reclaims. */
555 	uint64_t p_uru_majflt;		/* LONG: page faults. */
556 	uint64_t p_uru_nswap;		/* LONG: swaps. */
557 	uint64_t p_uru_inblock;		/* LONG: block input operations. */
558 	uint64_t p_uru_oublock;		/* LONG: block output operations. */
559 	uint64_t p_uru_msgsnd;		/* LONG: messages sent. */
560 	uint64_t p_uru_msgrcv;		/* LONG: messages received. */
561 	uint64_t p_uru_nsignals;	/* LONG: signals received. */
562 	uint64_t p_uru_nvcsw;		/* LONG: voluntary context switches. */
563 	uint64_t p_uru_nivcsw;		/* LONG: involuntary ". */
564 
565 	uint32_t p_uctime_sec;		/* STRUCT TIMEVAL: child u+s time. */
566 	uint32_t p_uctime_usec;		/* STRUCT TIMEVAL: child u+s time. */
567 	uint64_t p_cpuid;		/* LONG: CPU id */
568 	uint64_t p_realflag;	       	/* INT: P_* flags (not including LWPs). */
569 	uint64_t p_nlwps;		/* LONG: Number of LWPs */
570 	uint64_t p_nrlwps;		/* LONG: Number of running LWPs */
571 	uint64_t p_realstat;		/* LONG: non-LWP process status */
572 	uint32_t p_svuid;		/* UID_T: saved user id */
573 	uint32_t p_svgid;		/* GID_T: saved group id */
574 	char p_ename[KI_MAXEMULLEN];	/* emulation name */
575 	int64_t	p_vm_vsize;		/* SEGSZ_T: total map size (pages) */
576 	int64_t	p_vm_msize;		/* SEGSZ_T: stack-adjusted map size (pages) */
577 };
578 
579 /*
580  * Compat flags for kinfo_proc, kinfo_proc2.  Not guarenteed to be stable.
581  * Some of them used to be shared with LWP flags.
582  * XXXAD Trim to the minimum necessary...
583  */
584 
585 #define	P_ADVLOCK		0x00000001
586 #define	P_CONTROLT		0x00000002
587 #define	L_INMEM			0x00000004
588 #define	P_INMEM		     /* 0x00000004 */	L_INMEM
589 #define	P_NOCLDSTOP		0x00000008
590 #define	P_PPWAIT		0x00000010
591 #define	P_PROFIL		0x00000020
592 #define	L_SELECT		0x00000040
593 #define	P_SELECT	     /* 0x00000040 */	L_SELECT
594 #define	L_SINTR			0x00000080
595 #define	P_SINTR		     /* 0x00000080 */	L_SINTR
596 #define	P_SUGID			0x00000100
597 #define	L_SYSTEM	     	0x00000200
598 #define	P_SYSTEM	     /*	0x00000200 */	L_SYSTEM
599 #define	L_SA			0x00000400
600 #define	P_SA		     /* 0x00000400 */	L_SA
601 #define	P_TRACED		0x00000800
602 #define	P_WAITED		0x00001000
603 #define	P_WEXIT			0x00002000
604 #define	P_EXEC			0x00004000
605 #define	P_OWEUPC		0x00008000
606 #define	P_FSTRACE		0x00010000
607 #define	P_NOCLDWAIT		0x00020000
608 #define	P_32			0x00040000
609 #define	P_CLDSIGIGN		0x00080000
610 #define	P_SYSTRACE		0x00200000
611 #define	P_CHTRACED		0x00400000
612 #define	P_STOPFORK		0x00800000
613 #define	P_STOPEXEC		0x01000000
614 #define	P_STOPEXIT		0x02000000
615 #define	P_SYSCALL		0x04000000
616 #define	P_PAXMPROTECT		0x08000000
617 #define	P_PAXNOMPROTECT		0x10000000
618 
619 /*
620  * LWP compat flags.
621  */
622 #define	L_DETACHED		0x00800000
623 
624 /*
625  * KERN_LWP structure. See notes on KERN_PROC2 about adding elements.
626  */
627 struct kinfo_lwp {
628 	uint64_t l_forw;		/* PTR: linked run/sleep queue. */
629 	uint64_t l_back;
630 	uint64_t l_laddr;		/* PTR: Address of LWP */
631 	uint64_t l_addr;		/* PTR: Kernel virtual addr of u-area */
632 	int32_t	l_lid;			/* LWPID_T: LWP identifier */
633 	int32_t	l_flag;			/* INT: L_* flags. */
634 	uint32_t l_swtime;		/* U_INT: Time swapped in or out. */
635 	uint32_t l_slptime;		/* U_INT: Time since last blocked. */
636 	int32_t	l_schedflags;		/* INT: PSCHED_* flags */
637 	int32_t	l_holdcnt;              /* INT: If non-zero, don't swap. */
638 	uint8_t l_priority;		/* U_CHAR: Process priority. */
639 	uint8_t l_usrpri;		/* U_CHAR: User-priority based on l_cpu and p_nice. */
640 	int8_t	l_stat;			/* CHAR: S* process status. */
641 	int8_t	l_pad1;			/* fill out to 4-byte boundary */
642 	int32_t	l_pad2;			/* .. and then to an 8-byte boundary */
643 	char	l_wmesg[KI_WMESGLEN];	/* wchan message */
644 	uint64_t l_wchan;		/* PTR: sleep address. */
645 	uint64_t l_cpuid;		/* LONG: CPU id */
646 	uint32_t l_rtime_sec;		/* STRUCT TIMEVAL: Real time. */
647 	uint32_t l_rtime_usec;		/* STRUCT TIMEVAL: Real time. */
648 	uint32_t l_cpticks;		/* INT: ticks during l_swtime */
649 	uint32_t l_pctcpu;		/* FIXPT_T: cpu usage for ps */
650 	uint32_t l_pid;			/* PID_T: process identifier */
651 	char	l_name[KI_LNAMELEN];	/* CHAR[]: name, may be empty */
652 };
653 
654 /*
655  * KERN_PROC_ARGS subtypes
656  */
657 #define	KERN_PROC_ARGV		1	/* argv */
658 #define	KERN_PROC_NARGV		2	/* number of strings in above */
659 #define	KERN_PROC_ENV		3	/* environ */
660 #define	KERN_PROC_NENV		4	/* number of strings in above */
661 
662 /*
663  * KERN_SYSVIPC subtypes
664  */
665 #define	KERN_SYSVIPC_INFO	1	/* struct: number of valid kern ids */
666 #define	KERN_SYSVIPC_MSG	2	/* int: SysV message queue suppoprt */
667 #define	KERN_SYSVIPC_SEM	3	/* int: SysV semaphore support */
668 #define	KERN_SYSVIPC_SHM	4	/* int: SysV shared memory support */
669 #define	KERN_SYSVIPC_SHMMAX	5	/* int: max shared memory segment size (bytes) */
670 #define	KERN_SYSVIPC_SHMMNI	6	/* int: max number of shared memory identifiers */
671 #define	KERN_SYSVIPC_SHMSEG	7	/* int: max shared memory segments per process */
672 #define	KERN_SYSVIPC_SHMMAXPGS	8	/* int: max amount of shared memory (pages) */
673 #define	KERN_SYSVIPC_SHMUSEPHYS	9	/* int: physical memory usage */
674 
675 /*
676  * KERN_SYSVIPC_INFO subtypes
677  */
678 /* KERN_SYSVIPC_OMSG_INFO		1	*/
679 /* KERN_SYSVIPC_OSEM_INFO		2	*/
680 /* KERN_SYSVIPC_OSHM_INFO		3	*/
681 #define	KERN_SYSVIPC_MSG_INFO		4	/* msginfo and msqid_ds */
682 #define	KERN_SYSVIPC_SEM_INFO		5	/* seminfo and semid_ds */
683 #define	KERN_SYSVIPC_SHM_INFO		6	/* shminfo and shmid_ds */
684 
685 /*
686  * tty counter sysctl variables
687  */
688 #define	KERN_TKSTAT_NIN			1	/* total input character */
689 #define	KERN_TKSTAT_NOUT		2	/* total output character */
690 #define	KERN_TKSTAT_CANCC		3	/* canonical input character */
691 #define	KERN_TKSTAT_RAWCC		4	/* raw input character */
692 #define	KERN_TKSTAT_MAXID		5	/* number of valid TKSTAT ids */
693 
694 #define	KERN_TKSTAT_NAMES { \
695 	{ 0, 0 }, \
696 	{ "nin", CTLTYPE_QUAD }, \
697 	{ "nout", CTLTYPE_QUAD }, \
698 	{ "cancc", CTLTYPE_QUAD }, \
699 	{ "rawcc", CTLTYPE_QUAD }, \
700 }
701 
702 /*
703  * kern.drivers returns an array of these.
704  */
705 
706 struct kinfo_drivers {
707 	devmajor_t	d_cmajor;
708 	devmajor_t	d_bmajor;
709 	char		d_name[24];
710 };
711 
712 /*
713  * KERN_BUF subtypes, like KERN_PROC2, where the four following mib
714  * entries specify "which type of buf", "which particular buf",
715  * "sizeof buf", and "how many".  Currently, only "all buf" is
716  * defined.
717  */
718 #define	KERN_BUF_ALL	0		/* all buffers */
719 
720 /*
721  * kern.buf returns an array of these structures, which are designed
722  * both to be immune to 32/64 bit emulation issues and to provide
723  * backwards compatibility.  Note that the order here differs slightly
724  * from the real struct buf in order to achieve proper 64 bit
725  * alignment.
726  */
727 struct buf_sysctl {
728 	uint32_t b_flags;	/* LONG: B_* flags */
729 	int32_t  b_error;	/* INT: Errno value */
730 	int32_t  b_prio;	/* INT: Hint for buffer queue discipline */
731 	uint32_t b_dev;		/* DEV_T: Device associated with buffer */
732 	uint64_t b_bufsize;	/* LONG: Allocated buffer size */
733 	uint64_t b_bcount;	/* LONG: Valid bytes in buffer */
734 	uint64_t b_resid;	/* LONG: Remaining I/O */
735 	uint64_t b_addr;	/* CADDR_T: Memory, superblocks, indirect... */
736 	uint64_t b_blkno;	/* DADDR_T: Underlying physical block number */
737 	uint64_t b_rawblkno;	/* DADDR_T: Raw underlying physical block */
738 	uint64_t b_iodone;	/* PTR: Function called upon completion */
739 	uint64_t b_proc;	/* PTR: Associated proc if B_PHYS set */
740 	uint64_t b_vp;		/* PTR: File vnode */
741 	uint64_t b_saveaddr;	/* PTR: Original b_addr for physio */
742 	uint64_t b_lblkno;	/* DADDR_T: Logical block number */
743 };
744 
745 /*
746  * kern.file2 returns an array of these structures, which are designed
747  * both to be immune to be immune to 32/64 bit emulation issues and to
748  * provide backwards compatibility.  The order differs slightly from
749  * that of the real struct file, and some fields are taken from other
750  * structures (struct vnode, struct proc) in order to make the file
751  * information more useful.
752  */
753 struct kinfo_file {
754 	uint64_t	ki_fileaddr;	/* PTR: address of struct file */
755 	uint32_t	ki_flag;	/* INT: flags (see fcntl.h) */
756 	uint32_t	ki_iflags;	/* INT: internal flags */
757 	uint32_t	ki_ftype;	/* INT: descriptor type */
758 	uint32_t	ki_count;	/* UINT: reference count */
759 	uint32_t	ki_msgcount;	/* UINT: references from msg queue */
760 	uint32_t	ki_usecount;	/* INT: number active users */
761 	uint64_t	ki_fucred;	/* PTR: creds for descriptor */
762 	uint32_t	ki_fuid;	/* UID_T: descriptor credentials */
763 	uint32_t	ki_fgid;	/* GID_T: descriptor credentials */
764 	uint64_t	ki_fops;	/* PTR: address of fileops */
765 	uint64_t	ki_foffset;	/* OFF_T: offset */
766 	uint64_t	ki_fdata;	/* PTR: descriptor data */
767 
768 	/* vnode information to glue this file to something */
769 	uint64_t	ki_vun;		/* PTR: socket, specinfo, etc */
770 	uint64_t	ki_vsize;	/* OFF_T: size of file */
771 	uint32_t	ki_vtype;	/* ENUM: vnode type */
772 	uint32_t	ki_vtag;	/* ENUM: type of underlying data */
773 	uint64_t	ki_vdata;	/* PTR: private data for fs */
774 
775 	/* process information when retrieved via KERN_FILE_BYPID */
776 	uint32_t	ki_pid;		/* PID_T: process id */
777 	int32_t		ki_fd;		/* INT: descriptor number */
778 	uint32_t	ki_ofileflags;	/* CHAR: open file flags */
779 	uint32_t	_ki_padto64bits;
780 };
781 
782 #define	KERN_FILE_BYFILE	1
783 #define	KERN_FILE_BYPID		2
784 #define	KERN_FILESLOP		10
785 
786 /*
787  * kern.evcnt returns an array of these structures, which are designed both to
788  * be immune to 32/64 bit emulation issues.  Note that the struct here differs
789  * from the real struct evcnt but contains the same information in order to
790  * accomodate sysctl.
791  */
792 struct evcnt_sysctl {
793 	uint64_t	ev_count;		/* current count */
794 	uint64_t	ev_addr;		/* kernel address of evcnt */
795 	uint64_t	ev_parent;		/* kernel address of parent */
796 	uint8_t		ev_type;		/* EVCNT_TRAP_* */
797 	uint8_t		ev_grouplen;		/* length of group with NUL */
798 	uint8_t		ev_namelen;		/* length of name with NUL */
799 	uint8_t		ev_len;			/* multiply by 8 */
800 	/*
801 	 * Now the group and name strings follow (both include the trailing
802 	 * NUL).  ev_name start at &ev_strings[ev_grouplen+1]
803 	 */
804 	char		ev_strings[0];
805 };
806 
807 #define	KERN_EVCNT_COUNT_ANY		0
808 #define	KERN_EVCNT_COUNT_NONZERO	1
809 
810 /*
811  * CTL_HW identifiers
812  */
813 #define	HW_MACHINE	 1		/* string: machine class */
814 #define	HW_MODEL	 2		/* string: specific machine model */
815 #define	HW_NCPU		 3		/* int: number of cpus */
816 #define	HW_BYTEORDER	 4		/* int: machine byte order */
817 #define	HW_PHYSMEM	 5		/* int: total memory (bytes) */
818 #define	HW_USERMEM	 6		/* int: non-kernel memory (bytes) */
819 #define	HW_PAGESIZE	 7		/* int: software page size */
820 #define	HW_DISKNAMES	 8		/* string: disk drive names */
821 #define	HW_IOSTATS	 9		/* struct: iostats[] */
822 #define	HW_MACHINE_ARCH	10		/* string: machine architecture */
823 #define	HW_ALIGNBYTES	11		/* int: ALIGNBYTES for the kernel */
824 #define	HW_CNMAGIC	12		/* string: console magic sequence(s) */
825 #define	HW_PHYSMEM64	13		/* quad: total memory (bytes) */
826 #define	HW_USERMEM64	14		/* quad: non-kernel memory (bytes) */
827 #define	HW_IOSTATNAMES	15		/* string: iostat names */
828 #define	HW_MAXID	15		/* number of valid hw ids */
829 #define	HW_NCPUONLINE	16		/* number CPUs online */
830 
831 #define	CTL_HW_NAMES { \
832 	{ 0, 0 }, \
833 	{ "machine", CTLTYPE_STRING }, \
834 	{ "model", CTLTYPE_STRING }, \
835 	{ "ncpu", CTLTYPE_INT }, \
836 	{ "byteorder", CTLTYPE_INT }, \
837 	{ "physmem", CTLTYPE_INT }, \
838 	{ "usermem", CTLTYPE_INT }, \
839 	{ "pagesize", CTLTYPE_INT }, \
840 	{ "drivenames", CTLTYPE_STRING }, \
841 	{ "drivestats", CTLTYPE_STRUCT }, \
842 	{ "machine_arch", CTLTYPE_STRING }, \
843 	{ "alignbytes", CTLTYPE_INT }, \
844 	{ "cnmagic", CTLTYPE_STRING }, \
845 	{ "physmem64", CTLTYPE_QUAD }, \
846 	{ "usermem64", CTLTYPE_QUAD }, \
847 	{ "ncpuonline", CTLTYPE_INT }, \
848 }
849 
850 /*
851  * CTL_USER definitions
852  */
853 #define	USER_CS_PATH		 1	/* string: _CS_PATH */
854 #define	USER_BC_BASE_MAX	 2	/* int: BC_BASE_MAX */
855 #define	USER_BC_DIM_MAX		 3	/* int: BC_DIM_MAX */
856 #define	USER_BC_SCALE_MAX	 4	/* int: BC_SCALE_MAX */
857 #define	USER_BC_STRING_MAX	 5	/* int: BC_STRING_MAX */
858 #define	USER_COLL_WEIGHTS_MAX	 6	/* int: COLL_WEIGHTS_MAX */
859 #define	USER_EXPR_NEST_MAX	 7	/* int: EXPR_NEST_MAX */
860 #define	USER_LINE_MAX		 8	/* int: LINE_MAX */
861 #define	USER_RE_DUP_MAX		 9	/* int: RE_DUP_MAX */
862 #define	USER_POSIX2_VERSION	10	/* int: POSIX2_VERSION */
863 #define	USER_POSIX2_C_BIND	11	/* int: POSIX2_C_BIND */
864 #define	USER_POSIX2_C_DEV	12	/* int: POSIX2_C_DEV */
865 #define	USER_POSIX2_CHAR_TERM	13	/* int: POSIX2_CHAR_TERM */
866 #define	USER_POSIX2_FORT_DEV	14	/* int: POSIX2_FORT_DEV */
867 #define	USER_POSIX2_FORT_RUN	15	/* int: POSIX2_FORT_RUN */
868 #define	USER_POSIX2_LOCALEDEF	16	/* int: POSIX2_LOCALEDEF */
869 #define	USER_POSIX2_SW_DEV	17	/* int: POSIX2_SW_DEV */
870 #define	USER_POSIX2_UPE		18	/* int: POSIX2_UPE */
871 #define	USER_STREAM_MAX		19	/* int: POSIX2_STREAM_MAX */
872 #define	USER_TZNAME_MAX		20	/* int: _POSIX_TZNAME_MAX */
873 #define	USER_ATEXIT_MAX		21	/* int: {ATEXIT_MAX} */
874 #define	USER_MAXID		22	/* number of valid user ids */
875 
876 #define	CTL_USER_NAMES { \
877 	{ 0, 0 }, \
878 	{ "cs_path", CTLTYPE_STRING }, \
879 	{ "bc_base_max", CTLTYPE_INT }, \
880 	{ "bc_dim_max", CTLTYPE_INT }, \
881 	{ "bc_scale_max", CTLTYPE_INT }, \
882 	{ "bc_string_max", CTLTYPE_INT }, \
883 	{ "coll_weights_max", CTLTYPE_INT }, \
884 	{ "expr_nest_max", CTLTYPE_INT }, \
885 	{ "line_max", CTLTYPE_INT }, \
886 	{ "re_dup_max", CTLTYPE_INT }, \
887 	{ "posix2_version", CTLTYPE_INT }, \
888 	{ "posix2_c_bind", CTLTYPE_INT }, \
889 	{ "posix2_c_dev", CTLTYPE_INT }, \
890 	{ "posix2_char_term", CTLTYPE_INT }, \
891 	{ "posix2_fort_dev", CTLTYPE_INT }, \
892 	{ "posix2_fort_run", CTLTYPE_INT }, \
893 	{ "posix2_localedef", CTLTYPE_INT }, \
894 	{ "posix2_sw_dev", CTLTYPE_INT }, \
895 	{ "posix2_upe", CTLTYPE_INT }, \
896 	{ "stream_max", CTLTYPE_INT }, \
897 	{ "tzname_max", CTLTYPE_INT }, \
898 	{ "atexit_max", CTLTYPE_INT }, \
899 }
900 
901 /*
902  * CTL_DDB definitions
903  */
904 #define	DDBCTL_RADIX		1	/* int: Input and output radix */
905 #define	DDBCTL_MAXOFF		2	/* int: max symbol offset */
906 #define	DDBCTL_MAXWIDTH		3	/* int: width of the display line */
907 #define	DDBCTL_LINES		4	/* int: number of display lines */
908 #define	DDBCTL_TABSTOPS		5	/* int: tab width */
909 #define	DDBCTL_ONPANIC		6	/* int: DDB on panic if non-zero */
910 #define	DDBCTL_FROMCONSOLE	7	/* int: DDB via console if non-zero */
911 #define	DDBCTL_MAXID		8	/* number of valid DDB ids */
912 
913 #define	CTL_DDB_NAMES { \
914 	{ 0, 0 }, \
915 	{ "radix", CTLTYPE_INT }, \
916 	{ "maxoff", CTLTYPE_INT }, \
917 	{ "maxwidth", CTLTYPE_INT }, \
918 	{ "lines", CTLTYPE_INT }, \
919 	{ "tabstops", CTLTYPE_INT }, \
920 	{ "onpanic", CTLTYPE_INT }, \
921 	{ "fromconsole", CTLTYPE_INT }, \
922 }
923 
924 /*
925  * CTL_DEBUG definitions
926  *
927  * Second level identifier specifies which debug variable.
928  * Third level identifier specifies which structure component.
929  */
930 #define	CTL_DEBUG_NAME		0	/* string: variable name */
931 #define	CTL_DEBUG_VALUE		1	/* int: variable value */
932 #define	CTL_DEBUG_MAXID		20
933 
934 /*
935  * CTL_PROC subtype. Either a PID, or a magic value for the current proc.
936  */
937 
938 #define	PROC_CURPROC	(~((u_int)1 << 31))
939 
940 /*
941  * CTL_PROC tree: either corename (string), or a limit
942  * (rlimit.<type>.{hard,soft}, int).
943  */
944 #define	PROC_PID_CORENAME	1
945 #define	PROC_PID_LIMIT		2
946 #define	PROC_PID_STOPFORK	3
947 #define	PROC_PID_STOPEXEC	4
948 #define	PROC_PID_STOPEXIT	5
949 #define	PROC_PID_MAXID		6
950 
951 #define	PROC_PID_NAMES { \
952 	{ 0, 0 }, \
953 	{ "corename", CTLTYPE_STRING }, \
954 	{ "rlimit", CTLTYPE_NODE }, \
955 	{ "stopfork", CTLTYPE_INT }, \
956 	{ "stopexec", CTLTYPE_INT }, \
957 	{ "stopexit", CTLTYPE_INT }, \
958 }
959 
960 /* Limit types from <sys/resources.h> */
961 #define	PROC_PID_LIMIT_CPU	(RLIMIT_CPU+1)
962 #define	PROC_PID_LIMIT_FSIZE	(RLIMIT_FSIZE+1)
963 #define	PROC_PID_LIMIT_DATA	(RLIMIT_DATA+1)
964 #define	PROC_PID_LIMIT_STACK	(RLIMIT_STACK+1)
965 #define	PROC_PID_LIMIT_CORE	(RLIMIT_CORE+1)
966 #define	PROC_PID_LIMIT_RSS	(RLIMIT_RSS+1)
967 #define	PROC_PID_LIMIT_MEMLOCK	(RLIMIT_MEMLOCK+1)
968 #define PROC_PID_LIMIT_NPROC	(RLIMIT_NPROC+1)
969 #define	PROC_PID_LIMIT_NOFILE	(RLIMIT_NOFILE+1)
970 #define	PROC_PID_LIMIT_SBSIZE	(RLIMIT_SBSIZE+1)
971 #define	PROC_PID_LIMIT_AS	(RLIMIT_AS+1)
972 #define	PROC_PID_LIMIT_MAXID 	(RLIM_NLIMITS+1)
973 
974 #define	PROC_PID_LIMIT_NAMES { \
975 	{ 0, 0 }, \
976 	{ "cputime", CTLTYPE_NODE }, \
977 	{ "filesize", CTLTYPE_NODE }, \
978 	{ "datasize", CTLTYPE_NODE }, \
979 	{ "stacksize", CTLTYPE_NODE }, \
980 	{ "coredumpsize", CTLTYPE_NODE }, \
981 	{ "memoryuse", CTLTYPE_NODE }, \
982 	{ "memorylocked", CTLTYPE_NODE }, \
983 	{ "maxproc", CTLTYPE_NODE }, \
984 	{ "descriptors", CTLTYPE_NODE }, \
985 	{ "sbsize", CTLTYPE_NODE }, \
986 	{ "vmemoryuse", CTLTYPE_NODE }, \
987 }
988 /* for each type, either hard or soft value */
989 #define	PROC_PID_LIMIT_TYPE_SOFT	1
990 #define	PROC_PID_LIMIT_TYPE_HARD	2
991 #define	PROC_PID_LIMIT_TYPE_MAXID	3
992 
993 #define	PROC_PID_LIMIT_TYPE_NAMES { \
994 	{0, 0}, \
995 	{ "soft", CTLTYPE_QUAD }, \
996 	{ "hard", CTLTYPE_QUAD }, \
997 }
998 
999 /*
1000  * CTL_EMUL definitions
1001  *
1002  * Second level identifier specifies which emulation variable.
1003  * Subsequent levels are specified in the emulations themselves.
1004  */
1005 #define	EMUL_LINUX	1
1006 #define	EMUL_IRIX	2
1007 #define	EMUL_DARWIN	3
1008 #define	EMUL_MACH	4
1009 #define	EMUL_LINUX32	5
1010 
1011 #define	EMUL_MAXID	6
1012 #define	CTL_EMUL_NAMES { \
1013 	{ 0, 0 }, \
1014 	{ "linux", CTLTYPE_NODE }, \
1015 	{ "irix", CTLTYPE_NODE }, \
1016 	{ "darwin", CTLTYPE_NODE }, \
1017 	{ "mach", CTLTYPE_NODE }, \
1018 	{ "linux32", CTLTYPE_NODE }, \
1019 }
1020 
1021 #ifdef _KERNEL
1022 
1023 #if defined(_KERNEL_OPT)
1024 #include "opt_sysctl.h"
1025 #endif
1026 
1027 /* Root node of the kernel sysctl tree */
1028 extern struct sysctlnode sysctl_root;
1029 
1030 /*
1031  * A log of nodes created by a setup function or set of setup
1032  * functions so that they can be torn down in one "transaction"
1033  * when no longer needed.
1034  *
1035  * Users of the log merely pass a pointer to a pointer, and the sysctl
1036  * infrastructure takes care of the rest.
1037  */
1038 struct sysctllog;
1039 
1040 /*
1041  * CTL_DEBUG variables.
1042  *
1043  * These are declared as separate variables so that they can be
1044  * individually initialized at the location of their associated
1045  * variable. The loader prevents multiple use by issuing errors
1046  * if a variable is initialized in more than one place. They are
1047  * aggregated into an array in debug_sysctl(), so that it can
1048  * conveniently locate them when querried. If more debugging
1049  * variables are added, they must also be declared here and also
1050  * entered into the array.
1051  *
1052  * Note that the debug subtree is largely obsolescent in terms of
1053  * functionality now that we have dynamic sysctl, but the
1054  * infrastructure is retained for backwards compatibility.
1055  */
1056 struct ctldebug {
1057 	const char *debugname;	/* name of debugging variable */
1058 	int	*debugvar;	/* pointer to debugging variable */
1059 };
1060 #ifdef	DEBUG
1061 extern struct ctldebug debug0, debug1, debug2, debug3, debug4;
1062 extern struct ctldebug debug5, debug6, debug7, debug8, debug9;
1063 extern struct ctldebug debug10, debug11, debug12, debug13, debug14;
1064 extern struct ctldebug debug15, debug16, debug17, debug18, debug19;
1065 #endif	/* DEBUG */
1066 
1067 #define SYSCTLFN_PROTO const int *, u_int, void *, \
1068 	size_t *, const void *, size_t, \
1069 	const int *, struct lwp *, const struct sysctlnode *
1070 #define SYSCTLFN_ARGS const int *name, u_int namelen, \
1071 	void *oldp, size_t *oldlenp, \
1072 	const void *newp, size_t newlen, \
1073 	const int *oname, struct lwp *l, \
1074 	const struct sysctlnode *rnode
1075 #define SYSCTLFN_CALL(node) name, namelen, oldp, \
1076 	oldlenp, newp, newlen, \
1077 	oname, l, node
1078 
1079 #ifdef _MODULE
1080 
1081 #define SYSCTL_SETUP_PROTO(name)				\
1082 	void name(struct sysctllog **)
1083 #ifdef SYSCTL_DEBUG_SETUP
1084 #define SYSCTL_SETUP(name, desc)				\
1085 	SYSCTL_SETUP_PROTO(name);				\
1086 	static void __CONCAT(___,name)(struct sysctllog **);	\
1087 	void name(struct sysctllog **clog) {			\
1088 		printf("%s\n", desc);				\
1089 		__CONCAT(___,name)(clog); }			\
1090 	__link_set_add_text(sysctl_funcs, name);		\
1091 	static void __CONCAT(___,name)(struct sysctllog **clog)
1092 #else  /* !SYSCTL_DEBUG_SETUP */
1093 #define SYSCTL_SETUP(name, desc)				\
1094 	SYSCTL_SETUP_PROTO(name);				\
1095 	__link_set_add_text(sysctl_funcs, name);		\
1096 	void name(struct sysctllog **clog)
1097 #endif /* !SYSCTL_DEBUG_SETUP */
1098 
1099 #else /* !_MODULE */
1100 
1101 #define SYSCTL_SETUP_PROTO(name)
1102 #ifdef SYSCTL_DEBUG_SETUP
1103 #define SYSCTL_SETUP(name, desc)				\
1104 	static void __CONCAT(___,name)(struct sysctllog **);	\
1105 	static void name(struct sysctllog **clog) {		\
1106 		printf("%s\n", desc);				\
1107 		__CONCAT(___,name)(clog); }			\
1108 	__link_set_add_text(sysctl_funcs, name);		\
1109 	static void __CONCAT(___,name)(struct sysctllog **clog)
1110 #else  /* !SYSCTL_DEBUG_SETUP */
1111 #define SYSCTL_SETUP(name, desc)				\
1112 	static void name(struct sysctllog **);			\
1113 	__link_set_add_text(sysctl_funcs, name);		\
1114 	static void name(struct sysctllog **clog)
1115 #endif /* !SYSCTL_DEBUG_SETUP */
1116 
1117 #endif /* !_MODULE */
1118 
1119 /*
1120  * Internal sysctl function calling convention:
1121  *
1122  *	(*sysctlfn)(name, namelen, oldval, oldlenp, newval, newlen,
1123  *		    origname, lwp, node);
1124  *
1125  * The name parameter points at the next component of the name to be
1126  * interpreted.  The namelen parameter is the number of integers in
1127  * the name.  The origname parameter points to the start of the name
1128  * being parsed.  The node parameter points to the node on which the
1129  * current operation is to be performed.
1130  */
1131 typedef int (*sysctlfn)(SYSCTLFN_PROTO);
1132 
1133 /*
1134  * used in more than just sysctl
1135  */
1136 void	fill_eproc(struct proc *, struct eproc *, bool);
1137 
1138 /*
1139  * subsystem setup
1140  */
1141 void	sysctl_init(void);
1142 void	sysctl_finalize(void);
1143 
1144 /*
1145  * typical syscall call order
1146  */
1147 void	sysctl_lock(bool);
1148 int	sysctl_dispatch(SYSCTLFN_PROTO);
1149 void	sysctl_unlock(void);
1150 void	sysctl_relock(void);
1151 
1152 /*
1153  * tree navigation primitives (must obtain lock before using these)
1154  */
1155 int	sysctl_locate(struct lwp *, const int *, u_int,
1156 		      const struct sysctlnode **, int *);
1157 int	sysctl_query(SYSCTLFN_PROTO);
1158 int	sysctl_create(SYSCTLFN_PROTO);
1159 int	sysctl_destroy(SYSCTLFN_PROTO);
1160 int	sysctl_lookup(SYSCTLFN_PROTO);
1161 int	sysctl_describe(SYSCTLFN_PROTO);
1162 
1163 /*
1164  * simple variadic interface for adding/removing nodes
1165  */
1166 int	sysctl_createv(struct sysctllog **, int,
1167 		       const struct sysctlnode **, const struct sysctlnode **,
1168 		       int, int, const char *, const char *,
1169 		       sysctlfn, u_quad_t, void *, size_t, ...);
1170 int	sysctl_destroyv(struct sysctlnode *, ...);
1171 
1172 /*
1173  * miscellany
1174  */
1175 void	sysctl_dump(const struct sysctlnode *);
1176 void	sysctl_free(struct sysctlnode *);
1177 void	sysctl_teardown(struct sysctllog **);
1178 void	sysctl_log_print(const struct sysctllog *);
1179 
1180 #ifdef SYSCTL_INCLUDE_DESCR
1181 #define SYSCTL_DESCR(s) s
1182 #else /* SYSCTL_INCLUDE_DESCR */
1183 #define SYSCTL_DESCR(s) NULL
1184 #endif /* SYSCTL_INCLUDE_DESCR */
1185 
1186 /*
1187  * simple interface similar to old interface for in-kernel consumption
1188  */
1189 int	old_sysctl(int *, u_int, void *, size_t *, void *, size_t, struct lwp *);
1190 
1191 /*
1192  * these helpers are in other files (XXX so should the nodes be) or
1193  * are used by more than one node
1194  */
1195 int	sysctl_hw_tapenames(SYSCTLFN_PROTO);
1196 int	sysctl_hw_tapestats(SYSCTLFN_PROTO);
1197 int	sysctl_kern_vnode(SYSCTLFN_PROTO);
1198 int	sysctl_net_inet_ip_ports(SYSCTLFN_PROTO);
1199 int	sysctl_consdev(SYSCTLFN_PROTO);
1200 int	sysctl_root_device(SYSCTLFN_PROTO);
1201 int	sysctl_vfs_generic_fstypes(SYSCTLFN_PROTO);
1202 
1203 /*
1204  * primitive helper stubs
1205  */
1206 int	sysctl_needfunc(SYSCTLFN_PROTO);
1207 int	sysctl_notavail(SYSCTLFN_PROTO);
1208 int	sysctl_null(SYSCTLFN_PROTO);
1209 
1210 int	sysctl_copyin(struct lwp *, const void *, void *, size_t);
1211 int	sysctl_copyout(struct lwp *, const void *, void *, size_t);
1212 int	sysctl_copyinstr(struct lwp *, const void *, void *, size_t, size_t *);
1213 
1214 u_int	sysctl_map_flags(const u_int *, u_int);
1215 
1216 MALLOC_DECLARE(M_SYSCTLNODE);
1217 MALLOC_DECLARE(M_SYSCTLDATA);
1218 
1219 extern const u_int sysctl_lwpflagmap[];
1220 
1221 #else	/* !_KERNEL */
1222 #include <sys/cdefs.h>
1223 
1224 typedef void *sysctlfn;
1225 
1226 __BEGIN_DECLS
1227 int	sysctl(const int *, u_int, void *, size_t *, const void *, size_t);
1228 int	sysctlbyname(const char *, void *, size_t *, const void *, size_t);
1229 int	sysctlgetmibinfo(const char *, int *, u_int *,
1230 			 char *, size_t *, struct sysctlnode **, int);
1231 int	sysctlnametomib(const char *, int *, size_t *);
1232 __END_DECLS
1233 
1234 #endif	/* !_KERNEL */
1235 
1236 #ifdef __COMPAT_SYSCTL
1237 /*
1238  * old node definitions go here
1239  */
1240 #endif /* __COMPAT_SYSCTL */
1241 
1242 /*
1243  * padding makes alignment magically "work" for 32/64 compatibility at
1244  * the expense of making things bigger on 32 bit platforms.
1245  */
1246 #if defined(_LP64) || (BYTE_ORDER == LITTLE_ENDIAN)
1247 #define __sysc_pad(type) union { uint64_t __sysc_upad; \
1248 	struct { type __sysc_sdatum; } __sysc_ustr; }
1249 #else
1250 #define __sysc_pad(type) union { uint64_t __sysc_upad; \
1251 	struct { uint32_t __sysc_spad; type __sysc_sdatum; } __sysc_ustr; }
1252 #endif
1253 #define __sysc_unpad(x) x.__sysc_ustr.__sysc_sdatum
1254 
1255 /*
1256  * The following is for gcc2, which doesn't handle __sysc_unpad().
1257  * The code gets a little less ugly this way.
1258  */
1259 #define sysc_init_field(field, value) 	\
1260 	.field = { .__sysc_ustr = { .__sysc_sdatum = (value), }, }
1261 
1262 struct sysctlnode {
1263 	uint32_t sysctl_flags;		/* flags and type */
1264 	int32_t sysctl_num;		/* mib number */
1265 	char sysctl_name[SYSCTL_NAMELEN]; /* node name */
1266 	uint32_t sysctl_ver;		/* node's version vs. rest of tree */
1267 	uint32_t __rsvd;
1268 	union {
1269 		struct {
1270 			uint32_t suc_csize;	/* size of child node array */
1271 			uint32_t suc_clen;	/* number of valid children */
1272 			__sysc_pad(struct sysctlnode*) _suc_child; /* array of child nodes */
1273 		} scu_child;
1274 		struct {
1275 			__sysc_pad(void*) _sud_data; /* pointer to external data */
1276 			__sysc_pad(size_t) _sud_offset; /* offset to data */
1277 		} scu_data;
1278 		int32_t scu_alias;		/* node this node refers to */
1279 		int32_t scu_idata;		/* immediate "int" data */
1280 		u_quad_t scu_qdata;		/* immediate "u_quad_t" data */
1281 		bool scu_bdata;			/* immediate bool data */
1282 	} sysctl_un;
1283 	__sysc_pad(size_t) _sysctl_size;	/* size of instrumented data */
1284 	__sysc_pad(sysctlfn) _sysctl_func;	/* access helper function */
1285 	__sysc_pad(struct sysctlnode*) _sysctl_parent; /* parent of this node */
1286 	__sysc_pad(const char *) _sysctl_desc;	/* description of node */
1287 };
1288 
1289 /*
1290  * padded data
1291  */
1292 #define suc_child	__sysc_unpad(_suc_child)
1293 #define sud_data	__sysc_unpad(_sud_data)
1294 #define sud_offset	__sysc_unpad(_sud_offset)
1295 #define sysctl_size	__sysc_unpad(_sysctl_size)
1296 #define sysctl_func	__sysc_unpad(_sysctl_func)
1297 #define sysctl_parent	__sysc_unpad(_sysctl_parent)
1298 #define sysctl_desc	__sysc_unpad(_sysctl_desc)
1299 
1300 /*
1301  * nested data (may also be padded)
1302  */
1303 #define sysctl_csize	sysctl_un.scu_child.suc_csize
1304 #define sysctl_clen	sysctl_un.scu_child.suc_clen
1305 #define sysctl_child	sysctl_un.scu_child.suc_child
1306 #define sysctl_data	sysctl_un.scu_data.sud_data
1307 #define sysctl_offset	sysctl_un.scu_data.sud_offset
1308 #define sysctl_alias	sysctl_un.scu_alias
1309 #define sysctl_idata	sysctl_un.scu_idata
1310 #define sysctl_qdata	sysctl_un.scu_qdata
1311 #define sysctl_bdata	sysctl_un.scu_bdata
1312 
1313 /*
1314  * when requesting a description of a node (a set of nodes, actually),
1315  * you get back an "array" of these, where the actual length of the
1316  * descr_str is noted in descr_len (which includes the trailing nul
1317  * byte), rounded up to the nearest four (sizeof(int32_t) actually).
1318  *
1319  * NEXT_DESCR() will take a pointer to a description and advance it to
1320  * the next description.
1321  */
1322 struct sysctldesc {
1323 	int32_t		descr_num;	/* mib number of node */
1324 	uint32_t	descr_ver;	/* version of node */
1325 	uint32_t	descr_len;	/* length of description string */
1326 	char		descr_str[1];	/* not really 1...see above */
1327 };
1328 
1329 #define __sysc_desc_roundup(x) ((((x) - 1) | (sizeof(int32_t) - 1)) + 1)
1330 #define __sysc_desc_adv(d, l) \
1331 	(/*XXXUNCONST ptr cast*/(struct sysctldesc *) \
1332 	__UNCONST(((const char*)(d)) + offsetof(struct sysctldesc, descr_str) +\
1333 		__sysc_desc_roundup(l)))
1334 #define NEXT_DESCR(d) __sysc_desc_adv((d), (d)->descr_len)
1335 
1336 static __inline const struct sysctlnode *
1337 sysctl_rootof(const struct sysctlnode *n)
1338 {
1339 	while (n->sysctl_parent != NULL)
1340 		n = n->sysctl_parent;
1341 	return (n);
1342 }
1343 
1344 #endif	/* !_SYS_SYSCTL_H_ */
1345