| Commit | Line | Data |
|---|---|---|
| 984263bc MD |
1 | /*- |
| 2 | * Copyright (c) 1982, 1988, 1991, 1993 | |
| 3 | * The Regents of the University of California. All rights reserved. | |
| 4 | * (c) UNIX System Laboratories, Inc. | |
| 5 | * All or some portions of this file are derived from material licensed | |
| 6 | * to the University of California by American Telephone and Telegraph | |
| 7 | * Co. or Unix System Laboratories, Inc. and are reproduced herein with | |
| 8 | * the permission of UNIX System Laboratories, Inc. | |
| 9 | * | |
| 10 | * Redistribution and use in source and binary forms, with or without | |
| 11 | * modification, are permitted provided that the following conditions | |
| 12 | * are met: | |
| 13 | * 1. Redistributions of source code must retain the above copyright | |
| 14 | * notice, this list of conditions and the following disclaimer. | |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 16 | * notice, this list of conditions and the following disclaimer in the | |
| 17 | * documentation and/or other materials provided with the distribution. | |
| 18 | * 3. All advertising materials mentioning features or use of this software | |
| 19 | * must display the following acknowledgement: | |
| 20 | * This product includes software developed by the University of | |
| 21 | * California, Berkeley and its contributors. | |
| 22 | * 4. Neither the name of the University nor the names of its contributors | |
| 23 | * may be used to endorse or promote products derived from this software | |
| 24 | * without specific prior written permission. | |
| 25 | * | |
| 26 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
| 27 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 28 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 29 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
| 30 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 31 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| 32 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| 33 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 34 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 35 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 36 | * SUCH DAMAGE. | |
| 37 | * | |
| 38 | * @(#)systm.h 8.7 (Berkeley) 3/29/95 | |
| 39 | * $FreeBSD: src/sys/sys/systm.h,v 1.111.2.18 2002/12/17 18:04:02 sam Exp $ | |
| a535608c | 40 | * $DragonFly: src/sys/sys/systm.h,v 1.81 2008/09/11 00:35:49 dillon Exp $ |
| 984263bc MD |
41 | */ |
| 42 | ||
| 43 | #ifndef _SYS_SYSTM_H_ | |
| 44 | #define _SYS_SYSTM_H_ | |
| 45 | ||
| d9f3f6fa CP |
46 | #ifndef _KERNEL |
| 47 | #error "This file should not be included by userland programs." | |
| 03d6a592 | 48 | #else |
| d9f3f6fa | 49 | |
| e2565a42 MD |
50 | #ifndef _MACHINE_TYPES_H_ |
| 51 | #include <machine/types.h> | |
| 52 | #endif | |
| 53 | #ifndef _MACHINE_STDARG_H_ | |
| 54 | #include <machine/stdarg.h> | |
| 55 | #endif | |
| 984263bc MD |
56 | #include <machine/atomic.h> |
| 57 | #include <machine/cpufunc.h> | |
| 58 | #include <sys/callout.h> | |
| 59 | ||
| 60 | extern int securelevel; /* system security level (see init(8)) */ | |
| 7e42c007 | 61 | extern int kernel_mem_readonly; /* disable writes to kernel memory */ |
| 984263bc MD |
62 | |
| 63 | extern int cold; /* nonzero if we are doing a cold boot */ | |
| dbcd0c9b | 64 | extern int tsleep_now_works; /* tsleep won't just return any more */ |
| 984263bc MD |
65 | extern const char *panicstr; /* panic message */ |
| 66 | extern int dumping; /* system is dumping */ | |
| 67 | extern int safepri; /* safe ipl when cold or panicing */ | |
| 68 | extern char version[]; /* system version */ | |
| 69 | extern char copyright[]; /* system copyright */ | |
| 70 | ||
| 984263bc MD |
71 | extern int selwait; /* select timeout address */ |
| 72 | ||
| 73 | extern u_char curpriority; /* priority of current process */ | |
| 74 | ||
| 75 | extern int physmem; /* physical memory */ | |
| 76 | ||
| b13267a5 | 77 | extern cdev_t dumpdev; /* dump device */ |
| e0fc5693 MD |
78 | extern int dumplo; /* OBSOLETE */ |
| 79 | extern u_int64_t dumplo64; /* block number into dumpdev, start of dump */ | |
| 984263bc | 80 | |
| b13267a5 MD |
81 | extern cdev_t rootdev; /* root device */ |
| 82 | extern cdev_t rootdevs[2]; /* possible root devices */ | |
| 984263bc | 83 | extern char *rootdevnames[2]; /* names of possible root devices */ |
| c7841cbe | 84 | extern char *ZeroPage; |
| 984263bc MD |
85 | |
| 86 | extern int boothowto; /* reboot flags, from console subsystem */ | |
| 87 | extern int bootverbose; /* nonzero to print verbose messages */ | |
| 88 | ||
| 89 | extern int maxusers; /* system tune hint */ | |
| 90 | ||
| 17a9f566 | 91 | extern int ncpus; /* total number of cpus (real, hyper, virtual)*/ |
| 90100055 JH |
92 | extern int ncpus2; /* ncpus rounded down to power of 2 */ |
| 93 | extern int ncpus2_shift; /* log base 2 of ncpus2 */ | |
| 94 | extern int ncpus2_mask; /* ncpus2 - 1 */ | |
| b45759e1 MD |
95 | extern int ncpus_fit; /* round up to a power of 2 */ |
| 96 | extern int ncpus_fit_mask; /* ncpus_fit - 1 */ | |
| da3639ef | 97 | extern int clocks_running; /* timing/timeout subsystem is operational */ |
| 17a9f566 | 98 | |
| c1543a89 | 99 | /* XXX TGEN these don't belong here, they're MD on i386/x86_64 */ |
| 527fddf7 | 100 | extern u_int cpu_feature; /* CPUID_* features */ |
| 97ee3efc TS |
101 | extern u_int cpu_feature2; /* CPUID2_* features */ |
| 102 | ||
| b9b7eb27 MD |
103 | extern int nfs_diskless_valid; /* NFS diskless params were obtained */ |
| 104 | extern vm_paddr_t Maxmem; /* Highest physical memory address in system */ | |
| 527fddf7 | 105 | |
| 984263bc | 106 | #ifdef INVARIANTS /* The option is always available */ |
| a535608c MD |
107 | #define KASSERT(exp,msg) do { if (__predict_false(!(exp))) \ |
| 108 | panic msg; } while (0) | |
| 109 | #define KKASSERT(exp) do { if (__predict_false(!(exp))) \ | |
| 110 | panic("assertion: %s in %s", \ | |
| 111 | #exp, __func__); } while (0) | |
| 984263bc MD |
112 | #else |
| 113 | #define KASSERT(exp,msg) | |
| 41c20dac | 114 | #define KKASSERT(exp) |
| 984263bc MD |
115 | #endif |
| 116 | ||
| 832f5800 JS |
117 | #define CTASSERT(x) _CTASSERT(x, __LINE__) |
| 118 | #define _CTASSERT(x, y) __CTASSERT(x, y) | |
| 119 | #define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1] | |
| 120 | ||
| 984263bc MD |
121 | /* |
| 122 | * General function declarations. | |
| 123 | */ | |
| 124 | ||
| 88c4d2f6 | 125 | struct intrframe; |
| bf765287 | 126 | struct spinlock; |
| bed060de | 127 | struct lock; |
| 7f6220a9 | 128 | struct mtx; |
| 362e59be | 129 | struct lwkt_serialize; |
| 984263bc MD |
130 | struct malloc_type; |
| 131 | struct proc; | |
| f1d1c3fa | 132 | struct xwait; |
| 984263bc MD |
133 | struct timeval; |
| 134 | struct tty; | |
| 135 | struct uio; | |
| 8ad65e08 | 136 | struct globaldata; |
| 41c20dac | 137 | struct thread; |
| 4a22e893 | 138 | struct trapframe; |
| 6bf59cd2 | 139 | struct user; |
| 135d7199 | 140 | struct vmspace; |
| 4e7c41c5 | 141 | struct savetls; |
| c8dfd00d | 142 | struct krate; |
| 984263bc | 143 | |
| b153f746 | 144 | void Debugger (const char *msg); |
| 1e5fb84b | 145 | void print_backtrace(void); |
| b153f746 | 146 | void mi_gdinit (struct globaldata *gd, int cpu); |
| 6bf59cd2 | 147 | void mi_proc0init(struct globaldata *gd, struct user *proc0paddr); |
| b153f746 RG |
148 | int dumpstatus (vm_offset_t addr, off_t count); |
| 149 | int nullop (void); | |
| b13267a5 | 150 | int seltrue (cdev_t dev, int which); |
| b153f746 RG |
151 | int ureadc (int, struct uio *); |
| 152 | void *hashinit (int count, struct malloc_type *type, u_long *hashmask); | |
| 153 | void *phashinit (int count, struct malloc_type *type, u_long *nentries); | |
| 154 | ||
| 4a22e893 | 155 | int cpu_sanitize_frame (struct trapframe *); |
| 4e7c41c5 | 156 | int cpu_sanitize_tls (struct savetls *); |
| b402c633 | 157 | void cpu_mplock_contested(void); |
| 06615ccb | 158 | void cpu_spinlock_contested(void); |
| 527fddf7 MD |
159 | void cpu_halt (void); |
| 160 | void cpu_reset (void); | |
| b153f746 RG |
161 | void cpu_boot (int); |
| 162 | void cpu_rootconf (void); | |
| 135d7199 MD |
163 | void cpu_vmspace_alloc(struct vmspace *); |
| 164 | void cpu_vmspace_free(struct vmspace *); | |
| 4e7c41c5 | 165 | void set_user_TLS(void); |
| 431d0fef | 166 | void set_vkernel_fp(struct trapframe *); |
| 460426e6 | 167 | int kvm_access_check(vm_offset_t, vm_offset_t, int); |
| 1184892f MD |
168 | |
| 169 | vm_paddr_t kvtop(void *addr); | |
| 170 | int is_physical_memory (vm_offset_t addr); | |
| 171 | ||
| 984263bc MD |
172 | extern uint32_t crc32_tab[]; |
| 173 | uint32_t crc32(const void *buf, size_t size); | |
| 432417ed | 174 | uint32_t crc32_ext(const void *buf, size_t size, uint32_t ocrc); |
| b153f746 RG |
175 | void init_param1 (void); |
| 176 | void init_param2 (int physpages); | |
| 177 | void tablefull (const char *); | |
| 379210cb | 178 | int kvcprintf (char const *, void (*)(int, void*), void *, int, |
| e2565a42 | 179 | __va_list) __printflike(1, 0); |
| b153f746 RG |
180 | int log (int, const char *, ...) __printflike(2, 3); |
| 181 | void logwakeup (void); | |
| 182 | void log_console (struct uio *); | |
| 169276ba | 183 | int kprintf (const char *, ...) __printflike(1, 2); |
| 28a93126 | 184 | int kprintf0(const char *, ...) __printflike(1, 2); |
| c8dfd00d | 185 | void krateprintf (struct krate *, const char *, ...) __printflike(2, 3); |
| 169276ba | 186 | int ksnprintf (char *, size_t, const char *, ...) __printflike(3, 4); |
| 93c46bf9 | 187 | int ksnrprintf (char *, size_t, int, const char *, ...) __printflike(4, 5); |
| 169276ba | 188 | int ksprintf (char *buf, const char *, ...) __printflike(2, 3); |
| b153f746 | 189 | int uprintf (const char *, ...) __printflike(1, 2); |
| 379210cb | 190 | int kvprintf (const char *, __va_list) __printflike(1, 0); |
| 93c46bf9 MD |
191 | int kvsnprintf (char *, size_t, const char *, |
| 192 | __va_list) __printflike(3, 0); | |
| 193 | int kvsnrprintf (char *, size_t, int, const char *, | |
| 194 | __va_list) __printflike(4, 0); | |
| 195 | int kvasnrprintf (char **, size_t, int, const char *, | |
| 196 | __va_list) __printflike(4, 0); | |
| 197 | int kvsprintf (char *buf, const char *, | |
| 198 | __va_list) __printflike(2, 0); | |
| b153f746 | 199 | int ttyprintf (struct tty *, const char *, ...) __printflike(2, 3); |
| e93690c2 MD |
200 | int ksscanf (const char *, char const *, ...); |
| 201 | int kvsscanf (const char *, char const *, __va_list); | |
| 93c46bf9 | 202 | void kvasfree(char **); |
| 44a09dd6 | 203 | |
| b153f746 RG |
204 | long strtol (const char *, char **, int); |
| 205 | u_long strtoul (const char *, char **, int); | |
| 206 | quad_t strtoq (const char *, char **, int); | |
| 207 | u_quad_t strtouq (const char *, char **, int); | |
| 984263bc | 208 | |
| f15db79e MD |
209 | /* |
| 210 | * note: some functions commonly used by device drivers may be passed | |
| 211 | * pointers to volatile storage, volatile set to avoid warnings. | |
| 527fddf7 MD |
212 | * |
| 213 | * NOTE: bcopyb() - is a dumb byte-granular bcopy. This routine is | |
| 214 | * explicitly not meant to be sophisticated. | |
| 215 | * NOTE: bcopyi() - is a dumb int-granular bcopy (len is still in bytes). | |
| 216 | * This routine is explicitly not meant to be sophisticated. | |
| f15db79e | 217 | */ |
| 527fddf7 MD |
218 | void bcopyb (const void *from, void *to, size_t len); |
| 219 | void bcopyi (const void *from, void *to, size_t len); | |
| b153f746 RG |
220 | void bcopy (volatile const void *from, volatile void *to, size_t len); |
| 221 | void ovbcopy (const void *from, void *to, size_t len); | |
| afaa1d56 | 222 | void bzero (volatile void *buf, size_t len); |
| b153f746 | 223 | void *memcpy (void *to, const void *from, size_t len); |
| 984263bc | 224 | |
| b153f746 RG |
225 | int copystr (const void *kfaddr, void *kdaddr, size_t len, |
| 226 | size_t *lencopied); | |
| 227 | int copyinstr (const void *udaddr, void *kaddr, size_t len, | |
| 228 | size_t *lencopied); | |
| 229 | int copyin (const void *udaddr, void *kaddr, size_t len); | |
| 230 | int copyout (const void *kaddr, void *udaddr, size_t len); | |
| 984263bc | 231 | |
| b153f746 RG |
232 | int fubyte (const void *base); |
| 233 | int subyte (void *base, int byte); | |
| b153f746 RG |
234 | long fuword (const void *base); |
| 235 | int suword (void *base, long word); | |
| 236 | int fusword (void *base); | |
| 237 | int susword (void *base, int word); | |
| 984263bc | 238 | |
| b153f746 | 239 | void realitexpire (void *); |
| f0f0df1c | 240 | void DELAY(int usec); |
| dbcd0c9b | 241 | void DRIVERSLEEP(int usec); |
| 984263bc | 242 | |
| b153f746 RG |
243 | void startprofclock (struct proc *); |
| 244 | void stopprofclock (struct proc *); | |
| 245 | void setstatclockrate (int hzrate); | |
| 984263bc | 246 | |
| b9b7eb27 MD |
247 | /* |
| 248 | * Console I/O spinlocks - these typically also hard-disable interrupts | |
| 249 | * for the duration. | |
| 250 | */ | |
| 251 | void cons_lock(void); | |
| 252 | void cons_unlock(void); | |
| 253 | ||
| a01a0504 TS |
254 | /* |
| 255 | * Kernel environment support functions and sundry. | |
| 256 | */ | |
| bc01a404 | 257 | char *kgetenv (const char *name); |
| a01a0504 TS |
258 | int ksetenv(const char *name, const char *value); |
| 259 | int kunsetenv(const char *name); | |
| 260 | void kfreeenv(char *env); | |
| 261 | int ktestenv(const char *name); | |
| bc01a404 MD |
262 | int kgetenv_int (const char *name, int *data); |
| 263 | int kgetenv_string (const char *name, char *data, int size); | |
| 28a93126 | 264 | int kgetenv_ulong(const char *name, unsigned long *data); |
| bc01a404 | 265 | int kgetenv_quad (const char *name, quad_t *data); |
| 79634a66 | 266 | int kgetenv_long(const char *name, long *data); |
| 984263bc MD |
267 | extern char *kern_envp; |
| 268 | ||
| 269 | #ifdef APM_FIXUP_CALLTODO | |
| b153f746 | 270 | void adjust_timeout_calltodo (struct timeval *time_change); |
| 984263bc MD |
271 | #endif /* APM_FIXUP_CALLTODO */ |
| 272 | ||
| 273 | #include <sys/libkern.h> | |
| 274 | ||
| 275 | /* Initialize the world */ | |
| a8a86718 | 276 | void mi_startup (void); |
| b153f746 | 277 | void nchinit (void); |
| 984263bc MD |
278 | |
| 279 | /* Finalize the world. */ | |
| b153f746 | 280 | void shutdown_nice (int); |
| 984263bc MD |
281 | |
| 282 | /* | |
| 283 | * Kernel to clock driver interface. | |
| 284 | */ | |
| b153f746 RG |
285 | void inittodr (time_t base); |
| 286 | void resettodr (void); | |
| 287 | void startrtclock (void); | |
| 984263bc MD |
288 | |
| 289 | /* Timeouts */ | |
| b153f746 | 290 | typedef void timeout_t (void *); /* timeout function type */ |
| 984263bc MD |
291 | |
| 292 | /* Interrupt management */ | |
| 293 | ||
| 294 | /* | |
| 295 | * For the alpha arch, some of these functions are static __inline, and | |
| 296 | * the others should be. | |
| 297 | */ | |
| c1543a89 | 298 | #if defined(__i386__) || defined(__x86_64__) |
| b153f746 | 299 | void setdelayed (void); |
| b153f746 RG |
300 | void setsoftcambio (void); |
| 301 | void setsoftcamnet (void); | |
| 0fb6ec96 | 302 | void setsoftunused02 (void); |
| b153f746 | 303 | void setsoftcrypto (void); |
| 0fb6ec96 | 304 | void setsoftunused01 (void); |
| b153f746 RG |
305 | void setsofttty (void); |
| 306 | void setsoftvm (void); | |
| 307 | void setsofttq (void); | |
| b153f746 | 308 | void schedsofttty (void); |
| b153f746 | 309 | void splz (void); |
| faaeffac | 310 | void splz_check (void); |
| 984263bc MD |
311 | #endif /* __i386__ */ |
| 312 | ||
| 984263bc MD |
313 | /* |
| 314 | * Various callout lists. | |
| 315 | */ | |
| 316 | ||
| 317 | /* Exit callout list declarations. */ | |
| b153f746 | 318 | typedef void (*exitlist_fn) (struct thread *td); |
| 984263bc | 319 | |
| b153f746 RG |
320 | int at_exit (exitlist_fn function); |
| 321 | int rm_at_exit (exitlist_fn function); | |
| 984263bc MD |
322 | |
| 323 | /* Fork callout list declarations. */ | |
| b153f746 RG |
324 | typedef void (*forklist_fn) (struct proc *parent, struct proc *child, |
| 325 | int flags); | |
| 984263bc | 326 | |
| b153f746 RG |
327 | int at_fork (forklist_fn function); |
| 328 | int rm_at_fork (forklist_fn function); | |
| 984263bc MD |
329 | |
| 330 | /* | |
| 331 | * Not exactly a callout LIST, but a callout entry. | |
| 332 | * Allow an external module to define a hardware watchdog tickler. | |
| 333 | * Normally a process would do this, but there are times when the | |
| 334 | * kernel needs to be able to hold off the watchdog, when the process | |
| 335 | * is not active, e.g., when dumping core. | |
| 336 | */ | |
| b153f746 | 337 | typedef void (*watchdog_tickle_fn) (void); |
| 984263bc MD |
338 | |
| 339 | extern watchdog_tickle_fn wdog_tickler; | |
| 340 | ||
| 341 | /* | |
| 342 | * Common `proc' functions are declared here so that proc.h can be included | |
| 343 | * less often. | |
| 344 | */ | |
| bf765287 | 345 | int tsleep (void *, int, const char *, int); |
| e590ee86 | 346 | int ssleep (void *, struct spinlock *, int, const char *, int); |
| bed060de | 347 | int lksleep (void *, struct lock *, int, const char *, int); |
| 7f6220a9 | 348 | int mtxsleep (void *, struct mtx *, int, const char *, int); |
| ed3f6624 | 349 | int zsleep(void *, struct lwkt_serialize *, int, const char *, int); |
| ae8e83e6 MD |
350 | void tsleep_interlock (void *, int); |
| 351 | void tsleep_remove (struct thread *); | |
| a22c590e | 352 | int lwkt_sleep (const char *, int); |
| 9a379a4a | 353 | void tstop (void); |
| b153f746 RG |
354 | void wakeup (void *chan); |
| 355 | void wakeup_one (void *chan); | |
| b336a9b1 MD |
356 | void wakeup_mycpu (void *chan); |
| 357 | void wakeup_mycpu_one (void *chan); | |
| 358 | void wakeup_oncpu (struct globaldata *gd, void *chan); | |
| 359 | void wakeup_oncpu_one (struct globaldata *gd, void *chan); | |
| da5fb9ef MD |
360 | void wakeup_domain (void *chan, int domain); |
| 361 | void wakeup_domain_one (void *chan, int domain); | |
| 984263bc MD |
362 | |
| 363 | /* | |
| b13267a5 | 364 | * Common `cdev_t' stuff are declared here to avoid #include poisoning |
| 984263bc MD |
365 | */ |
| 366 | ||
| b13267a5 MD |
367 | int major(cdev_t x); |
| 368 | int minor(cdev_t x); | |
| 369 | udev_t dev2udev(cdev_t x); | |
| 370 | cdev_t udev2dev(udev_t x, int b); | |
| 984263bc MD |
371 | int uminor(udev_t dev); |
| 372 | int umajor(udev_t dev); | |
| 373 | udev_t makeudev(int x, int y); | |
| 03d6a592 MD |
374 | |
| 375 | #endif /* _KERNEL */ | |
| 984263bc | 376 | #endif /* !_SYS_SYSTM_H_ */ |