xref: /openbsd/sys/sys/systm.h (revision 6d6c8141)
1 /*	$OpenBSD: systm.h,v 1.170 2023/10/30 07:04:36 claudio 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 extern int db_active;		/* running currently inside ddb(4) */
82 
83 extern char *hw_vendor;		/* sysctl hw.vendor */
84 extern char *hw_prod;		/* sysctl hw.product */
85 extern char *hw_uuid;		/* sysctl hw.uuid */
86 extern char *hw_serial;		/* sysctl hw.serialno */
87 extern char *hw_ver;		/* sysctl hw.version */
88 
89 extern int ncpus;		/* number of CPUs used */
90 extern int ncpusfound;		/* number of CPUs found */
91 extern int nblkdev;		/* number of entries in bdevsw */
92 extern int nchrdev;		/* number of entries in cdevsw */
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 u_char bootduid[8];	/* boot device disklabel uid */
102 extern u_char rootduid[8];	/* root device disklabel uid */
103 extern struct vnode *rootvp;	/* vnode equivalent to above */
104 extern struct device *rootdv;	/* device equivalent to above */
105 
106 extern dev_t swapdev;		/* swapping device */
107 extern struct vnode *swapdev_vp;/* vnode equivalent to above */
108 
109 extern int nowake;		/* dead wakeup(9) channel */
110 
111 struct proc;
112 struct process;
113 #define curproc curcpu()->ci_curproc
114 
115 typedef int	sy_call_t(struct proc *, void *, register_t *);
116 
117 extern const struct sysent {	/* system call table */
118 	short	sy_narg;	/* number of args */
119 	short	sy_argsize;	/* total size of arguments */
120 	int	sy_flags;
121 	sy_call_t *sy_call;	/* implementing function */
122 } sysent[];
123 
124 #define SY_NOLOCK		0x01
125 
126 #if	_BYTE_ORDER == _BIG_ENDIAN
127 #define SCARG(p, k)	((p)->k.be.datum)	/* get arg from args pointer */
128 #elif	_BYTE_ORDER == _LITTLE_ENDIAN
129 #define SCARG(p, k)	((p)->k.le.datum)	/* get arg from args pointer */
130 #else
131 #error	"what byte order is this machine?"
132 #endif
133 
134 #if defined(_KERNEL) && defined(SYSCALL_DEBUG)
135 void scdebug_call(struct proc *p, register_t code, const register_t retval[]);
136 void scdebug_ret(struct proc *p, register_t code, int error,
137     const register_t retval[]);
138 #endif /* _KERNEL && SYSCALL_DEBUG */
139 
140 extern int boothowto;		/* reboot flags, from console subsystem */
141 
142 extern void (*v_putc)(int); /* Virtual console putc routine */
143 
144 /*
145  * General function declarations.
146  */
147 int	nullop(void *);
148 int	enodev(void);
149 int	enosys(void);
150 int	enoioctl(void);
151 int	enxio(void);
152 int	eopnotsupp(void *);
153 
154 void	*hashinit(int, int, int, u_long *);
155 void	 hashfree(void *, int, int);
156 int	sys_nosys(struct proc *, void *, register_t *);
157 
158 void	panic(const char *, ...)
159     __attribute__((__noreturn__,__format__(__kprintf__,1,2)));
160 void	__assert(const char *, const char *, int, const char *)
161     __attribute__((__noreturn__));
162 int	printf(const char *, ...)
163     __attribute__((__format__(__kprintf__,1,2)));
164 void	uprintf(const char *, ...)
165     __attribute__((__format__(__kprintf__,1,2)));
166 int	vprintf(const char *, va_list)
167     __attribute__((__format__(__kprintf__,1,0)));
168 int	vsnprintf(char *, size_t, const char *, va_list)
169     __attribute__((__format__(__kprintf__,3,0)));
170 int	snprintf(char *buf, size_t, const char *, ...)
171     __attribute__((__format__(__kprintf__,3,4)));
172 struct tty;
173 void	ttyprintf(struct tty *, const char *, ...)
174     __attribute__((__format__(__kprintf__,2,3)));
175 
176 void	splassert_fail(int, int, const char *);
177 extern	int splassert_ctl;
178 
179 void	assertwaitok(void);
180 
181 void	tablefull(const char *);
182 
183 int	kcopy(const void *, void *, size_t)
184 		__attribute__ ((__bounded__(__buffer__,1,3)))
185 		__attribute__ ((__bounded__(__buffer__,2,3)));
186 
187 void	bcopy(const void *, void *, size_t)
188 		__attribute__ ((__bounded__(__buffer__,1,3)))
189 		__attribute__ ((__bounded__(__buffer__,2,3)));
190 void	bzero(void *, size_t)
191 		__attribute__ ((__bounded__(__buffer__,1,2)));
192 void	explicit_bzero(void *, size_t)
193 		__attribute__ ((__bounded__(__buffer__,1,2)));
194 int	bcmp(const void *, const void *, size_t);
195 void	*memcpy(void *, const void *, size_t)
196 		__attribute__ ((__bounded__(__buffer__,1,3)))
197 		__attribute__ ((__bounded__(__buffer__,2,3)));
198 void	*memmove(void *, const void *, size_t)
199 		__attribute__ ((__bounded__(__buffer__,1,3)))
200 		__attribute__ ((__bounded__(__buffer__,2,3)));
201 void	*memset(void *, int, size_t)
202 		__attribute__ ((__bounded__(__buffer__,1,3)));
203 
204 int	copyinstr(const void *, void *, size_t, size_t *)
205 		__attribute__ ((__bounded__(__string__,2,3)));
206 int	_copyinstr(const void *, void *, size_t, size_t *)
207 		__attribute__ ((__bounded__(__string__,2,3)));
208 int	copyoutstr(const void *, void *, size_t, size_t *);
209 int	copyin(const void *, void *, size_t)
210 		__attribute__ ((__bounded__(__buffer__,2,3)));
211 int	_copyin(const void *, void *, size_t)
212 		__attribute__ ((__bounded__(__buffer__,2,3)));
213 int	copyout(const void *, void *, size_t);
214 int	copyin32(const uint32_t *, uint32_t *);
215 
216 void	random_start(int);
217 void	enqueue_randomness(unsigned int);
218 void	suspend_randomness(void);
219 void	resume_randomness(char *, size_t);
220 
221 struct arc4random_ctx;
222 void	arc4random_buf(void *, size_t)
223 		__attribute__ ((__bounded__(__buffer__,1,2)));
224 struct arc4random_ctx	*arc4random_ctx_new(void);
225 void	arc4random_ctx_free(struct arc4random_ctx *);
226 void	arc4random_ctx_buf(struct arc4random_ctx *, void *, size_t);
227 u_int32_t arc4random(void);
228 u_int32_t arc4random_uniform(u_int32_t);
229 
230 struct timeval;
231 struct timespec;
232 int	tvtohz(const struct timeval *);
233 int	tstohz(const struct timespec *);
234 void	realitexpire(void *);
235 
236 extern uint64_t hardclock_period;
237 extern uint64_t statclock_avg;
238 extern int statclock_is_randomized;
239 
240 struct clockframe;
241 void	hardclock(struct clockframe *);
242 
243 struct clockrequest;
244 void	statclock(struct clockrequest *, void *, void *);
245 
246 void	initclocks(void);
247 void	inittodr(time_t);
248 void	resettodr(void);
249 void	cpu_initclocks(void);
250 void	cpu_startclock(void);
251 
252 void	startprofclock(struct process *);
253 void	stopprofclock(struct process *);
254 void	setstatclockrate(int);
255 
256 void	start_periodic_resettodr(void);
257 void	stop_periodic_resettodr(void);
258 
259 void	sleep_setup(const volatile void *, int, const char *);
260 int	sleep_finish(int, int);
261 void	sleep_queue_init(void);
262 
263 struct cond;
264 void	cond_init(struct cond *);
265 void	cond_wait(struct cond *, const char *);
266 void	cond_signal(struct cond *);
267 
268 #define	INFSLP	UINT64_MAX
269 #define	MAXTSLP	(UINT64_MAX - 1)
270 
271 struct mutex;
272 struct rwlock;
273 void    wakeup_n(const volatile void *, int);
274 void    wakeup(const volatile void *);
275 #define wakeup_one(c) wakeup_n((c), 1)
276 int	tsleep(const volatile void *, int, const char *, int);
277 int	tsleep_nsec(const volatile void *, int, const char *, uint64_t);
278 int	msleep(const volatile void *, struct mutex *, int,  const char*, int);
279 int	msleep_nsec(const volatile void *, struct mutex *, int,  const char*,
280 	    uint64_t);
281 int	rwsleep(const volatile void *, struct rwlock *, int, const char *, int);
282 int	rwsleep_nsec(const volatile void *, struct rwlock *, int, const char *,
283 	    uint64_t);
284 void	yield(void);
285 
286 void	wdog_register(int (*)(void *, int), void *);
287 void	wdog_shutdown(void *);
288 
289 /*
290  * Startup hooks are functions running after the scheduler has started
291  * but before any threads have been created or root has been mounted.
292  */
293 
294 struct hook_desc {
295 	TAILQ_ENTRY(hook_desc) hd_list;
296 	void	(*hd_fn)(void *);
297 	void	*hd_arg;
298 };
299 TAILQ_HEAD(hook_desc_head, hook_desc);
300 
301 extern struct hook_desc_head startuphook_list;
302 
303 void	*hook_establish(struct hook_desc_head *, int, void (*)(void *), void *);
304 void	hook_disestablish(struct hook_desc_head *, void *);
305 void	dohooks(struct hook_desc_head *, int);
306 
307 #define HOOK_REMOVE	0x01
308 #define HOOK_FREE	0x02
309 
310 #define startuphook_establish(fn, arg) \
311 	hook_establish(&startuphook_list, 1, (fn), (arg))
312 #define startuphook_disestablish(vhook) \
313 	hook_disestablish(&startuphook_list, (vhook))
314 #define dostartuphooks() dohooks(&startuphook_list, HOOK_REMOVE|HOOK_FREE)
315 
316 struct uio;
317 int	uiomove(void *, size_t, struct uio *);
318 
319 #if defined(_KERNEL)
320 
321 #include <sys/rwlock.h>
322 
323 extern struct rwlock netlock;
324 
325 /*
326  * Network stack data structures are, unless stated otherwise, protected
327  * by the NET_LOCK().  It's a single non-recursive lock for the whole
328  * subsystem.
329  */
330 #define	NET_LOCK()	do { rw_enter_write(&netlock); } while (0)
331 #define	NET_UNLOCK()	do { rw_exit_write(&netlock); } while (0)
332 
333 /*
334  * Reader version of NET_LOCK().
335  * The "softnet" thread should be the only thread processing packets
336  * without holding an exclusive lock.  This is done to allow read-only
337  * ioctl(2) to not block.
338  * Shared lock can be grabbed instead of the exclusive version if no field
339  * protected by the NET_LOCK() is modified by the ioctl/sysctl.
340  * Socket system call can use shared netlock if it has additional locks
341  * to protect socket and pcb data structures.
342  */
343 #define	NET_LOCK_SHARED()	do { rw_enter_read(&netlock); } while (0)
344 #define	NET_UNLOCK_SHARED()	do { rw_exit_read(&netlock); } while (0)
345 
346 #ifdef DIAGNOSTIC
347 
348 #define	NET_ASSERT_UNLOCKED()						\
349 do {									\
350 	int _s = rw_status(&netlock);					\
351 	if ((splassert_ctl > 0) && (_s == RW_WRITE))			\
352 		splassert_fail(0, RW_WRITE, __func__);			\
353 } while (0)
354 
355 #define	NET_ASSERT_LOCKED()						\
356 do {									\
357 	int _s = rw_status(&netlock);					\
358 	if ((splassert_ctl > 0) && (_s != RW_WRITE && _s != RW_READ))	\
359 		splassert_fail(RW_READ, _s, __func__);			\
360 } while (0)
361 
362 #define	NET_ASSERT_LOCKED_EXCLUSIVE()					\
363 do {									\
364 	int _s = rw_status(&netlock);					\
365 	if ((splassert_ctl > 0) && (_s != RW_WRITE))			\
366 		splassert_fail(RW_WRITE, _s, __func__);			\
367 } while (0)
368 
369 #else /* DIAGNOSTIC */
370 #define	NET_ASSERT_UNLOCKED()		do {} while (0)
371 #define	NET_ASSERT_LOCKED()		do {} while (0)
372 #define	NET_ASSERT_LOCKED_EXCLUSIVE()	do {} while (0)
373 #endif /* !DIAGNOSTIC */
374 
375 __returns_twice int	setjmp(label_t *);
376 __dead void	longjmp(label_t *);
377 #endif
378 
379 void	consinit(void);
380 
381 void	cpu_startup(void);
382 void	cpu_configure(void);
383 void	diskconf(void);
384 
385 int nfs_mountroot(void);
386 int dk_mountroot(void);
387 extern int (*mountroot)(void);
388 
389 #include <lib/libkern/libkern.h>
390 
391 #define bzero(b, n)		__builtin_bzero((b), (n))
392 #define memcmp(b1, b2, n)	__builtin_memcmp((b1), (b2), (n))
393 #define memcpy(d, s, n)		__builtin_memcpy((d), (s), (n))
394 #define memset(b, c, n)		__builtin_memset((b), (c), (n))
395 #if (defined(__GNUC__) && __GNUC__ >= 4)
396 #define memmove(d, s, n)	__builtin_memmove((d), (s), (n))
397 #endif
398 #if !defined(__clang__) && (defined(__GNUC__) && __GNUC__ >= 4)
399 #define bcmp(b1, b2, n)		__builtin_bcmp((b1), (b2), (n))
400 #define bcopy(s, d, n)		__builtin_bcopy((s), (d), (n))
401 #endif
402 
403 #if defined(DDB)
404 /* debugger entry points */
405 void	db_enter(void);	/* in DDB only */
406 int	db_rint(int);
407 #endif
408 
409 #ifdef BOOT_CONFIG
410 void	user_config(void);
411 #endif
412 
413 #if defined(MULTIPROCESSOR)
414 void	_kernel_lock_init(void);
415 void	_kernel_lock(void);
416 void	_kernel_unlock(void);
417 int	_kernel_lock_held(void);
418 
419 #define	KERNEL_LOCK_INIT()		_kernel_lock_init()
420 #define	KERNEL_LOCK()			_kernel_lock()
421 #define	KERNEL_UNLOCK()			_kernel_unlock()
422 #define	KERNEL_ASSERT_LOCKED()		KASSERT(_kernel_lock_held())
423 #define	KERNEL_ASSERT_UNLOCKED()	KASSERT(panicstr || db_active || !_kernel_lock_held())
424 
425 #else /* ! MULTIPROCESSOR */
426 
427 #define	KERNEL_LOCK_INIT()		/* nothing */
428 #define	KERNEL_LOCK()			/* nothing */
429 #define	KERNEL_UNLOCK()			/* nothing */
430 #define	KERNEL_ASSERT_LOCKED()		/* nothing */
431 #define	KERNEL_ASSERT_UNLOCKED()	/* nothing */
432 
433 #endif /* MULTIPROCESSOR */
434 
435 #endif /* __SYSTM_H__ */
436