xref: /f-stack/freebsd/sys/kernel.h (revision 22ce4aff)
1a9643ea8Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-4-Clause
3*22ce4affSfengbojiang  *
4a9643ea8Slogwang  * Copyright (c) 1995 Terrence R. Lambert
5a9643ea8Slogwang  * All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Copyright (c) 1990, 1993
8a9643ea8Slogwang  *	The Regents of the University of California.  All rights reserved.
9a9643ea8Slogwang  * (c) UNIX System Laboratories, Inc.
10a9643ea8Slogwang  * All or some portions of this file are derived from material licensed
11a9643ea8Slogwang  * to the University of California by American Telephone and Telegraph
12a9643ea8Slogwang  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
13a9643ea8Slogwang  * the permission of UNIX System Laboratories, Inc.
14a9643ea8Slogwang  *
15a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
16a9643ea8Slogwang  * modification, are permitted provided that the following conditions
17a9643ea8Slogwang  * are met:
18a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
19a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
20a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
21a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
22a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
23a9643ea8Slogwang  * 3. All advertising materials mentioning features or use of this software
24a9643ea8Slogwang  *    must display the following acknowledgement:
25a9643ea8Slogwang  *	This product includes software developed by the University of
26a9643ea8Slogwang  *	California, Berkeley and its contributors.
27a9643ea8Slogwang  * 4. Neither the name of the University nor the names of its contributors
28a9643ea8Slogwang  *    may be used to endorse or promote products derived from this software
29a9643ea8Slogwang  *    without specific prior written permission.
30a9643ea8Slogwang  *
31a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
32a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
35a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
40a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41a9643ea8Slogwang  * SUCH DAMAGE.
42a9643ea8Slogwang  *
43a9643ea8Slogwang  *	@(#)kernel.h	8.3 (Berkeley) 1/21/94
44a9643ea8Slogwang  * $FreeBSD$
45a9643ea8Slogwang  */
46a9643ea8Slogwang 
47a9643ea8Slogwang #ifndef _SYS_KERNEL_H_
48a9643ea8Slogwang #define	_SYS_KERNEL_H_
49a9643ea8Slogwang 
50a9643ea8Slogwang #include <sys/linker_set.h>
51a9643ea8Slogwang 
52a9643ea8Slogwang #ifdef _KERNEL
53a9643ea8Slogwang 
54a9643ea8Slogwang /* for intrhook below */
55a9643ea8Slogwang #include <sys/queue.h>
56a9643ea8Slogwang 
57*22ce4affSfengbojiang /* for timestamping SYSINITs; other files may assume this is included here */
58*22ce4affSfengbojiang #include <sys/tslog.h>
59*22ce4affSfengbojiang 
60a9643ea8Slogwang /* Global variables for the kernel. */
61a9643ea8Slogwang 
62a9643ea8Slogwang /* 1.1 */
63a9643ea8Slogwang extern char kernelname[MAXPATHLEN];
64a9643ea8Slogwang 
65a9643ea8Slogwang extern int tick;			/* usec per tick (1000000 / hz) */
66a9643ea8Slogwang extern int hz;				/* system clock's frequency */
67a9643ea8Slogwang extern int psratio;			/* ratio: prof / stat */
68a9643ea8Slogwang extern int stathz;			/* statistics clock's frequency */
69a9643ea8Slogwang extern int profhz;			/* profiling clock's frequency */
70a9643ea8Slogwang extern int profprocs;			/* number of process's profiling */
71a9643ea8Slogwang extern volatile int ticks;
72a9643ea8Slogwang 
73a9643ea8Slogwang #endif /* _KERNEL */
74a9643ea8Slogwang 
75a9643ea8Slogwang /*
76a9643ea8Slogwang  * Enumerated types for known system startup interfaces.
77a9643ea8Slogwang  *
78a9643ea8Slogwang  * Startup occurs in ascending numeric order; the list entries are
79a9643ea8Slogwang  * sorted prior to attempting startup to guarantee order.  Items
80a9643ea8Slogwang  * of the same level are arbitrated for order based on the 'order'
81a9643ea8Slogwang  * element.
82a9643ea8Slogwang  *
83a9643ea8Slogwang  * These numbers are arbitrary and are chosen ONLY for ordering; the
84a9643ea8Slogwang  * enumeration values are explicit rather than implicit to provide
85a9643ea8Slogwang  * for binary compatibility with inserted elements.
86a9643ea8Slogwang  *
87a9643ea8Slogwang  * The SI_SUB_LAST value must have the highest lexical value.
88a9643ea8Slogwang  */
89a9643ea8Slogwang enum sysinit_sub_id {
90a9643ea8Slogwang 	SI_SUB_DUMMY		= 0x0000000,	/* not executed; for linker*/
91a9643ea8Slogwang 	SI_SUB_DONE		= 0x0000001,	/* processed*/
92a9643ea8Slogwang 	SI_SUB_TUNABLES		= 0x0700000,	/* establish tunable values */
93a9643ea8Slogwang 	SI_SUB_COPYRIGHT	= 0x0800001,	/* first use of console*/
94a9643ea8Slogwang 	SI_SUB_VM		= 0x1000000,	/* virtual memory system init */
95*22ce4affSfengbojiang 	SI_SUB_COUNTER		= 0x1100000,	/* counter(9) is initialized */
96a9643ea8Slogwang 	SI_SUB_KMEM		= 0x1800000,	/* kernel memory*/
97a9643ea8Slogwang 	SI_SUB_HYPERVISOR	= 0x1A40000,	/*
98a9643ea8Slogwang 						 * Hypervisor detection and
99a9643ea8Slogwang 						 * virtualization support
100a9643ea8Slogwang 						 * setup.
101a9643ea8Slogwang 						 */
102a9643ea8Slogwang 	SI_SUB_WITNESS		= 0x1A80000,	/* witness initialization */
103a9643ea8Slogwang 	SI_SUB_MTX_POOL_DYNAMIC	= 0x1AC0000,	/* dynamic mutex pool */
104a9643ea8Slogwang 	SI_SUB_LOCK		= 0x1B00000,	/* various locks */
105a9643ea8Slogwang 	SI_SUB_EVENTHANDLER	= 0x1C00000,	/* eventhandler init */
106a9643ea8Slogwang 	SI_SUB_VNET_PRELINK	= 0x1E00000,	/* vnet init before modules */
107a9643ea8Slogwang 	SI_SUB_KLD		= 0x2000000,	/* KLD and module setup */
108a9643ea8Slogwang 	SI_SUB_CPU		= 0x2100000,	/* CPU resource(s)*/
109a9643ea8Slogwang 	SI_SUB_RACCT		= 0x2110000,	/* resource accounting */
110a9643ea8Slogwang 	SI_SUB_KDTRACE		= 0x2140000,	/* Kernel dtrace hooks */
111a9643ea8Slogwang 	SI_SUB_RANDOM		= 0x2160000,	/* random number generator */
112a9643ea8Slogwang 	SI_SUB_MAC		= 0x2180000,	/* TrustedBSD MAC subsystem */
113a9643ea8Slogwang 	SI_SUB_MAC_POLICY	= 0x21C0000,	/* TrustedBSD MAC policies */
114a9643ea8Slogwang 	SI_SUB_MAC_LATE		= 0x21D0000,	/* TrustedBSD MAC subsystem */
115a9643ea8Slogwang 	SI_SUB_VNET		= 0x21E0000,	/* vnet 0 */
116a9643ea8Slogwang 	SI_SUB_INTRINSIC	= 0x2200000,	/* proc 0*/
117a9643ea8Slogwang 	SI_SUB_VM_CONF		= 0x2300000,	/* config VM, set limits*/
118a9643ea8Slogwang 	SI_SUB_DDB_SERVICES	= 0x2380000,	/* capture, scripting, etc. */
119a9643ea8Slogwang 	SI_SUB_RUN_QUEUE	= 0x2400000,	/* set up run queue*/
120a9643ea8Slogwang 	SI_SUB_KTRACE		= 0x2480000,	/* ktrace */
121a9643ea8Slogwang 	SI_SUB_OPENSOLARIS	= 0x2490000,	/* OpenSolaris compatibility */
122a9643ea8Slogwang 	SI_SUB_AUDIT		= 0x24C0000,	/* audit */
123a9643ea8Slogwang 	SI_SUB_CREATE_INIT	= 0x2500000,	/* create init process*/
124a9643ea8Slogwang 	SI_SUB_SCHED_IDLE	= 0x2600000,	/* required idle procs */
125a9643ea8Slogwang 	SI_SUB_MBUF		= 0x2700000,	/* mbuf subsystem */
126a9643ea8Slogwang 	SI_SUB_INTR		= 0x2800000,	/* interrupt threads */
127*22ce4affSfengbojiang 	SI_SUB_TASKQ		= 0x2880000,	/* task queues */
128*22ce4affSfengbojiang 	SI_SUB_EPOCH		= 0x2888000,	/* epoch subsystem */
129a9643ea8Slogwang #ifdef EARLY_AP_STARTUP
130a9643ea8Slogwang 	SI_SUB_SMP		= 0x2900000,	/* start the APs*/
131a9643ea8Slogwang #endif
132a9643ea8Slogwang 	SI_SUB_SOFTINTR		= 0x2A00000,	/* start soft interrupt thread */
133a9643ea8Slogwang 	SI_SUB_DEVFS		= 0x2F00000,	/* devfs ready for devices */
134a9643ea8Slogwang 	SI_SUB_INIT_IF		= 0x3000000,	/* prep for net interfaces */
135a9643ea8Slogwang 	SI_SUB_NETGRAPH		= 0x3010000,	/* Let Netgraph initialize */
136a9643ea8Slogwang 	SI_SUB_DTRACE		= 0x3020000,	/* DTrace subsystem */
137a9643ea8Slogwang 	SI_SUB_DTRACE_PROVIDER	= 0x3048000,	/* DTrace providers */
138a9643ea8Slogwang 	SI_SUB_DTRACE_ANON	= 0x308C000,	/* DTrace anon enabling */
139a9643ea8Slogwang 	SI_SUB_DRIVERS		= 0x3100000,	/* Let Drivers initialize */
140a9643ea8Slogwang 	SI_SUB_CONFIGURE	= 0x3800000,	/* Configure devices */
141a9643ea8Slogwang 	SI_SUB_VFS		= 0x4000000,	/* virtual filesystem*/
142a9643ea8Slogwang 	SI_SUB_CLOCKS		= 0x4800000,	/* real time and stat clocks*/
143a9643ea8Slogwang 	SI_SUB_SYSV_SHM		= 0x6400000,	/* System V shared memory*/
144a9643ea8Slogwang 	SI_SUB_SYSV_SEM		= 0x6800000,	/* System V semaphores*/
145a9643ea8Slogwang 	SI_SUB_SYSV_MSG		= 0x6C00000,	/* System V message queues*/
146a9643ea8Slogwang 	SI_SUB_P1003_1B		= 0x6E00000,	/* P1003.1B realtime */
147a9643ea8Slogwang 	SI_SUB_PSEUDO		= 0x7000000,	/* pseudo devices*/
148a9643ea8Slogwang 	SI_SUB_EXEC		= 0x7400000,	/* execve() handlers */
149a9643ea8Slogwang 	SI_SUB_PROTO_BEGIN	= 0x8000000,	/* VNET initialization */
150a9643ea8Slogwang 	SI_SUB_PROTO_PFIL	= 0x8100000,	/* Initialize pfil before FWs */
151a9643ea8Slogwang 	SI_SUB_PROTO_IF		= 0x8400000,	/* interfaces*/
152a9643ea8Slogwang 	SI_SUB_PROTO_DOMAININIT	= 0x8600000,	/* domain registration system */
153a9643ea8Slogwang 	SI_SUB_PROTO_MC		= 0x8700000,	/* Multicast */
154a9643ea8Slogwang 	SI_SUB_PROTO_DOMAIN	= 0x8800000,	/* domains (address families?)*/
155a9643ea8Slogwang 	SI_SUB_PROTO_FIREWALL	= 0x8806000,	/* Firewalls */
156a9643ea8Slogwang 	SI_SUB_PROTO_IFATTACHDOMAIN = 0x8808000,/* domain dependent data init */
157a9643ea8Slogwang 	SI_SUB_PROTO_END	= 0x8ffffff,	/* VNET helper functions */
158a9643ea8Slogwang 	SI_SUB_KPROF		= 0x9000000,	/* kernel profiling*/
159a9643ea8Slogwang 	SI_SUB_KICK_SCHEDULER	= 0xa000000,	/* start the timeout events*/
160a9643ea8Slogwang 	SI_SUB_INT_CONFIG_HOOKS	= 0xa800000,	/* Interrupts enabled config */
161a9643ea8Slogwang 	SI_SUB_ROOT_CONF	= 0xb000000,	/* Find root devices */
162a9643ea8Slogwang 	SI_SUB_INTRINSIC_POST	= 0xd000000,	/* proc 0 cleanup*/
163a9643ea8Slogwang 	SI_SUB_SYSCALLS		= 0xd800000,	/* register system calls */
164a9643ea8Slogwang 	SI_SUB_VNET_DONE	= 0xdc00000,	/* vnet registration complete */
165a9643ea8Slogwang 	SI_SUB_KTHREAD_INIT	= 0xe000000,	/* init process*/
166a9643ea8Slogwang 	SI_SUB_KTHREAD_PAGE	= 0xe400000,	/* pageout daemon*/
167a9643ea8Slogwang 	SI_SUB_KTHREAD_VM	= 0xe800000,	/* vm daemon*/
168a9643ea8Slogwang 	SI_SUB_KTHREAD_BUF	= 0xea00000,	/* buffer daemon*/
169a9643ea8Slogwang 	SI_SUB_KTHREAD_UPDATE	= 0xec00000,	/* update daemon*/
170a9643ea8Slogwang 	SI_SUB_KTHREAD_IDLE	= 0xee00000,	/* idle procs*/
171a9643ea8Slogwang #ifndef EARLY_AP_STARTUP
172a9643ea8Slogwang 	SI_SUB_SMP		= 0xf000000,	/* start the APs*/
173a9643ea8Slogwang #endif
174a9643ea8Slogwang 	SI_SUB_RACCTD		= 0xf100000,	/* start racctd*/
175a9643ea8Slogwang 	SI_SUB_LAST		= 0xfffffff	/* final initialization */
176a9643ea8Slogwang };
177a9643ea8Slogwang 
178a9643ea8Slogwang /*
179a9643ea8Slogwang  * Some enumerated orders; "ANY" sorts last.
180a9643ea8Slogwang  */
181a9643ea8Slogwang enum sysinit_elem_order {
182a9643ea8Slogwang 	SI_ORDER_FIRST		= 0x0000000,	/* first*/
183a9643ea8Slogwang 	SI_ORDER_SECOND		= 0x0000001,	/* second*/
184a9643ea8Slogwang 	SI_ORDER_THIRD		= 0x0000002,	/* third*/
185a9643ea8Slogwang 	SI_ORDER_FOURTH		= 0x0000003,	/* fourth*/
186*22ce4affSfengbojiang 	SI_ORDER_FIFTH		= 0x0000004,	/* fifth*/
187*22ce4affSfengbojiang 	SI_ORDER_SIXTH		= 0x0000005,	/* sixth*/
188*22ce4affSfengbojiang 	SI_ORDER_SEVENTH	= 0x0000006,	/* seventh*/
189*22ce4affSfengbojiang 	SI_ORDER_EIGHTH		= 0x0000007,	/* eighth*/
190a9643ea8Slogwang 	SI_ORDER_MIDDLE		= 0x1000000,	/* somewhere in the middle */
191a9643ea8Slogwang 	SI_ORDER_ANY		= 0xfffffff	/* last*/
192a9643ea8Slogwang };
193a9643ea8Slogwang 
194a9643ea8Slogwang /*
195a9643ea8Slogwang  * A system initialization call instance
196a9643ea8Slogwang  *
197a9643ea8Slogwang  * At the moment there is one instance of sysinit.  We probably do not
198a9643ea8Slogwang  * want two which is why this code is if'd out, but we definitely want
199a9643ea8Slogwang  * to discern SYSINIT's which take non-constant data pointers and
200a9643ea8Slogwang  * SYSINIT's which take constant data pointers,
201a9643ea8Slogwang  *
202a9643ea8Slogwang  * The C_* macros take functions expecting const void * arguments
203a9643ea8Slogwang  * while the non-C_* macros take functions expecting just void * arguments.
204a9643ea8Slogwang  *
205a9643ea8Slogwang  * With -Wcast-qual on, the compiler issues warnings:
206a9643ea8Slogwang  *	- if we pass non-const data or functions taking non-const data
207a9643ea8Slogwang  *	  to a C_* macro.
208a9643ea8Slogwang  *
209a9643ea8Slogwang  *	- if we pass const data to the normal macros
210a9643ea8Slogwang  *
211a9643ea8Slogwang  * However, no warning is issued if we pass a function taking const data
212a9643ea8Slogwang  * through a normal non-const macro.  This is ok because the function is
213a9643ea8Slogwang  * saying it won't modify the data so we don't care whether the data is
214a9643ea8Slogwang  * modifiable or not.
215a9643ea8Slogwang  */
216a9643ea8Slogwang 
217a9643ea8Slogwang typedef void (*sysinit_nfunc_t)(void *);
218a9643ea8Slogwang typedef void (*sysinit_cfunc_t)(const void *);
219a9643ea8Slogwang 
220a9643ea8Slogwang struct sysinit {
221a9643ea8Slogwang 	enum sysinit_sub_id	subsystem;	/* subsystem identifier*/
222a9643ea8Slogwang 	enum sysinit_elem_order	order;		/* init order within subsystem*/
223a9643ea8Slogwang 	sysinit_cfunc_t func;			/* function		*/
224a9643ea8Slogwang 	const void	*udata;			/* multiplexer/argument */
225a9643ea8Slogwang };
226a9643ea8Slogwang 
227a9643ea8Slogwang /*
228a9643ea8Slogwang  * Default: no special processing
229a9643ea8Slogwang  *
230a9643ea8Slogwang  * The C_ version of SYSINIT is for data pointers to const
231a9643ea8Slogwang  * data ( and functions taking data pointers to const data ).
232a9643ea8Slogwang  * At the moment it is no different from SYSINIT and thus
233a9643ea8Slogwang  * still results in warnings.
234a9643ea8Slogwang  *
235a9643ea8Slogwang  * The casts are necessary to have the compiler produce the
236a9643ea8Slogwang  * correct warnings when -Wcast-qual is used.
237a9643ea8Slogwang  *
238a9643ea8Slogwang  */
239*22ce4affSfengbojiang #ifdef TSLOG
240*22ce4affSfengbojiang struct sysinit_tslog {
241*22ce4affSfengbojiang 	sysinit_cfunc_t func;
242*22ce4affSfengbojiang 	const void * data;
243*22ce4affSfengbojiang 	const char * name;
244*22ce4affSfengbojiang };
245*22ce4affSfengbojiang static inline void
sysinit_tslog_shim(const void * data)246*22ce4affSfengbojiang sysinit_tslog_shim(const void * data)
247*22ce4affSfengbojiang {
248*22ce4affSfengbojiang 	const struct sysinit_tslog * x = data;
249*22ce4affSfengbojiang 
250*22ce4affSfengbojiang 	TSRAW(curthread, TS_ENTER, "SYSINIT", x->name);
251*22ce4affSfengbojiang 	(x->func)(x->data);
252*22ce4affSfengbojiang 	TSRAW(curthread, TS_EXIT, "SYSINIT", x->name);
253*22ce4affSfengbojiang }
254*22ce4affSfengbojiang #define	C_SYSINIT(uniquifier, subsystem, order, func, ident)	\
255*22ce4affSfengbojiang 	static struct sysinit_tslog uniquifier ## _sys_init_tslog = {	\
256*22ce4affSfengbojiang 		func,						\
257*22ce4affSfengbojiang 		(ident),					\
258*22ce4affSfengbojiang 		#uniquifier					\
259*22ce4affSfengbojiang 	};							\
260*22ce4affSfengbojiang 	static struct sysinit uniquifier ## _sys_init = {	\
261*22ce4affSfengbojiang 		subsystem,					\
262*22ce4affSfengbojiang 		order,						\
263*22ce4affSfengbojiang 		sysinit_tslog_shim,				\
264*22ce4affSfengbojiang 		&uniquifier ## _sys_init_tslog			\
265*22ce4affSfengbojiang 	};							\
266*22ce4affSfengbojiang 	DATA_WSET(sysinit_set,uniquifier ## _sys_init)
267*22ce4affSfengbojiang #else
268a9643ea8Slogwang #define	C_SYSINIT(uniquifier, subsystem, order, func, ident)	\
269a9643ea8Slogwang 	static struct sysinit uniquifier ## _sys_init = {	\
270a9643ea8Slogwang 		subsystem,					\
271a9643ea8Slogwang 		order,						\
272a9643ea8Slogwang 		func,						\
273a9643ea8Slogwang 		(ident)						\
274a9643ea8Slogwang 	};							\
275*22ce4affSfengbojiang 	DATA_WSET(sysinit_set,uniquifier ## _sys_init)
276*22ce4affSfengbojiang #endif
277a9643ea8Slogwang 
278a9643ea8Slogwang #define	SYSINIT(uniquifier, subsystem, order, func, ident)	\
279a9643ea8Slogwang 	C_SYSINIT(uniquifier, subsystem, order,			\
280a9643ea8Slogwang 	(sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)(ident))
281a9643ea8Slogwang 
282a9643ea8Slogwang /*
283a9643ea8Slogwang  * Called on module unload: no special processing
284a9643ea8Slogwang  */
285a9643ea8Slogwang #define	C_SYSUNINIT(uniquifier, subsystem, order, func, ident)	\
286a9643ea8Slogwang 	static struct sysinit uniquifier ## _sys_uninit = {	\
287a9643ea8Slogwang 		subsystem,					\
288a9643ea8Slogwang 		order,						\
289a9643ea8Slogwang 		func,						\
290a9643ea8Slogwang 		(ident)						\
291a9643ea8Slogwang 	};							\
292*22ce4affSfengbojiang 	DATA_WSET(sysuninit_set,uniquifier ## _sys_uninit)
293a9643ea8Slogwang 
294a9643ea8Slogwang #define	SYSUNINIT(uniquifier, subsystem, order, func, ident)	\
295a9643ea8Slogwang 	C_SYSUNINIT(uniquifier, subsystem, order,		\
296a9643ea8Slogwang 	(sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)(ident))
297a9643ea8Slogwang 
298a9643ea8Slogwang void	sysinit_add(struct sysinit **set, struct sysinit **set_end);
299a9643ea8Slogwang 
300*22ce4affSfengbojiang #ifdef _KERNEL
301*22ce4affSfengbojiang 
302a9643ea8Slogwang /*
303a9643ea8Slogwang  * Infrastructure for tunable 'constants'.  Value may be specified at compile
304a9643ea8Slogwang  * time or kernel load time.  Rules relating tunables together can be placed
305a9643ea8Slogwang  * in a SYSINIT function at SI_SUB_TUNABLES with SI_ORDER_ANY.
306a9643ea8Slogwang  *
307a9643ea8Slogwang  * WARNING: developers should never use the reserved suffixes specified in
308a9643ea8Slogwang  * loader.conf(5) for any tunables or conflicts will result.
309a9643ea8Slogwang  */
310a9643ea8Slogwang 
311a9643ea8Slogwang /*
312a9643ea8Slogwang  * int
313a9643ea8Slogwang  * please avoid using for new tunables!
314a9643ea8Slogwang  */
315a9643ea8Slogwang extern void tunable_int_init(void *);
316a9643ea8Slogwang struct tunable_int {
317a9643ea8Slogwang 	const char *path;
318a9643ea8Slogwang 	int *var;
319a9643ea8Slogwang };
320a9643ea8Slogwang #define	TUNABLE_INT(path, var)					\
321a9643ea8Slogwang 	static struct tunable_int __CONCAT(__tunable_int_, __LINE__) = { \
322a9643ea8Slogwang 		(path),						\
323a9643ea8Slogwang 		(var),						\
324a9643ea8Slogwang 	};							\
325a9643ea8Slogwang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
326a9643ea8Slogwang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_int_init,	\
327a9643ea8Slogwang 	    &__CONCAT(__tunable_int_, __LINE__))
328a9643ea8Slogwang 
329a9643ea8Slogwang #define	TUNABLE_INT_FETCH(path, var)	getenv_int((path), (var))
330a9643ea8Slogwang 
331a9643ea8Slogwang /*
332a9643ea8Slogwang  * long
333a9643ea8Slogwang  */
334a9643ea8Slogwang extern void tunable_long_init(void *);
335a9643ea8Slogwang struct tunable_long {
336a9643ea8Slogwang 	const char *path;
337a9643ea8Slogwang 	long *var;
338a9643ea8Slogwang };
339a9643ea8Slogwang #define	TUNABLE_LONG(path, var)					\
340a9643ea8Slogwang 	static struct tunable_long __CONCAT(__tunable_long_, __LINE__) = { \
341a9643ea8Slogwang 		(path),						\
342a9643ea8Slogwang 		(var),						\
343a9643ea8Slogwang 	};							\
344a9643ea8Slogwang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
345a9643ea8Slogwang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_long_init,\
346a9643ea8Slogwang 	    &__CONCAT(__tunable_long_, __LINE__))
347a9643ea8Slogwang 
348a9643ea8Slogwang #define	TUNABLE_LONG_FETCH(path, var)	getenv_long((path), (var))
349a9643ea8Slogwang 
350a9643ea8Slogwang /*
351a9643ea8Slogwang  * unsigned long
352a9643ea8Slogwang  */
353a9643ea8Slogwang extern void tunable_ulong_init(void *);
354a9643ea8Slogwang struct tunable_ulong {
355a9643ea8Slogwang 	const char *path;
356a9643ea8Slogwang 	unsigned long *var;
357a9643ea8Slogwang };
358a9643ea8Slogwang #define	TUNABLE_ULONG(path, var)				\
359a9643ea8Slogwang 	static struct tunable_ulong __CONCAT(__tunable_ulong_, __LINE__) = { \
360a9643ea8Slogwang 		(path),						\
361a9643ea8Slogwang 		(var),						\
362a9643ea8Slogwang 	};							\
363a9643ea8Slogwang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
364a9643ea8Slogwang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_ulong_init, \
365a9643ea8Slogwang 	    &__CONCAT(__tunable_ulong_, __LINE__))
366a9643ea8Slogwang 
367a9643ea8Slogwang #define	TUNABLE_ULONG_FETCH(path, var)	getenv_ulong((path), (var))
368a9643ea8Slogwang 
369a9643ea8Slogwang /*
370a9643ea8Slogwang  * int64_t
371a9643ea8Slogwang  */
372a9643ea8Slogwang extern void tunable_int64_init(void *);
373a9643ea8Slogwang struct tunable_int64 {
374a9643ea8Slogwang 	const char *path;
375a9643ea8Slogwang 	int64_t *var;
376a9643ea8Slogwang };
377a9643ea8Slogwang #define	TUNABLE_INT64(path, var)				\
378a9643ea8Slogwang 	static struct tunable_int64 __CONCAT(__tunable_int64_, __LINE__) = { \
379a9643ea8Slogwang 		(path),						\
380a9643ea8Slogwang 		(var),						\
381a9643ea8Slogwang 	};							\
382a9643ea8Slogwang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
383a9643ea8Slogwang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_int64_init, \
384a9643ea8Slogwang 	    &__CONCAT(__tunable_int64_, __LINE__))
385a9643ea8Slogwang 
386a9643ea8Slogwang #define	TUNABLE_INT64_FETCH(path, var)	getenv_int64((path), (var))
387a9643ea8Slogwang 
388a9643ea8Slogwang /*
389a9643ea8Slogwang  * uint64_t
390a9643ea8Slogwang  */
391a9643ea8Slogwang extern void tunable_uint64_init(void *);
392a9643ea8Slogwang struct tunable_uint64 {
393a9643ea8Slogwang 	const char *path;
394a9643ea8Slogwang 	uint64_t *var;
395a9643ea8Slogwang };
396a9643ea8Slogwang #define	TUNABLE_UINT64(path, var)				\
397*22ce4affSfengbojiang 	static struct tunable_uint64 __CONCAT(__tunable_uint64_, __LINE__) = { \
398a9643ea8Slogwang 		(path),						\
399a9643ea8Slogwang 		(var),						\
400a9643ea8Slogwang 	};							\
401a9643ea8Slogwang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
402a9643ea8Slogwang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_uint64_init, \
403a9643ea8Slogwang 	    &__CONCAT(__tunable_uint64_, __LINE__))
404a9643ea8Slogwang 
405a9643ea8Slogwang #define	TUNABLE_UINT64_FETCH(path, var)	getenv_uint64((path), (var))
406a9643ea8Slogwang 
407a9643ea8Slogwang /*
408a9643ea8Slogwang  * quad
409a9643ea8Slogwang  */
410a9643ea8Slogwang extern void tunable_quad_init(void *);
411a9643ea8Slogwang struct tunable_quad {
412a9643ea8Slogwang 	const char *path;
413a9643ea8Slogwang 	quad_t *var;
414a9643ea8Slogwang };
415a9643ea8Slogwang #define	TUNABLE_QUAD(path, var)					\
416a9643ea8Slogwang 	static struct tunable_quad __CONCAT(__tunable_quad_, __LINE__) = { \
417a9643ea8Slogwang 		(path),						\
418a9643ea8Slogwang 		(var),						\
419a9643ea8Slogwang 	};							\
420a9643ea8Slogwang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
421a9643ea8Slogwang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_quad_init, \
422a9643ea8Slogwang 	    &__CONCAT(__tunable_quad_, __LINE__))
423a9643ea8Slogwang 
424a9643ea8Slogwang #define	TUNABLE_QUAD_FETCH(path, var)	getenv_quad((path), (var))
425a9643ea8Slogwang 
426*22ce4affSfengbojiang /*
427*22ce4affSfengbojiang  * bool
428*22ce4affSfengbojiang  */
429*22ce4affSfengbojiang extern void tunable_bool_init(void *);
430*22ce4affSfengbojiang struct tunable_bool {
431*22ce4affSfengbojiang 	const char *path;
432*22ce4affSfengbojiang 	bool *var;
433*22ce4affSfengbojiang };
434*22ce4affSfengbojiang #define	TUNABLE_BOOL(path, var) \
435*22ce4affSfengbojiang 	static struct tunable_bool __CONCAT(__tunable_bool_, __LINE__) = { \
436*22ce4affSfengbojiang 		(path),						\
437*22ce4affSfengbojiang 		(var),						\
438*22ce4affSfengbojiang 	};							\
439*22ce4affSfengbojiang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
440*22ce4affSfengbojiang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_bool_init, \
441*22ce4affSfengbojiang 	    &__CONCAT(__tunable_bool_, __LINE__))
442*22ce4affSfengbojiang 
443*22ce4affSfengbojiang #define	TUNABLE_BOOL_FETCH(path, var)	getenv_bool((path), (var))
444*22ce4affSfengbojiang 
445a9643ea8Slogwang extern void tunable_str_init(void *);
446a9643ea8Slogwang struct tunable_str {
447a9643ea8Slogwang 	const char *path;
448a9643ea8Slogwang 	char *var;
449a9643ea8Slogwang 	int size;
450a9643ea8Slogwang };
451a9643ea8Slogwang #define	TUNABLE_STR(path, var, size)				\
452a9643ea8Slogwang 	static struct tunable_str __CONCAT(__tunable_str_, __LINE__) = { \
453a9643ea8Slogwang 		(path),						\
454a9643ea8Slogwang 		(var),						\
455a9643ea8Slogwang 		(size),						\
456a9643ea8Slogwang 	};							\
457a9643ea8Slogwang 	SYSINIT(__CONCAT(__Tunable_init_, __LINE__),		\
458a9643ea8Slogwang 	    SI_SUB_TUNABLES, SI_ORDER_MIDDLE, tunable_str_init,	\
459a9643ea8Slogwang 	    &__CONCAT(__tunable_str_, __LINE__))
460a9643ea8Slogwang 
461a9643ea8Slogwang #define	TUNABLE_STR_FETCH(path, var, size)			\
462a9643ea8Slogwang 	getenv_string((path), (var), (size))
463a9643ea8Slogwang 
464*22ce4affSfengbojiang #endif /* _KERNEL */
465*22ce4affSfengbojiang 
466*22ce4affSfengbojiang typedef void (*ich_func_t)(void *_arg);
467*22ce4affSfengbojiang 
468a9643ea8Slogwang struct intr_config_hook {
469a9643ea8Slogwang 	TAILQ_ENTRY(intr_config_hook) ich_links;
470*22ce4affSfengbojiang 	ich_func_t	ich_func;
471a9643ea8Slogwang 	void		*ich_arg;
472a9643ea8Slogwang };
473a9643ea8Slogwang 
474a9643ea8Slogwang int	config_intrhook_establish(struct intr_config_hook *hook);
475a9643ea8Slogwang void	config_intrhook_disestablish(struct intr_config_hook *hook);
476*22ce4affSfengbojiang void	config_intrhook_oneshot(ich_func_t _func, void *_arg);
477a9643ea8Slogwang 
478a9643ea8Slogwang #endif /* !_SYS_KERNEL_H_*/
479