#ifndef _SYS_KERNEL_H_
#define _SYS_KERNEL_H_
#ifndef _KERNEL
#error "This file should not be included by userland programs."
#endif
#ifndef _SYS_PARAM_H_
#include <sys/param.h>
#endif
#ifndef _SYS_LINKER_SET_H_
#include <sys/linker_set.h>
#endif
#ifndef _SYS_QUEUE_H_
#include <sys/queue.h>
#endif
extern unsigned long hostid;
extern char hostname[MAXHOSTNAMELEN];
extern int hostnamelen;
extern char domainname[MAXHOSTNAMELEN];
extern int domainnamelen;
extern char kernelname[MAXPATHLEN];
extern struct timespec boottime;
extern struct timezone tz;
extern int ustick;
extern int nstick;
extern int tickadj;
extern int hz;
extern int psratio;
extern int stathz;
extern int profhz;
extern int ticks;
extern sbintime_t sbticks;
extern int lbolt;
extern void *lbolt_syncer;
extern char vmm_vendor[16];
enum vmm_guest_type {
VMM_GUEST_NONE = 0,
VMM_GUEST_QEMU,
VMM_GUEST_PLEX86,
VMM_GUEST_BOCHS,
VMM_GUEST_XEN,
VMM_GUEST_BHYVE,
VMM_GUEST_KVM,
VMM_GUEST_VMWARE,
VMM_GUEST_HYPERV,
VMM_GUEST_VBOX,
VMM_GUEST_PARALLELS,
VMM_GUEST_VKERNEL,
VMM_GUEST_NVMM,
VMM_GUEST_UNKNOWN,
VMM_GUEST_LAST
};
extern enum vmm_guest_type vmm_guest;
enum sysinit_sub_id {
SI_SPECIAL_DUMMY = 0x0000000,
SI_SPECIAL_DONE = 0x0000001,
SI_BOOT1_TUNABLES = 0x0700000,
SI_BOOT1_COPYRIGHT = 0x0800000,
SI_BOOT1_LOCK = 0x0900000,
SI_BOOT1_VM = 0x1000000,
SI_BOOT1_ALLOCATOR = 0x1400000,
SI_BOOT1_KMALLOC = 0x1600000,
SI_BOOT1_DYNALLOC = 0x1700000,
SI_BOOT1_POST = 0x1800000,
SI_BOOT2_LEAVE_CRIT = 0x1900000,
SI_BOOT2_PRESMP = 0x1a00000,
SI_BOOT2_START_CPU = 0x1a40000,
SI_BOOT2_LAPIC = 0x1a50000,
SI_BOOT2_CPU_TOPOLOGY = 0x1a58000,
SI_BOOT2_NUMA = 0x1a5c000,
SI_BOOT2_START_APS = 0x1a60000,
SI_BOOT2_IOAPIC = 0x1a70000,
SI_BOOT2_FINISH_PIC = 0x1a80000,
SI_BOOT2_FINISH_CPU = 0x1a90000,
SI_BOOT2_CLOCKREG = 0x1ac0000,
SI_BOOT2_OBJCACHE = 0x1b00000,
SI_BOOT2_LWKT_INIT = 0x1b40000,
SI_BOOT2_SOFTCLOCK = 0x1b80000,
SI_BOOT2_CLOCKS = 0x1c00000,
SI_BOOT2_FINISH_SMP = 0x1c80000,
SI_BOOT2_POST_SMP = 0x1cc0000,
SI_BOOT2_MACHDEP = 0x1d80000,
SI_BOOT2_TASKQ = 0x1dc0000,
SI_BOOT2_KLD = 0x1e00000,
SI_BOOT2_USCHED = 0x1e80000,
SI_BOOT2_PROC0 = 0x1f00000,
SI_SUB_CREATE_INIT = 0x2300000,
SI_SUB_PROP = 0x2340000,
SI_SUB_DEVFS_CORE = 0x2380000,
SI_SUB_PRE_DRIVERS = 0x23C0000,
SI_SUB_DRIVERS = 0x2400000,
SI_SUB_CONFIGURE = 0x3800000,
SI_SUB_ISWARM = 0x3c00000,
SI_SUB_VFS = 0x4000000,
SI_SUB_HELPER_THREADS = 0x5400000,
SI_SUB_SYSV_SHM = 0x6400000,
SI_SUB_SYSV_SEM = 0x6800000,
SI_SUB_SYSV_MSG = 0x6C00000,
SI_SUB_P1003_1B = 0x6E00000,
SI_SUB_PSEUDO = 0x7000000,
SI_SUB_EXEC = 0x7400000,
SI_SUB_PROTO_IF = 0x8400000,
SI_SUB_PROTO_DOMAIN = 0x8800000,
SI_SUB_PROTO_IFATTACHDOMAIN
= 0x8800001,
SI_SUB_PROTO_END = 0x8ffffff,
SI_SUB_KICK_SCHEDULER = 0xa000000,
SI_SUB_INT_CONFIG_HOOKS = 0xa800000,
SI_SUB_ROOT_CONF = 0xb000000,
SI_SUB_DUMP_CONF = 0xb200000,
SI_SUB_RAID = 0xb300000,
SI_SUB_DM_TARGETS = 0xb3a0000,
SI_SUB_MOUNT_ROOT = 0xb400000,
SI_SUB_PROC0_POST = 0xd000000,
SI_SUB_KTHREAD_INIT = 0xe000000,
SI_SUB_KTHREAD_PAGE = 0xe400000,
SI_SUB_KTHREAD_VM = 0xe800000,
SI_SUB_KTHREAD_BUF = 0xea00000,
SI_SUB_KTHREAD_UPDATE = 0xec00000,
SI_SUB_KTHREAD_IDLE = 0xee00000,
SI_SUB_RUN_SCHEDULER = 0xfffffff
};
enum sysinit_elem_order {
SI_ORDER_FIRST = 0x0000000,
SI_ORDER_SECOND = 0x0000001,
SI_ORDER_THIRD = 0x0000002,
SI_ORDER_FOURTH = 0x0000003,
SI_ORDER_EARLIER = 0x0800000,
SI_ORDER_MIDDLE = 0x1000000,
SI_ORDER_LATER = 0x2000000,
SI_ORDER_ANY = 0xfffffff
};
typedef void (*sysinit_nfunc_t) (void *);
typedef void (*sysinit_cfunc_t) (const void *);
struct sysinit {
unsigned int subsystem;
unsigned int order;
sysinit_cfunc_t func;
const void *udata;
const char *name;
};
#define C_SYSINIT(uniquifier, subsystem, order, func, ident) \
static struct sysinit uniquifier ## _sys_init = { \
subsystem, \
order, \
func, \
ident, \
#uniquifier \
}; \
DATA_SET(sysinit_set,uniquifier ## _sys_init)
#define SYSINIT(uniquifier, subsystem, order, func, ident) \
C_SYSINIT(uniquifier, subsystem, order, \
(sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident)
#define C_SYSUNINIT(uniquifier, subsystem, order, func, ident) \
static struct sysinit uniquifier ## _sys_uninit = { \
subsystem, \
order, \
func, \
ident \
}; \
DATA_SET(sysuninit_set,uniquifier ## _sys_uninit)
#define SYSUNINIT(uniquifier, subsystem, order, func, ident) \
C_SYSUNINIT(uniquifier, subsystem, order, \
(sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident)
void sysinit_add (struct sysinit **, struct sysinit **);
void tunable_int_init(void *);
struct tunable_int {
const char *path;
int *var;
};
#define TUNABLE_INT(path, var) \
_TUNABLE_INT((path), (var), __LINE__)
#define _TUNABLE_INT(path, var, line) \
__TUNABLE_INT((path), (var), line)
#define __TUNABLE_INT(path, var, line) \
static struct tunable_int __tunable_int_ ## line = { \
path, \
var, \
}; \
SYSINIT(__Tunable_init_ ## line, \
SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \
tunable_int_init, &__tunable_int_ ## line)
#define TUNABLE_INT_FETCH(path, var) kgetenv_int((path), (var))
#define TUNABLE_INT_DECL(path, defval, var) \
static void __Tunable_ ## var (void *ignored) \
{ \
(var) = (defval); \
TUNABLE_INT_FETCH((path), &(var)); \
} \
SYSINIT(__Tunable_init_ ## var, SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \
__Tunable_ ## var , NULL);
void tunable_long_init(void *);
struct tunable_long {
const char *path;
long *var;
};
#define TUNABLE_LONG(path, var) \
_TUNABLE_LONG((path), (var), __LINE__)
#define _TUNABLE_LONG(path, var, line) \
__TUNABLE_LONG((path), (var), line)
#define __TUNABLE_LONG(path, var, line) \
static struct tunable_long __tunable_long_ ## line = { \
path, \
var, \
}; \
SYSINIT(__Tunable_init_ ## line, \
SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \
tunable_long_init, &__tunable_long_ ## line)
#define TUNABLE_LONG_FETCH(path, var) kgetenv_long((path), (var))
void tunable_ulong_init(void *);
struct tunable_ulong {
const char *path;
unsigned long *var;
};
#define TUNABLE_ULONG(path, var) \
_TUNABLE_ULONG((path), (var), __LINE__)
#define _TUNABLE_ULONG(path, var, line) \
__TUNABLE_ULONG((path), (var), line)
#define __TUNABLE_ULONG(path, var, line) \
static struct tunable_ulong __tunable_ulong_ ## line = {\
path, \
var, \
}; \
SYSINIT(__Tunable_init_ ## line, \
SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \
tunable_ulong_init, &__tunable_ulong_ ## line)
#define TUNABLE_ULONG_FETCH(path, var) kgetenv_ulong((path), (var))
void tunable_quad_init(void *);
struct tunable_quad {
const char *path;
quad_t *var;
};
#define TUNABLE_QUAD(path, var) \
_TUNABLE_QUAD((path), (var), __LINE__)
#define _TUNABLE_QUAD(path, var, line) \
__TUNABLE_QUAD((path), (var), line)
#define __TUNABLE_QUAD(path, var, line) \
static struct tunable_quad __tunable_quad_ ## line = { \
path, \
var, \
}; \
SYSINIT(__Tunable_init_ ## line, \
SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \
tunable_quad_init, &__tunable_quad_ ## line)
#define TUNABLE_QUAD_FETCH(path, var) kgetenv_quad((path), (var))
void tunable_str_init(void *);
struct tunable_str {
const char *path;
char *var;
int size;
};
#define TUNABLE_STR(path, var, size) \
_TUNABLE_STR((path), (var), (size), __LINE__)
#define _TUNABLE_STR(path, var, size, line) \
__TUNABLE_STR((path), (var), (size), line)
#define __TUNABLE_STR(path, var, size, line) \
static struct tunable_str __tunable_str_ ## line = { \
path, \
var, \
size, \
}; \
SYSINIT(__Tunable_init_ ## line, \
SI_BOOT1_TUNABLES, SI_ORDER_MIDDLE, \
tunable_str_init, &__tunable_str_ ## line)
#define TUNABLE_STR_FETCH(path, var, size) \
kgetenv_string((path), (var), (size))
#ifndef _SYS_MODULE_H_
#include <sys/module.h>
#endif
#define PSEUDO_SET(sym, name) \
static int name ## _modevent(module_t mod, int type, void *data) \
{ \
void (*initfunc)(void *) = (void (*)(void *))data; \
switch (type) { \
case MOD_LOAD: \
\
initfunc(NULL); \
break; \
case MOD_UNLOAD: \
kprintf(#name " module unload - not possible for this module type\n"); \
return EINVAL; \
} \
return 0; \
} \
static moduledata_t name ## _mod = { \
#name, \
name ## _modevent, \
(void *)sym \
}; \
DECLARE_MODULE(name, name ## _mod, SI_SUB_PSEUDO, SI_ORDER_ANY)
struct intr_config_hook {
TAILQ_ENTRY(intr_config_hook) ich_links;
void (*ich_func) (void *);
void *ich_arg;
const char *ich_desc;
int ich_order;
int ich_ran;
};
int config_intrhook_establish (struct intr_config_hook *);
void config_intrhook_disestablish (struct intr_config_hook *);
#endif