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