| Commit | Line | Data |
|---|---|---|
| 984263bc MD |
1 | /*- |
| 2 | * Copyright (c) 1995 Terrence R. Lambert | |
| 3 | * All rights reserved. | |
| 4 | * | |
| 5 | * Copyright (c) 1990, 1993 | |
| 6 | * The Regents of the University of California. All rights reserved. | |
| 7 | * (c) UNIX System Laboratories, Inc. | |
| 8 | * All or some portions of this file are derived from material licensed | |
| 9 | * to the University of California by American Telephone and Telegraph | |
| 10 | * Co. or Unix System Laboratories, Inc. and are reproduced herein with | |
| 11 | * the permission of UNIX System Laboratories, Inc. | |
| 12 | * | |
| 13 | * Redistribution and use in source and binary forms, with or without | |
| 14 | * modification, are permitted provided that the following conditions | |
| 15 | * are met: | |
| 16 | * 1. Redistributions of source code must retain the above copyright | |
| 17 | * notice, this list of conditions and the following disclaimer. | |
| 18 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 19 | * notice, this list of conditions and the following disclaimer in the | |
| 20 | * documentation and/or other materials provided with the distribution. | |
| 21 | * 3. All advertising materials mentioning features or use of this software | |
| 22 | * must display the following acknowledgement: | |
| 23 | * This product includes software developed by the University of | |
| 24 | * California, Berkeley and its contributors. | |
| 25 | * 4. Neither the name of the University nor the names of its contributors | |
| 26 | * may be used to endorse or promote products derived from this software | |
| 27 | * without specific prior written permission. | |
| 28 | * | |
| 29 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
| 30 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 31 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 32 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
| 33 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 34 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| 35 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| 36 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 37 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 38 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 39 | * SUCH DAMAGE. | |
| 40 | * | |
| 41 | * @(#)kernel.h 8.3 (Berkeley) 1/21/94 | |
| 42 | * $FreeBSD: src/sys/sys/kernel.h,v 1.63.2.9 2002/07/02 23:00:30 archie Exp $ | |
| 4c202dcc | 43 | * $DragonFly: src/sys/sys/kernel.h,v 1.32 2008/08/25 17:11:23 dillon Exp $ |
| 984263bc MD |
44 | */ |
| 45 | ||
| 46 | #ifndef _SYS_KERNEL_H_ | |
| 47 | #define _SYS_KERNEL_H_ | |
| 48 | ||
| 03d6a592 MD |
49 | #ifndef _KERNEL |
| 50 | #error "This file should not be included by userland programs." | |
| 51 | #else | |
| 52 | ||
| 1bd40720 MD |
53 | #ifndef _SYS_PARAM_H_ |
| 54 | #include <sys/param.h> | |
| 55 | #endif | |
| 56 | #ifndef _SYS_LINKER_SET_H_ | |
| 984263bc | 57 | #include <sys/linker_set.h> |
| 1bd40720 | 58 | #endif |
| 984263bc | 59 | |
| 03d6a592 | 60 | #ifndef _SYS_QUEUE_H_ |
| 984263bc | 61 | #include <sys/queue.h> |
| 03d6a592 | 62 | #endif |
| 984263bc MD |
63 | |
| 64 | /* Global variables for the kernel. */ | |
| 65 | ||
| 66 | /* 1.1 */ | |
| 67 | extern unsigned long hostid; | |
| 68 | extern char hostname[MAXHOSTNAMELEN]; | |
| 69 | extern int hostnamelen; | |
| 70 | extern char domainname[MAXHOSTNAMELEN]; | |
| 71 | extern int domainnamelen; | |
| 72 | extern char kernelname[MAXPATHLEN]; | |
| 73 | ||
| 74 | /* 1.2 */ | |
| 88c4d2f6 | 75 | extern struct timespec boottime; |
| 984263bc MD |
76 | |
| 77 | extern struct timezone tz; /* XXX */ | |
| 78 | ||
| a591f597 MD |
79 | extern int ustick; /* usec per tick (1000000 / hz) */ |
| 80 | extern int nstick; /* nsec per tick (1000000000 / hz) */ | |
| 984263bc MD |
81 | extern int tickadj; /* "standard" clock skew, us./tick */ |
| 82 | extern int hz; /* system clock's frequency */ | |
| 83 | extern int psratio; /* ratio: prof / stat */ | |
| 84 | extern int stathz; /* statistics clock's frequency */ | |
| 85 | extern int profhz; /* profiling clock's frequency */ | |
| 86 | extern int ticks; | |
| 87 | extern int lbolt; /* once a second sleep address */ | |
| 50e4012a | 88 | extern void *lbolt_syncer; /* approx 1 hz but may be sped up */ |
| 984263bc | 89 | |
| 984263bc MD |
90 | /* |
| 91 | * Enumerated types for known system startup interfaces. | |
| 92 | * | |
| 93 | * Startup occurs in ascending numeric order; the list entries are | |
| 94 | * sorted prior to attempting startup to guarantee order. Items | |
| 95 | * of the same level are arbitrated for order based on the 'order' | |
| 96 | * element. | |
| 97 | * | |
| 98 | * These numbers are arbitrary and are chosen ONLY for ordering; the | |
| 99 | * enumeration values are explicit rather than implicit to provide | |
| 100 | * for binary compatibility with inserted elements. | |
| 101 | * | |
| 102 | * The SI_SUB_RUN_SCHEDULER value must have the highest lexical value. | |
| 984263bc MD |
103 | */ |
| 104 | enum sysinit_sub_id { | |
| ba39e2e0 MD |
105 | /* |
| 106 | * Special cased | |
| 107 | */ | |
| 108 | SI_SPECIAL_DUMMY = 0x0000000, /* not executed; for linker*/ | |
| 109 | SI_SPECIAL_DONE = 0x0000001, /* flag sysinit completion */ | |
| 110 | ||
| 111 | /* | |
| 112 | * Memory management subsystems. | |
| 113 | */ | |
| 114 | SI_BOOT1_TUNABLES = 0x0700000, /* establish tunable values */ | |
| 115 | SI_BOOT1_COPYRIGHT = 0x0800000, /* first use of console*/ | |
| 116 | SI_BOOT1_LOCK = 0x0900000, /* lockmgr locks and tokens */ | |
| 117 | SI_BOOT1_VM = 0x1000000, /* virtual memory system init*/ | |
| 118 | SI_BOOT1_ALLOCATOR = 0x1400000, /* slab allocator */ | |
| 119 | SI_BOOT1_KMALLOC = 0x1600000, /* kmalloc inits */ | |
| 120 | SI_BOOT1_POST = 0x1800000, /* post boot1 inits */ | |
| 121 | ||
| 122 | /* | |
| 123 | * Fickle ordering. objcache and softclock need to know what | |
| 124 | * ncpus is to initialize properly, clocks (e.g. hardclock) | |
| 125 | * need softclock to work, and we can't finish initializing | |
| 126 | * the APs until the system clock has been initialized. | |
| 127 | * Also, clock registration and smp configuration registration | |
| 128 | * must occur before SMP. Messy messy. | |
| 129 | */ | |
| 130 | SI_BOOT2_LEAVE_CRIT = 0x1900000, | |
| 7c006a9e SZ |
131 | SI_BOOT2_PRESMP = 0x1a00000, /* register SMP configs */ |
| 132 | SI_BOOT2_START_CPU = 0x1a40000, /* start CPU (BSP) */ | |
| 133 | SI_BOOT2_LAPIC = 0x1a50000, /* configure Local APIC */ | |
| 134 | SI_BOOT2_START_APS = 0x1a60000, /* start all APs */ | |
| 135 | SI_BOOT2_IOAPIC = 0x1a70000, /* configure I/O APIC */ | |
| 136 | SI_BOOT2_FINISH_PIC = 0x1a80000, /* finish PIC configure */ | |
| 137 | SI_BOOT2_FINISH_CPU = 0x1a90000, /* finish CPU startup */ | |
| 7ce8a225 | 138 | SI_BOOT2_CLOCKREG = 0x1ac0000, /* register available clocks */ |
| ba39e2e0 MD |
139 | SI_BOOT2_OBJCACHE = 0x1b00000, |
| 140 | SI_BOOT2_SOFTCLOCK = 0x1b80000, | |
| 141 | SI_BOOT2_CLOCKS = 0x1c00000, /* select & start clocks */ | |
| 142 | SI_BOOT2_FINISH_SMP = 0x1c80000, /* SMP go (& synch clocks) */ | |
| 143 | ||
| 144 | /* | |
| 145 | * Finish up core kernel initialization and set up the process | |
| 146 | * abstraction. | |
| 147 | */ | |
| 148 | SI_BOOT2_BIOS = 0x1d00000, | |
| 149 | SI_BOOT2_MACHDEP = 0x1d80000, | |
| 150 | SI_BOOT2_KLD = 0x1e00000, | |
| 151 | SI_BOOT2_USCHED = 0x1e80000, | |
| 152 | SI_BOOT2_PROC0 = 0x1f00000, | |
| 153 | ||
| 154 | /* | |
| 155 | * Continue with miscellanious system initialization | |
| 156 | */ | |
| 984263bc | 157 | SI_SUB_CREATE_INIT = 0x2300000, /* create the init process */ |
| b2632176 | 158 | SI_SUB_PRE_DRIVERS = 0x2380000, |
| 984263bc MD |
159 | SI_SUB_DRIVERS = 0x2400000, /* Let Drivers initialize */ |
| 160 | SI_SUB_CONFIGURE = 0x3800000, /* Configure devices */ | |
| dbcd0c9b | 161 | SI_SUB_ISWARM = 0x3c00000, /* No longer in cold boot */ |
| 984263bc | 162 | SI_SUB_VFS = 0x4000000, /* virtual file system*/ |
| 8b3ec75a | 163 | SI_SUB_HELPER_THREADS = 0x5400000, /* misc helper threads */ |
| 984263bc MD |
164 | SI_SUB_CLIST = 0x5800000, /* clists*/ |
| 165 | SI_SUB_SYSV_SHM = 0x6400000, /* System V shared memory*/ | |
| 166 | SI_SUB_SYSV_SEM = 0x6800000, /* System V semaphores*/ | |
| 167 | SI_SUB_SYSV_MSG = 0x6C00000, /* System V message queues*/ | |
| 168 | SI_SUB_P1003_1B = 0x6E00000, /* P1003.1B realtime */ | |
| 169 | SI_SUB_PSEUDO = 0x7000000, /* pseudo devices*/ | |
| 170 | SI_SUB_EXEC = 0x7400000, /* execve() handlers */ | |
| aabba8b4 MD |
171 | SI_SUB_PROTO_BEGIN = 0x8000000, /* network protocol pre-init */ |
| 172 | SI_SUB_PROTO_IF = 0x8400000, /* interfaces */ | |
| 984263bc | 173 | SI_SUB_PROTO_DOMAIN = 0x8800000, /* domains (address families?)*/ |
| aabba8b4 MD |
174 | SI_SUB_PROTO_IFATTACHDOMAIN |
| 175 | = 0x8800001, /* domain dependent data init */ | |
| 176 | SI_SUB_PROTO_END = 0x8ffffff, /* network protocol post-init */ | |
| 984263bc MD |
177 | SI_SUB_KPROF = 0x9000000, /* kernel profiling*/ |
| 178 | SI_SUB_KICK_SCHEDULER = 0xa000000, /* start the timeout events*/ | |
| 179 | SI_SUB_INT_CONFIG_HOOKS = 0xa800000, /* Interrupts enabled config */ | |
| ba39e2e0 MD |
180 | |
| 181 | /* | |
| 182 | * Root filesystem setup, finish up with the major system | |
| 183 | * demons. | |
| 184 | */ | |
| 984263bc MD |
185 | SI_SUB_ROOT_CONF = 0xb000000, /* Find root devices */ |
| 186 | SI_SUB_DUMP_CONF = 0xb200000, /* Find dump devices */ | |
| 5dbaf12c | 187 | SI_SUB_RAID = 0xb300000, /* Configure vinum */ |
| bcb8063b | 188 | SI_SUB_DM_TARGETS = 0xb3a0000, /* configure dm targets */ |
| 984263bc | 189 | SI_SUB_MOUNT_ROOT = 0xb400000, /* root mount*/ |
| ba39e2e0 | 190 | SI_SUB_PROC0_POST = 0xd000000, /* proc 0 cleanup*/ |
| 984263bc MD |
191 | SI_SUB_KTHREAD_INIT = 0xe000000, /* init process*/ |
| 192 | SI_SUB_KTHREAD_PAGE = 0xe400000, /* pageout daemon*/ | |
| 193 | SI_SUB_KTHREAD_VM = 0xe800000, /* vm daemon*/ | |
| 194 | SI_SUB_KTHREAD_BUF = 0xea00000, /* buffer daemon*/ | |
| 195 | SI_SUB_KTHREAD_UPDATE = 0xec00000, /* update daemon*/ | |
| 196 | SI_SUB_KTHREAD_IDLE = 0xee00000, /* idle procs*/ | |
| 984263bc MD |
197 | SI_SUB_RUN_SCHEDULER = 0xfffffff /* scheduler: no return*/ |
| 198 | }; | |
| 199 | ||
| 200 | ||
| 201 | /* | |
| 202 | * Some enumerated orders; "ANY" sorts last. | |
| 203 | */ | |
| 204 | enum sysinit_elem_order { | |
| 205 | SI_ORDER_FIRST = 0x0000000, /* first*/ | |
| 206 | SI_ORDER_SECOND = 0x0000001, /* second*/ | |
| 207 | SI_ORDER_THIRD = 0x0000002, /* third*/ | |
| 208 | SI_ORDER_MIDDLE = 0x1000000, /* somewhere in the middle */ | |
| 209 | SI_ORDER_ANY = 0xfffffff /* last*/ | |
| 210 | }; | |
| 211 | ||
| 212 | ||
| 213 | /* | |
| 214 | * A system initialization call instance | |
| 215 | * | |
| 216 | * At the moment there is one instance of sysinit. We probably do not | |
| 217 | * want two which is why this code is if'd out, but we definitely want | |
| 218 | * to discern SYSINIT's which take non-constant data pointers and | |
| 219 | * SYSINIT's which take constant data pointers, | |
| 220 | * | |
| 221 | * The C_* macros take functions expecting const void * arguments | |
| 222 | * while the non-C_* macros take functions expecting just void * arguments. | |
| 223 | * | |
| 224 | * With -Wcast-qual on, the compiler issues warnings: | |
| 225 | * - if we pass non-const data or functions taking non-const data | |
| 226 | * to a C_* macro. | |
| 227 | * | |
| 228 | * - if we pass const data to the normal macros | |
| 229 | * | |
| 230 | * However, no warning is issued if we pass a function taking const data | |
| 231 | * through a normal non-const macro. This is ok because the function is | |
| 232 | * saying it won't modify the data so we don't care whether the data is | |
| 233 | * modifiable or not. | |
| 234 | */ | |
| 235 | ||
| b153f746 RG |
236 | typedef void (*sysinit_nfunc_t) (void *); |
| 237 | typedef void (*sysinit_cfunc_t) (const void *); | |
| 984263bc MD |
238 | |
| 239 | struct sysinit { | |
| 240 | unsigned int subsystem; /* subsystem identifier*/ | |
| 241 | unsigned int order; /* init order within subsystem*/ | |
| 242 | sysinit_cfunc_t func; /* function */ | |
| 243 | const void *udata; /* multiplexer/argument */ | |
| 4c202dcc | 244 | const char *name; |
| 984263bc MD |
245 | }; |
| 246 | ||
| 247 | /* | |
| 248 | * Default: no special processing | |
| 249 | * | |
| 250 | * The C_ version of SYSINIT is for data pointers to const | |
| 251 | * data ( and functions taking data pointers to const data ). | |
| 252 | * At the moment it is no different from SYSINIT and thus | |
| 253 | * still results in warnings. | |
| 254 | * | |
| 255 | * The casts are necessary to have the compiler produce the | |
| 256 | * correct warnings when -Wcast-qual is used. | |
| 257 | * | |
| 258 | */ | |
| 259 | #define C_SYSINIT(uniquifier, subsystem, order, func, ident) \ | |
| 260 | static struct sysinit uniquifier ## _sys_init = { \ | |
| 261 | subsystem, \ | |
| 262 | order, \ | |
| 263 | func, \ | |
| 4c202dcc MD |
264 | ident, \ |
| 265 | #uniquifier \ | |
| 984263bc MD |
266 | }; \ |
| 267 | DATA_SET(sysinit_set,uniquifier ## _sys_init); | |
| 268 | ||
| 269 | #define SYSINIT(uniquifier, subsystem, order, func, ident) \ | |
| 270 | C_SYSINIT(uniquifier, subsystem, order, \ | |
| 271 | (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident) | |
| 272 | ||
| 273 | /* | |
| 274 | * Called on module unload: no special processing | |
| 275 | */ | |
| 276 | #define C_SYSUNINIT(uniquifier, subsystem, order, func, ident) \ | |
| 277 | static struct sysinit uniquifier ## _sys_uninit = { \ | |
| 278 | subsystem, \ | |
| 279 | order, \ | |
| 280 | func, \ | |
| 281 | ident \ | |
| 282 | }; \ | |
| 283 | DATA_SET(sysuninit_set,uniquifier ## _sys_uninit) | |
| 284 | ||
| 285 | #define SYSUNINIT(uniquifier, subsystem, order, func, ident) \ | |
| 286 | C_SYSUNINIT(uniquifier, subsystem, order, \ | |
| 287 | (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident) | |
| 288 | ||
| 005f09fe | 289 | void sysinit_add (struct sysinit **, struct sysinit **); |
| 984263bc MD |
290 | |
| 291 | /* | |
| 292 | * Infrastructure for tunable 'constants'. Value may be specified at compile | |
| 293 | * time or kernel load time. Rules relating tunables together can be placed | |
| ba39e2e0 | 294 | * in a SYSINIT function at SI_BOOT1_TUNABLES with SI_ORDER_LAST. |
| 984263bc MD |
295 | */ |
| 296 | ||
| 297 | extern void tunable_int_init(void *); | |
| 03d6a592 | 298 | |
| 984263bc MD |
299 | struct tunable_int { |
| 300 | const char *path; | |
| 301 | int *var; | |
| 302 | }; | |
| 303 | #define TUNABLE_INT(path, var) \ | |
| 304 | _TUNABLE_INT((path), (var), __LINE__) | |
| 305 | #define _TUNABLE_INT(path, var, line) \ | |
| 306 | __TUNABLE_INT((path), (var), line) | |
| 307 | ||
| 308 | #define __TUNABLE_INT(path, var, line) \ | |
| 309 | static struct tunable_int __tunable_int_ ## line = { \ | |
| 310 | path, \ | |
| 311 | var, \ | |
| 312 | }; \ | |
| ba39e2e0 MD |
313 | SYSINIT(__Tunable_init_ ## line, \ |
| 314 | SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \ | |
| 315 | tunable_int_init, &__tunable_int_ ## line) | |
| 984263bc | 316 | |
| bc01a404 | 317 | #define TUNABLE_INT_FETCH(path, var) kgetenv_int((path), (var)) |
| 36f5b272 | 318 | |
| a734ce2b SW |
319 | /* Backwards compatibility with the old deprecated TUNABLE_INT_DECL API */ |
| 320 | #define TUNABLE_INT_DECL(path, defval, var) \ | |
| 321 | static void __Tunable_ ## var (void *ignored) \ | |
| 322 | { \ | |
| 323 | (var) = (defval); \ | |
| 324 | TUNABLE_INT_FETCH((path), &(var)); \ | |
| 325 | } \ | |
| 326 | SYSINIT(__Tunable_init_ ## var, SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \ | |
| 327 | __Tunable_ ## var , NULL); | |
| 328 | ||
| 36f5b272 SW |
329 | extern void tunable_long_init(void *); |
| 330 | ||
| 331 | struct tunable_long { | |
| 332 | const char *path; | |
| 333 | long *var; | |
| 334 | }; | |
| 335 | #define TUNABLE_LONG(path, var) \ | |
| 336 | _TUNABLE_LONG((path), (var), __LINE__) | |
| 337 | #define _TUNABLE_LONG(path, var, line) \ | |
| 338 | __TUNABLE_LONG((path), (var), line) | |
| 339 | ||
| 340 | #define __TUNABLE_LONG(path, var, line) \ | |
| 341 | static struct tunable_long __tunable_long_ ## line = { \ | |
| 342 | path, \ | |
| 343 | var, \ | |
| 344 | }; \ | |
| 345 | SYSINIT(__Tunable_init_ ## line, \ | |
| 346 | SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \ | |
| 347 | tunable_long_init, &__tunable_long_ ## line) | |
| 348 | ||
| 79634a66 | 349 | #define TUNABLE_LONG_FETCH(path, var) kgetenv_long((path), (var)) |
| 984263bc | 350 | |
| a734ce2b SW |
351 | extern void tunable_ulong_init(void *); |
| 352 | ||
| 353 | struct tunable_ulong { | |
| 354 | const char *path; | |
| 355 | unsigned long *var; | |
| 356 | }; | |
| 357 | #define TUNABLE_ULONG(path, var) \ | |
| 358 | _TUNABLE_ULONG((path), (var), __LINE__) | |
| 359 | #define _TUNABLE_ULONG(path, var, line) \ | |
| 360 | __TUNABLE_ULONG((path), (var), line) | |
| 361 | ||
| 362 | #define __TUNABLE_ULONG(path, var, line) \ | |
| 363 | static struct tunable_ulong __tunable_ulong_ ## line = {\ | |
| 364 | path, \ | |
| 365 | var, \ | |
| 366 | }; \ | |
| 367 | SYSINIT(__Tunable_init_ ## line, \ | |
| 368 | SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \ | |
| 369 | tunable_ulong_init, &__tunable_ulong_ ## line) | |
| 984263bc | 370 | |
| 28a93126 MD |
371 | #define TUNABLE_ULONG_FETCH(path, var) kgetenv_ulong((path), (var)) |
| 372 | ||
| 984263bc MD |
373 | extern void tunable_quad_init(void *); |
| 374 | struct tunable_quad { | |
| 375 | const char *path; | |
| 376 | quad_t *var; | |
| 377 | }; | |
| 378 | #define TUNABLE_QUAD(path, var) \ | |
| 379 | _TUNABLE_QUAD((path), (var), __LINE__) | |
| 380 | #define _TUNABLE_QUAD(path, var, line) \ | |
| 381 | __TUNABLE_QUAD((path), (var), line) | |
| 382 | ||
| 383 | #define __TUNABLE_QUAD(path, var, line) \ | |
| 384 | static struct tunable_quad __tunable_quad_ ## line = { \ | |
| 385 | path, \ | |
| 386 | var, \ | |
| 387 | }; \ | |
| ba39e2e0 MD |
388 | SYSINIT(__Tunable_init_ ## line, \ |
| 389 | SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \ | |
| 390 | tunable_quad_init, &__tunable_quad_ ## line) | |
| 984263bc | 391 | |
| bc01a404 | 392 | #define TUNABLE_QUAD_FETCH(path, var) kgetenv_quad((path), (var)) |
| 984263bc MD |
393 | |
| 394 | extern void tunable_str_init(void *); | |
| 395 | struct tunable_str { | |
| 396 | const char *path; | |
| 397 | char *var; | |
| 398 | int size; | |
| 399 | }; | |
| 400 | #define TUNABLE_STR(path, var, size) \ | |
| 401 | _TUNABLE_STR((path), (var), (size), __LINE__) | |
| 402 | #define _TUNABLE_STR(path, var, size, line) \ | |
| 403 | __TUNABLE_STR((path), (var), (size), line) | |
| 404 | ||
| 405 | #define __TUNABLE_STR(path, var, size, line) \ | |
| 406 | static struct tunable_str __tunable_str_ ## line = { \ | |
| 407 | path, \ | |
| 408 | var, \ | |
| 409 | size, \ | |
| 410 | }; \ | |
| ba39e2e0 MD |
411 | SYSINIT(__Tunable_init_ ## line, \ |
| 412 | SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \ | |
| 413 | tunable_str_init, &__tunable_str_ ## line) | |
| 984263bc MD |
414 | |
| 415 | #define TUNABLE_STR_FETCH(path, var, size) \ | |
| bc01a404 | 416 | kgetenv_string((path), (var), (size)) |
| 984263bc MD |
417 | |
| 418 | /* | |
| 419 | * Compatibility. To be deprecated after LKM is removed. | |
| 420 | */ | |
| 03d6a592 | 421 | #ifndef _SYS_MODULE_H_ |
| 984263bc | 422 | #include <sys/module.h> |
| 03d6a592 MD |
423 | #endif |
| 424 | ||
| 984263bc MD |
425 | #define PSEUDO_SET(sym, name) \ |
| 426 | static int name ## _modevent(module_t mod, int type, void *data) \ | |
| 427 | { \ | |
| 428 | void (*initfunc)(void *) = (void (*)(void *))data; \ | |
| 429 | switch (type) { \ | |
| 430 | case MOD_LOAD: \ | |
| 26be20a0 | 431 | /* kprintf(#name " module load\n"); */ \ |
| 984263bc MD |
432 | initfunc(NULL); \ |
| 433 | break; \ | |
| 434 | case MOD_UNLOAD: \ | |
| 26be20a0 | 435 | kprintf(#name " module unload - not possible for this module type\n"); \ |
| 984263bc MD |
436 | return EINVAL; \ |
| 437 | } \ | |
| 438 | return 0; \ | |
| 439 | } \ | |
| 440 | static moduledata_t name ## _mod = { \ | |
| 441 | #name, \ | |
| 442 | name ## _modevent, \ | |
| 443 | (void *)sym \ | |
| 444 | }; \ | |
| 445 | DECLARE_MODULE(name, name ## _mod, SI_SUB_PSEUDO, SI_ORDER_ANY) | |
| 446 | ||
| 447 | extern struct linker_set execsw_set; | |
| 448 | ||
| 984263bc MD |
449 | struct intr_config_hook { |
| 450 | TAILQ_ENTRY(intr_config_hook) ich_links; | |
| 005f09fe | 451 | void (*ich_func) (void *); |
| 984263bc | 452 | void *ich_arg; |
| a1e26a0c | 453 | const char *ich_desc; |
| cce90053 | 454 | int ich_order; |
| dc2cbe9d | 455 | int ich_ran; |
| 984263bc MD |
456 | }; |
| 457 | ||
| 005f09fe JS |
458 | int config_intrhook_establish (struct intr_config_hook *); |
| 459 | void config_intrhook_disestablish (struct intr_config_hook *); | |
| 984263bc | 460 | |
| 03d6a592 | 461 | #endif /* _KERNEL */ |
| 984263bc | 462 | #endif /* !_SYS_KERNEL_H_*/ |