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