root/sys/systm.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: systm.h,v 1.72 2007/06/01 19:25:08 deraadt Exp $      */
    2 /*      $NetBSD: systm.h,v 1.50 1996/06/09 04:55:09 briggs Exp $        */
    3 
    4 /*-
    5  * Copyright (c) 1982, 1988, 1991, 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. Neither the name of the University nor the names of its contributors
   22  *    may be used to endorse or promote products derived from this software
   23  *    without specific prior written permission.
   24  *
   25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   35  * SUCH DAMAGE.
   36  *
   37  *      @(#)systm.h     8.4 (Berkeley) 2/23/94
   38  */
   39 
   40 #ifndef __SYSTM_H__
   41 #define __SYSTM_H__
   42 
   43 #include <sys/queue.h>
   44 #include <sys/stdarg.h>
   45 
   46 /*
   47  * The `securelevel' variable controls the security level of the system.
   48  * It can only be decreased by process 1 (/sbin/init).
   49  *
   50  * Security levels are as follows:
   51  *   -1 permanently insecure mode - always run system in level 0 mode.
   52  *    0 insecure mode - immutable and append-only flags may be turned off.
   53  *      All devices may be read or written subject to permission modes.
   54  *    1 secure mode - immutable and append-only flags may not be changed;
   55  *      raw disks of mounted filesystems, /dev/mem, and /dev/kmem are
   56  *      read-only.
   57  *    2 highly secure mode - same as (1) plus raw disks are always
   58  *      read-only whether mounted or not. This level precludes tampering
   59  *      with filesystems by unmounting them, but also inhibits running
   60  *      newfs while the system is secured.
   61  *
   62  * In normal operation, the system runs in level 0 mode while single user
   63  * and in level 1 mode while multiuser. If level 2 mode is desired while
   64  * running multiuser, it can be set in the multiuser startup script
   65  * (/etc/rc.local) using sysctl(1). If it is desired to run the system
   66  * in level 0 mode while multiuser, initialize the variable securelevel
   67  * in /sys/kern/kern_sysctl.c to -1. Note that it is NOT initialized to
   68  * zero as that would allow the vmunix binary to be patched to -1.
   69  * Without initialization, securelevel loads in the BSS area which only
   70  * comes into existence when the kernel is loaded and hence cannot be
   71  * patched by a stalking hacker.
   72  */
   73 extern int securelevel;         /* system security level */
   74 extern const char *panicstr;    /* panic message */
   75 extern const char version[];            /* system version */
   76 extern const char copyright[];  /* system copyright */
   77 extern const char ostype[];
   78 extern const char osversion[];
   79 extern const char osrelease[];
   80 extern int cold;                /* cold start flag initialized in locore */
   81 
   82 extern int ncpus;               /* number of CPUs */
   83 extern int nblkdev;             /* number of entries in bdevsw */
   84 extern int nchrdev;             /* number of entries in cdevsw */
   85 
   86 extern int selwait;             /* select timeout address */
   87 
   88 #ifdef MULTIPROCESSOR
   89 #define curpriority (curcpu()->ci_schedstate.spc_curpriority)
   90 #else
   91 extern u_char curpriority;      /* priority of current process */
   92 #endif
   93 
   94 extern int maxmem;              /* max memory per process */
   95 extern int physmem;             /* physical memory */
   96 
   97 extern dev_t dumpdev;           /* dump device */
   98 extern long dumplo;             /* offset into dumpdev */
   99 
  100 extern dev_t rootdev;           /* root device */
  101 extern struct vnode *rootvp;    /* vnode equivalent to above */
  102 
  103 extern dev_t swapdev;           /* swapping device */
  104 extern struct vnode *swapdev_vp;/* vnode equivalent to above */
  105 
  106 struct proc;
  107 
  108 typedef int     sy_call_t(struct proc *, void *, register_t *);
  109 
  110 extern struct sysent {          /* system call table */
  111         short   sy_narg;        /* number of args */
  112         short   sy_argsize;     /* total size of arguments */
  113         sy_call_t *sy_call;     /* implementing function */
  114 } sysent[];
  115 #if     _BYTE_ORDER == _BIG_ENDIAN
  116 #define SCARG(p, k)     ((p)->k.be.datum)       /* get arg from args pointer */
  117 #elif   _BYTE_ORDER == _LITTLE_ENDIAN
  118 #define SCARG(p, k)     ((p)->k.le.datum)       /* get arg from args pointer */
  119 #else
  120 #error  "what byte order is this machine?"
  121 #endif
  122 
  123 #if defined(_KERNEL) && defined(SYSCALL_DEBUG)
  124 void scdebug_call(struct proc *p, register_t code, register_t retval[]);
  125 void scdebug_ret(struct proc *p, register_t code, int error, register_t retval[]);
  126 #endif /* _KERNEL && SYSCALL_DEBUG */
  127 
  128 extern int boothowto;           /* reboot flags, from console subsystem */
  129 
  130 extern void (*v_putc)(int); /* Virtual console putc routine */
  131 
  132 /*
  133  * General function declarations.
  134  */
  135 int     nullop(void *);
  136 int     enodev(void);
  137 int     enosys(void);
  138 int     enoioctl(void);
  139 int     enxio(void);
  140 int     eopnotsupp(void *);
  141 
  142 int     lkmenodev(void);
  143 
  144 struct vnodeopv_desc;
  145 void vfs_opv_init(void);
  146 void vfs_opv_init_explicit(struct vnodeopv_desc *);
  147 void vfs_opv_init_default(struct vnodeopv_desc *);
  148 void vfs_op_init(void);
  149 
  150 int     seltrue(dev_t dev, int which, struct proc *);
  151 void    *hashinit(int, int, int, u_long *);
  152 int     sys_nosys(struct proc *, void *, register_t *);
  153 
  154 void    panic(const char *, ...)
  155     __attribute__((__noreturn__,__format__(__kprintf__,1,2)));
  156 void    __assert(const char *, const char *, int, const char *)
  157     __attribute__((__noreturn__));
  158 int     printf(const char *, ...)
  159     __attribute__((__format__(__kprintf__,1,2)));
  160 void    uprintf(const char *, ...)
  161     __attribute__((__format__(__kprintf__,1,2)));
  162 int     vprintf(const char *, va_list);
  163 int     vsnprintf(char *, size_t, const char *, va_list);
  164 int     snprintf(char *buf, size_t, const char *, ...)
  165     __attribute__((__format__(__kprintf__,3,4)));
  166 struct tty;
  167 void    ttyprintf(struct tty *, const char *, ...)
  168     __attribute__((__format__(__kprintf__,2,3)));
  169 
  170 void    splassert_fail(int, int, const char *);
  171 extern  int splassert_ctl;
  172 
  173 void    tablefull(const char *);
  174 
  175 int     kcopy(const void *, void *, size_t)
  176                 __attribute__ ((__bounded__(__buffer__,1,3)))
  177                 __attribute__ ((__bounded__(__buffer__,2,3)));
  178 
  179 void    bcopy(const void *, void *, size_t)
  180                 __attribute__ ((__bounded__(__buffer__,1,3)))
  181                 __attribute__ ((__bounded__(__buffer__,2,3)));
  182 void    ovbcopy(const void *, void *, size_t)
  183                 __attribute__ ((__bounded__(__buffer__,1,3)))
  184                 __attribute__ ((__bounded__(__buffer__,2,3)));
  185 void    bzero(void *, size_t)
  186                 __attribute__ ((__bounded__(__buffer__,1,2)));
  187 int     bcmp(const void *, const void *, size_t);
  188 void    *memcpy(void *, const void *, size_t)
  189                 __attribute__ ((__bounded__(__buffer__,1,3)))
  190                 __attribute__ ((__bounded__(__buffer__,2,3)));
  191 void    *memmove(void *, const void *, size_t)
  192                 __attribute__ ((__bounded__(__buffer__,1,3)))
  193                 __attribute__ ((__bounded__(__buffer__,2,3)));
  194 void    *memset(void *, int, size_t)
  195                 __attribute__ ((__bounded__(__buffer__,1,3)));
  196 
  197 int     copystr(const void *, void *, size_t, size_t *)
  198                 __attribute__ ((__bounded__(__string__,2,3)));
  199 int     copyinstr(const void *, void *, size_t, size_t *)
  200                 __attribute__ ((__bounded__(__string__,2,3)));
  201 int     copyoutstr(const void *, void *, size_t, size_t *);
  202 int     copyin(const void *, void *, size_t)
  203                 __attribute__ ((__bounded__(__buffer__,2,3)));
  204 int     copyout(const void *, void *, size_t);
  205 
  206 struct timeval;
  207 int     hzto(struct timeval *);
  208 int     tvtohz(struct timeval *);
  209 void    realitexpire(void *);
  210 
  211 struct clockframe;
  212 void    hardclock(struct clockframe *);
  213 void    softclock(void);
  214 void    statclock(struct clockframe *);
  215 
  216 void    initclocks(void);
  217 void    inittodr(time_t);
  218 void    resettodr(void);
  219 void    cpu_initclocks(void);
  220 
  221 void    startprofclock(struct proc *);
  222 void    stopprofclock(struct proc *);
  223 void    setstatclockrate(int);
  224 
  225 void    wdog_register(void *, int (*)(void *, int));
  226 
  227 /*
  228  * Startup/shutdown hooks.  Startup hooks are functions running after
  229  * the scheduler has started but before any threads have been created
  230  * or root has been mounted. The shutdown hooks are functions to be run
  231  * with all interrupts disabled immediately before the system is
  232  * halted or rebooted.
  233  */
  234 
  235 struct hook_desc {
  236         TAILQ_ENTRY(hook_desc) hd_list;
  237         void    (*hd_fn)(void *);
  238         void    *hd_arg;
  239 };
  240 TAILQ_HEAD(hook_desc_head, hook_desc);
  241 
  242 extern struct hook_desc_head shutdownhook_list, startuphook_list,
  243     mountroothook_list;
  244 
  245 void    *hook_establish(struct hook_desc_head *, int, void (*)(void *), void *);
  246 void    hook_disestablish(struct hook_desc_head *, void *);
  247 void    dohooks(struct hook_desc_head *, int);
  248 
  249 #define HOOK_REMOVE     0x01
  250 #define HOOK_FREE       0x02
  251 
  252 #define startuphook_establish(fn, arg) \
  253         hook_establish(&startuphook_list, 1, (fn), (arg))
  254 #define startuphook_disestablish(vhook) \
  255         hook_disestablish(&startuphook_list, (vhook))
  256 #define dostartuphooks() dohooks(&startuphook_list, HOOK_REMOVE|HOOK_FREE)
  257 
  258 #define shutdownhook_establish(fn, arg) \
  259         hook_establish(&shutdownhook_list, 0, (fn), (arg))
  260 #define shutdownhook_disestablish(vhook) \
  261         hook_disestablish(&shutdownhook_list, (vhook))
  262 #define doshutdownhooks() dohooks(&shutdownhook_list, HOOK_REMOVE)
  263 
  264 #define mountroothook_establish(fn, arg) \
  265         hook_establish(&mountroothook_list, 0, (fn), (arg))
  266 #define mountroothook_disestablish(vhook) \
  267         hook_disestablish(&mountroothook_list, (vhook))
  268 #define domountroothooks() dohooks(&mountroothook_list, HOOK_REMOVE|HOOK_FREE)
  269 
  270 /*
  271  * Power management hooks.
  272  */
  273 void    *powerhook_establish(void (*)(int, void *), void *);
  274 void    powerhook_disestablish(void *);
  275 void    dopowerhooks(int);
  276 #define PWR_RESUME 0
  277 #define PWR_SUSPEND 1
  278 #define PWR_STANDBY 2
  279 
  280 struct uio;
  281 int     uiomove(void *, int, struct uio *);
  282 
  283 #if defined(_KERNEL)
  284 int     setjmp(label_t *);
  285 void    longjmp(label_t *);
  286 #endif
  287 
  288 void    consinit(void);
  289 
  290 void    cpu_startup(void);
  291 void    cpu_configure(void);
  292 void    diskconf(void);
  293 
  294 #ifdef GPROF
  295 void    kmstartup(void);
  296 #endif
  297 
  298 int nfs_mountroot(void);
  299 int dk_mountroot(void);
  300 extern int (*mountroot)(void);
  301 
  302 #include <lib/libkern/libkern.h>
  303 
  304 #if defined(DDB) || defined(KGDB)
  305 /* debugger entry points */
  306 void    Debugger(void); /* in DDB only */
  307 int     read_symtab_from_file(struct proc *,struct vnode *,const char *);
  308 #endif
  309 
  310 #ifdef BOOT_CONFIG
  311 void    user_config(void);
  312 #endif
  313 
  314 #if defined(MULTIPROCESSOR)
  315 void    _kernel_lock_init(void);
  316 void    _kernel_lock(void);
  317 void    _kernel_unlock(void);
  318 void    _kernel_proc_lock(struct proc *);
  319 void    _kernel_proc_unlock(struct proc *);
  320 
  321 #define KERNEL_LOCK_INIT()              _kernel_lock_init()
  322 #define KERNEL_LOCK()                   _kernel_lock()
  323 #define KERNEL_UNLOCK()                 _kernel_unlock()
  324 #define KERNEL_PROC_LOCK(p)             _kernel_proc_lock((p))
  325 #define KERNEL_PROC_UNLOCK(p)           _kernel_proc_unlock((p))
  326 
  327 #else /* ! MULTIPROCESSOR */
  328 
  329 #define KERNEL_LOCK_INIT()              /* nothing */
  330 #define KERNEL_LOCK()                   /* nothing */
  331 #define KERNEL_UNLOCK()                 /* nothing */
  332 #define KERNEL_PROC_LOCK(p)             /* nothing */
  333 #define KERNEL_PROC_UNLOCK(p)           /* nothing */
  334 
  335 #endif /* MULTIPROCESSOR */
  336 
  337 #endif /* __SYSTM_H__ */

/* [<][>][^][v][top][bottom][index][help] */