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