| 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 */ |
| 984263bc MD |
84 | |
| 85 | extern int boothowto; /* reboot flags, from console subsystem */ | |
| 86 | extern int bootverbose; /* nonzero to print verbose messages */ | |
| 87 | ||
| 88 | extern int maxusers; /* system tune hint */ | |
| 89 | ||
| 17a9f566 | 90 | extern int ncpus; /* total number of cpus (real, hyper, virtual)*/ |
| 90100055 JH |
91 | extern int ncpus2; /* ncpus rounded down to power of 2 */ |
| 92 | extern int ncpus2_shift; /* log base 2 of ncpus2 */ | |
| 93 | extern int ncpus2_mask; /* ncpus2 - 1 */ | |
| b45759e1 MD |
94 | extern int ncpus_fit; /* round up to a power of 2 */ |
| 95 | extern int ncpus_fit_mask; /* ncpus_fit - 1 */ | |
| da3639ef | 96 | extern int clocks_running; /* timing/timeout subsystem is operational */ |
| 17a9f566 | 97 | |
| 97ee3efc | 98 | /* XXX TGEN these don't belong here, they're MD on i386/amd64 */ |
| 527fddf7 | 99 | extern u_int cpu_feature; /* CPUID_* features */ |
| 97ee3efc TS |
100 | extern u_int cpu_feature2; /* CPUID2_* features */ |
| 101 | ||
| b9b7eb27 MD |
102 | extern int nfs_diskless_valid; /* NFS diskless params were obtained */ |
| 103 | extern vm_paddr_t Maxmem; /* Highest physical memory address in system */ | |
| 527fddf7 | 104 | |
| 984263bc | 105 | #ifdef INVARIANTS /* The option is always available */ |
| a535608c MD |
106 | #define KASSERT(exp,msg) do { if (__predict_false(!(exp))) \ |
| 107 | panic msg; } while (0) | |
| 108 | #define KKASSERT(exp) do { if (__predict_false(!(exp))) \ | |
| 109 | panic("assertion: %s in %s", \ | |
| 110 | #exp, __func__); } while (0) | |
| 984263bc MD |
111 | #else |
| 112 | #define KASSERT(exp,msg) | |
| 41c20dac | 113 | #define KKASSERT(exp) |
| 984263bc MD |
114 | #endif |
| 115 | ||
| 832f5800 JS |
116 | #define CTASSERT(x) _CTASSERT(x, __LINE__) |
| 117 | #define _CTASSERT(x, y) __CTASSERT(x, y) | |
| 118 | #define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1] | |
| 119 | ||
| 984263bc MD |
120 | /* |
| 121 | * General function declarations. | |
| 122 | */ | |
| 123 | ||
| 88c4d2f6 | 124 | struct intrframe; |
| bf765287 | 125 | struct spinlock; |
| 7f6220a9 | 126 | struct mtx; |
| 362e59be | 127 | struct lwkt_serialize; |
| 984263bc MD |
128 | struct malloc_type; |
| 129 | struct proc; | |
| f1d1c3fa | 130 | struct xwait; |
| 984263bc MD |
131 | struct timeval; |
| 132 | struct tty; | |
| 133 | struct uio; | |
| 8ad65e08 | 134 | struct globaldata; |
| 41c20dac | 135 | struct thread; |
| 4a22e893 | 136 | struct trapframe; |
| 6bf59cd2 | 137 | struct user; |
| 135d7199 | 138 | struct vmspace; |
| 4e7c41c5 | 139 | struct savetls; |
| c8dfd00d | 140 | struct krate; |
| 984263bc | 141 | |
| b153f746 | 142 | void Debugger (const char *msg); |
| 1e5fb84b | 143 | void print_backtrace(void); |
| b153f746 | 144 | void mi_gdinit (struct globaldata *gd, int cpu); |
| 6bf59cd2 | 145 | void mi_proc0init(struct globaldata *gd, struct user *proc0paddr); |
| b153f746 RG |
146 | int dumpstatus (vm_offset_t addr, off_t count); |
| 147 | int nullop (void); | |
| b13267a5 | 148 | int seltrue (cdev_t dev, int which); |
| b153f746 RG |
149 | int ureadc (int, struct uio *); |
| 150 | void *hashinit (int count, struct malloc_type *type, u_long *hashmask); | |
| 151 | void *phashinit (int count, struct malloc_type *type, u_long *nentries); | |
| 152 | ||
| 4a22e893 | 153 | int cpu_sanitize_frame (struct trapframe *); |
| 4e7c41c5 | 154 | int cpu_sanitize_tls (struct savetls *); |
| b402c633 | 155 | void cpu_mplock_contested(void); |
| 06615ccb | 156 | void cpu_spinlock_contested(void); |
| 527fddf7 MD |
157 | void cpu_halt (void); |
| 158 | void cpu_reset (void); | |
| b153f746 RG |
159 | void cpu_boot (int); |
| 160 | void cpu_rootconf (void); | |
| 135d7199 MD |
161 | void cpu_vmspace_alloc(struct vmspace *); |
| 162 | void cpu_vmspace_free(struct vmspace *); | |
| 4e7c41c5 | 163 | void set_user_TLS(void); |
| 431d0fef | 164 | void set_vkernel_fp(struct trapframe *); |
| 460426e6 | 165 | int kvm_access_check(vm_offset_t, vm_offset_t, int); |
| 1184892f MD |
166 | |
| 167 | vm_paddr_t kvtop(void *addr); | |
| 168 | int is_physical_memory (vm_offset_t addr); | |
| 169 | ||
| 984263bc MD |
170 | extern uint32_t crc32_tab[]; |
| 171 | uint32_t crc32(const void *buf, size_t size); | |
| 432417ed | 172 | uint32_t crc32_ext(const void *buf, size_t size, uint32_t ocrc); |
| b153f746 RG |
173 | void init_param1 (void); |
| 174 | void init_param2 (int physpages); | |
| 175 | void tablefull (const char *); | |
| 379210cb | 176 | int kvcprintf (char const *, void (*)(int, void*), void *, int, |
| e2565a42 | 177 | __va_list) __printflike(1, 0); |
| b153f746 RG |
178 | int log (int, const char *, ...) __printflike(2, 3); |
| 179 | void logwakeup (void); | |
| 180 | void log_console (struct uio *); | |
| 169276ba | 181 | int kprintf (const char *, ...) __printflike(1, 2); |
| 28a93126 | 182 | int kprintf0(const char *, ...) __printflike(1, 2); |
| c8dfd00d | 183 | void krateprintf (struct krate *, const char *, ...) __printflike(2, 3); |
| 169276ba | 184 | int ksnprintf (char *, size_t, const char *, ...) __printflike(3, 4); |
| 169276ba | 185 | int ksprintf (char *buf, const char *, ...) __printflike(2, 3); |
| b153f746 | 186 | int uprintf (const char *, ...) __printflike(1, 2); |
| 379210cb MD |
187 | int kvprintf (const char *, __va_list) __printflike(1, 0); |
| 188 | int kvsnprintf (char *, size_t, const char *, __va_list) __printflike(3, 0); | |
| 189 | int kvsprintf (char *buf, const char *, __va_list) __printflike(2, 0); | |
| b153f746 | 190 | int ttyprintf (struct tty *, const char *, ...) __printflike(2, 3); |
| e93690c2 MD |
191 | int ksscanf (const char *, char const *, ...); |
| 192 | int kvsscanf (const char *, char const *, __va_list); | |
| 44a09dd6 | 193 | |
| b153f746 RG |
194 | long strtol (const char *, char **, int); |
| 195 | u_long strtoul (const char *, char **, int); | |
| 196 | quad_t strtoq (const char *, char **, int); | |
| 197 | u_quad_t strtouq (const char *, char **, int); | |
| 984263bc | 198 | |
| f15db79e MD |
199 | /* |
| 200 | * note: some functions commonly used by device drivers may be passed | |
| 201 | * pointers to volatile storage, volatile set to avoid warnings. | |
| 527fddf7 MD |
202 | * |
| 203 | * NOTE: bcopyb() - is a dumb byte-granular bcopy. This routine is | |
| 204 | * explicitly not meant to be sophisticated. | |
| 205 | * NOTE: bcopyi() - is a dumb int-granular bcopy (len is still in bytes). | |
| 206 | * This routine is explicitly not meant to be sophisticated. | |
| f15db79e | 207 | */ |
| 527fddf7 MD |
208 | void bcopyb (const void *from, void *to, size_t len); |
| 209 | void bcopyi (const void *from, void *to, size_t len); | |
| b153f746 RG |
210 | void bcopy (volatile const void *from, volatile void *to, size_t len); |
| 211 | void ovbcopy (const void *from, void *to, size_t len); | |
| afaa1d56 | 212 | void bzero (volatile void *buf, size_t len); |
| b153f746 | 213 | void *memcpy (void *to, const void *from, size_t len); |
| 984263bc | 214 | |
| b153f746 RG |
215 | int copystr (const void *kfaddr, void *kdaddr, size_t len, |
| 216 | size_t *lencopied); | |
| 217 | int copyinstr (const void *udaddr, void *kaddr, size_t len, | |
| 218 | size_t *lencopied); | |
| 219 | int copyin (const void *udaddr, void *kaddr, size_t len); | |
| 220 | int copyout (const void *kaddr, void *udaddr, size_t len); | |
| 984263bc | 221 | |
| b153f746 RG |
222 | int fubyte (const void *base); |
| 223 | int subyte (void *base, int byte); | |
| b153f746 RG |
224 | long fuword (const void *base); |
| 225 | int suword (void *base, long word); | |
| 226 | int fusword (void *base); | |
| 227 | int susword (void *base, int word); | |
| 984263bc | 228 | |
| b153f746 | 229 | void realitexpire (void *); |
| f0f0df1c | 230 | void DELAY(int usec); |
| dbcd0c9b | 231 | void DRIVERSLEEP(int usec); |
| 984263bc | 232 | |
| b153f746 RG |
233 | void startprofclock (struct proc *); |
| 234 | void stopprofclock (struct proc *); | |
| 235 | void setstatclockrate (int hzrate); | |
| 984263bc | 236 | |
| b9b7eb27 MD |
237 | /* |
| 238 | * Console I/O spinlocks - these typically also hard-disable interrupts | |
| 239 | * for the duration. | |
| 240 | */ | |
| 241 | void cons_lock(void); | |
| 242 | void cons_unlock(void); | |
| 243 | ||
| a01a0504 TS |
244 | /* |
| 245 | * Kernel environment support functions and sundry. | |
| 246 | */ | |
| bc01a404 | 247 | char *kgetenv (const char *name); |
| a01a0504 TS |
248 | int ksetenv(const char *name, const char *value); |
| 249 | int kunsetenv(const char *name); | |
| 250 | void kfreeenv(char *env); | |
| 251 | int ktestenv(const char *name); | |
| bc01a404 MD |
252 | int kgetenv_int (const char *name, int *data); |
| 253 | int kgetenv_string (const char *name, char *data, int size); | |
| 28a93126 | 254 | int kgetenv_ulong(const char *name, unsigned long *data); |
| bc01a404 | 255 | int kgetenv_quad (const char *name, quad_t *data); |
| 79634a66 | 256 | int kgetenv_long(const char *name, long *data); |
| 984263bc MD |
257 | extern char *kern_envp; |
| 258 | ||
| 259 | #ifdef APM_FIXUP_CALLTODO | |
| b153f746 | 260 | void adjust_timeout_calltodo (struct timeval *time_change); |
| 984263bc MD |
261 | #endif /* APM_FIXUP_CALLTODO */ |
| 262 | ||
| 263 | #include <sys/libkern.h> | |
| 264 | ||
| 265 | /* Initialize the world */ | |
| a8a86718 | 266 | void mi_startup (void); |
| b153f746 | 267 | void nchinit (void); |
| 984263bc MD |
268 | |
| 269 | /* Finalize the world. */ | |
| b153f746 | 270 | void shutdown_nice (int); |
| 984263bc MD |
271 | |
| 272 | /* | |
| 273 | * Kernel to clock driver interface. | |
| 274 | */ | |
| b153f746 RG |
275 | void inittodr (time_t base); |
| 276 | void resettodr (void); | |
| 277 | void startrtclock (void); | |
| 984263bc MD |
278 | |
| 279 | /* Timeouts */ | |
| b153f746 | 280 | typedef void timeout_t (void *); /* timeout function type */ |
| 984263bc MD |
281 | |
| 282 | /* Interrupt management */ | |
| 283 | ||
| 284 | /* | |
| 285 | * For the alpha arch, some of these functions are static __inline, and | |
| 286 | * the others should be. | |
| 287 | */ | |
| 28a93126 | 288 | #if defined(__i386__) || defined(__amd64__) |
| b153f746 | 289 | void setdelayed (void); |
| b153f746 RG |
290 | void setsoftcambio (void); |
| 291 | void setsoftcamnet (void); | |
| 0fb6ec96 | 292 | void setsoftunused02 (void); |
| b153f746 | 293 | void setsoftcrypto (void); |
| 0fb6ec96 | 294 | void setsoftunused01 (void); |
| b153f746 RG |
295 | void setsofttty (void); |
| 296 | void setsoftvm (void); | |
| 297 | void setsofttq (void); | |
| b153f746 | 298 | void schedsofttty (void); |
| b153f746 | 299 | void splz (void); |
| faaeffac | 300 | void splz_check (void); |
| 984263bc MD |
301 | #endif /* __i386__ */ |
| 302 | ||
| 984263bc MD |
303 | /* |
| 304 | * Various callout lists. | |
| 305 | */ | |
| 306 | ||
| 307 | /* Exit callout list declarations. */ | |
| b153f746 | 308 | typedef void (*exitlist_fn) (struct thread *td); |
| 984263bc | 309 | |
| b153f746 RG |
310 | int at_exit (exitlist_fn function); |
| 311 | int rm_at_exit (exitlist_fn function); | |
| 984263bc MD |
312 | |
| 313 | /* Fork callout list declarations. */ | |
| b153f746 RG |
314 | typedef void (*forklist_fn) (struct proc *parent, struct proc *child, |
| 315 | int flags); | |
| 984263bc | 316 | |
| b153f746 RG |
317 | int at_fork (forklist_fn function); |
| 318 | int rm_at_fork (forklist_fn function); | |
| 984263bc MD |
319 | |
| 320 | /* | |
| 321 | * Not exactly a callout LIST, but a callout entry. | |
| 322 | * Allow an external module to define a hardware watchdog tickler. | |
| 323 | * Normally a process would do this, but there are times when the | |
| 324 | * kernel needs to be able to hold off the watchdog, when the process | |
| 325 | * is not active, e.g., when dumping core. | |
| 326 | */ | |
| b153f746 | 327 | typedef void (*watchdog_tickle_fn) (void); |
| 984263bc MD |
328 | |
| 329 | extern watchdog_tickle_fn wdog_tickler; | |
| 330 | ||
| 331 | /* | |
| 332 | * Common `proc' functions are declared here so that proc.h can be included | |
| 333 | * less often. | |
| 334 | */ | |
| bf765287 MD |
335 | int tsleep (void *, int, const char *, int); |
| 336 | int msleep (void *, struct spinlock *, int, const char *, int); | |
| 7f6220a9 | 337 | int mtxsleep (void *, struct mtx *, int, const char *, int); |
| ed3f6624 | 338 | int zsleep(void *, struct lwkt_serialize *, int, const char *, int); |
| ae8e83e6 MD |
339 | void tsleep_interlock (void *, int); |
| 340 | void tsleep_remove (struct thread *); | |
| a22c590e | 341 | int lwkt_sleep (const char *, int); |
| 9a379a4a | 342 | void tstop (void); |
| b153f746 RG |
343 | void wakeup (void *chan); |
| 344 | void wakeup_one (void *chan); | |
| b336a9b1 MD |
345 | void wakeup_mycpu (void *chan); |
| 346 | void wakeup_mycpu_one (void *chan); | |
| 347 | void wakeup_oncpu (struct globaldata *gd, void *chan); | |
| 348 | void wakeup_oncpu_one (struct globaldata *gd, void *chan); | |
| da5fb9ef MD |
349 | void wakeup_domain (void *chan, int domain); |
| 350 | void wakeup_domain_one (void *chan, int domain); | |
| 984263bc MD |
351 | |
| 352 | /* | |
| b13267a5 | 353 | * Common `cdev_t' stuff are declared here to avoid #include poisoning |
| 984263bc MD |
354 | */ |
| 355 | ||
| b13267a5 MD |
356 | int major(cdev_t x); |
| 357 | int minor(cdev_t x); | |
| 358 | udev_t dev2udev(cdev_t x); | |
| 359 | cdev_t udev2dev(udev_t x, int b); | |
| 984263bc MD |
360 | int uminor(udev_t dev); |
| 361 | int umajor(udev_t dev); | |
| 362 | udev_t makeudev(int x, int y); | |
| 03d6a592 MD |
363 | |
| 364 | #endif /* _KERNEL */ | |
| 984263bc | 365 | #endif /* !_SYS_SYSTM_H_ */ |