Annotation of sys/sys/systm.h, Revision 1.1.1.1
1.1 nbrk 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__ */
CVSweb