| Commit | Line | Data |
|---|---|---|
| fc3f9779 SS |
1 | /*- |
| 2 | * Copyright (c) 1990 The Regents of the University of California. | |
| c8fe38ae | 3 | * Copyright (c) 2008 The DragonFly Project. |
| fc3f9779 SS |
4 | * All rights reserved. |
| 5 | * | |
| 6 | * This code is derived from software contributed to Berkeley by | |
| 7 | * William Jolitz. | |
| 8 | * | |
| 9 | * Redistribution and use in source and binary forms, with or without | |
| 10 | * modification, are permitted provided that the following conditions | |
| 11 | * are met: | |
| 12 | * 1. Redistributions of source code must retain the above copyright | |
| 13 | * notice, this list of conditions and the following disclaimer. | |
| 14 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 15 | * notice, this list of conditions and the following disclaimer in the | |
| 16 | * documentation and/or other materials provided with the distribution. | |
| 17 | * 3. All advertising materials mentioning features or use of this software | |
| 18 | * must display the following acknowledgement: | |
| 19 | * This product includes software developed by the University of | |
| 20 | * California, Berkeley and its contributors. | |
| 21 | * 4. 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 | * from: @(#)param.h 5.8 (Berkeley) 6/28/91 | |
| 38 | * $FreeBSD: src/sys/i386/include/param.h,v 1.54.2.8 2002/08/31 21:15:55 dillon Exp $ | |
| fc3f9779 SS |
39 | */ |
| 40 | ||
| 41 | #ifndef _CPU_PARAM_H_ | |
| 42 | ||
| 43 | /* | |
| 44 | * Do not prevent re-includes of <machine/param.h> if the file was included | |
| 45 | * with NO_NAMESPACE_POLLUTION, or expected macros will not exist. | |
| 46 | */ | |
| 47 | #ifndef _NO_NAMESPACE_POLLUTION | |
| 48 | #define _CPU_PARAM_H_ | |
| 49 | #endif | |
| 50 | ||
| 51 | /* | |
| 02fc0ba7 | 52 | * Machine dependent constants for x86_64. |
| fc3f9779 SS |
53 | */ |
| 54 | #ifndef _CPU_PARAM_H1_ | |
| 55 | #define _CPU_PARAM_H1_ | |
| 56 | ||
| 57 | /* | |
| 58 | * Round p (pointer or byte index) up to a correctly-aligned value | |
| 59 | * for all data types (int, long, ...). The result is unsigned int | |
| 60 | * and must be cast to any desired pointer type. | |
| 61 | */ | |
| 62 | #ifndef _ALIGNBYTES | |
| 63 | #define _ALIGNBYTES (sizeof(long) - 1) | |
| 64 | #endif | |
| 65 | #ifndef _ALIGN | |
| 66 | #define _ALIGN(p) (((unsigned long)(p) + _ALIGNBYTES) & ~_ALIGNBYTES) | |
| 67 | #endif | |
| 68 | ||
| 02fc0ba7 | 69 | #ifndef _MACHINE |
| c1543a89 | 70 | #define _MACHINE x86_64 |
| fc3f9779 | 71 | #endif |
| 02fc0ba7 | 72 | #ifndef _MACHINE_ARCH |
| c1543a89 | 73 | #define _MACHINE_ARCH x86_64 |
| fc3f9779 SS |
74 | #endif |
| 75 | ||
| fc3f9779 SS |
76 | #endif /* _CPU_PARAM_H1_ */ |
| 77 | ||
| 78 | #ifndef _NO_NAMESPACE_POLLUTION | |
| 79 | ||
| 02fc0ba7 | 80 | #ifndef MACHINE |
| c1543a89 | 81 | #define MACHINE "x86_64" |
| fc3f9779 | 82 | #endif |
| 02fc0ba7 | 83 | #ifndef MACHINE_ARCH |
| c1543a89 | 84 | #define MACHINE_ARCH "x86_64" |
| fc3f9779 SS |
85 | #endif |
| 86 | ||
| 87 | /* | |
| 88 | * Use SMP_MAXCPU instead of MAXCPU for structures that are intended to | |
| 89 | * remain compatible between UP and SMP builds. | |
| 90 | */ | |
| 91 | #define SMP_MAXCPU 16 | |
| 92 | #ifdef SMP | |
| 93 | #define MAXCPU SMP_MAXCPU | |
| 94 | #else | |
| 95 | #define MAXCPU 1 | |
| 96 | #endif /* SMP */ | |
| 97 | ||
| 98 | #define ALIGNBYTES _ALIGNBYTES | |
| 99 | #define ALIGN(p) _ALIGN(p) | |
| 100 | ||
| c8fe38ae | 101 | /* JG license? from fbsd/src/sys/amd64/include/param.h */ |
| fc3f9779 | 102 | /* level 1 == page table */ |
| c8fe38ae | 103 | #define NPTEPGSHIFT 9 /* LOG2(NPTEPG) */ |
| fc3f9779 SS |
104 | #define PAGE_SHIFT 12 /* LOG2(PAGE_SIZE) */ |
| 105 | #define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */ | |
| 106 | #define PAGE_MASK (PAGE_SIZE-1) | |
| 107 | #define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t))) | |
| 108 | ||
| 109 | /* level 2 == page directory */ | |
| c8fe38ae | 110 | #define NPDEPGSHIFT 9 /* LOG2(NPDEPG) */ |
| fc3f9779 SS |
111 | #define PDRSHIFT 21 /* LOG2(NBPDR) */ |
| 112 | #define NBPDR (1<<PDRSHIFT) /* bytes/page dir */ | |
| 113 | #define PDRMASK (NBPDR-1) | |
| 114 | #define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t))) | |
| 115 | ||
| 116 | /* level 3 == page directory pointer table */ | |
| c8fe38ae | 117 | #define NPDPEPGSHIFT 9 /* LOG2(NPDPEPG) */ |
| fc3f9779 SS |
118 | #define PDPSHIFT 30 /* LOG2(NBPDP) */ |
| 119 | #define NBPDP (1<<PDPSHIFT) /* bytes/page dir ptr table */ | |
| 120 | #define PDPMASK (NBPDP-1) | |
| 121 | #define NPDPEPG (PAGE_SIZE/(sizeof (pdp_entry_t))) | |
| 122 | ||
| 123 | /* level 4 */ | |
| c8fe38ae | 124 | #define NPML4EPGSHIFT 9 /* LOG2(NPML4EPG) */ |
| fc3f9779 SS |
125 | #define PML4SHIFT 39 /* LOG2(NPML4) */ |
| 126 | #define NPML4 (1UL<<PML4SHIFT)/* bytes/page map level4 table */ | |
| c8fe38ae | 127 | #define NBPML4 (1ul<<PML4SHIFT)/* bytes/page map lev4 table */ |
| fc3f9779 SS |
128 | #define PML4MASK (NPML4-1) |
| 129 | #define NPML4EPG (PAGE_SIZE/(sizeof (pml4_entry_t))) | |
| 130 | ||
| fc3f9779 SS |
131 | #define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ |
| 132 | #define DEV_BSIZE (1<<DEV_BSHIFT) | |
| 133 | #define DEV_BMASK (DEV_BSIZE - 1) | |
| 134 | ||
| 135 | #ifndef BLKDEV_IOSIZE | |
| 136 | #define BLKDEV_IOSIZE PAGE_SIZE /* default block device I/O size */ | |
| 137 | #endif | |
| 138 | #define DFLTPHYS (64 * 1024) /* default max raw I/O transfer size */ | |
| 139 | #define MAXPHYS (128 * 1024) /* max raw I/O transfer size */ | |
| 140 | #define MAXDUMPPGS (DFLTPHYS/PAGE_SIZE) | |
| 141 | ||
| 142 | #define IOPAGES 2 /* pages of i/o permission bitmap */ | |
| 143 | #define UPAGES 3 /* pages of u-area */ | |
| 144 | ||
| 145 | /* | |
| 146 | * Ceiling on amount of swblock kva space, can be changed via | |
| 392e8d79 MD |
147 | * kern.maxswzone /boot/loader.conf variable. On 64 bit machines |
| 148 | * the kernel has a 512G address space so reserving 512M of KVM | |
| 149 | * is not a big deal. | |
| 79634a66 | 150 | * |
| 392e8d79 | 151 | * Approximately (size / 160 x 32 x PAGE_SIZE) bytes of swap. This |
| 79634a66 | 152 | * comes to approximately 1GB of swap space per 1MB of kernel memory. |
| 392e8d79 MD |
153 | * Actually using 512G of swap will tie up a big chunk (512M) of physical |
| 154 | * memory. | |
| fc3f9779 SS |
155 | */ |
| 156 | #ifndef VM_SWZONE_SIZE_MAX | |
| 392e8d79 | 157 | #define VM_SWZONE_SIZE_MAX (512L * 1024 * 1024) |
| fc3f9779 SS |
158 | #endif |
| 159 | ||
| 160 | /* | |
| 161 | * Ceiling on size of buffer cache (really only effects write queueing, | |
| 162 | * the VM page cache is not effected), can be changed via | |
| 163 | * kern.maxbcache /boot/loader.conf variable. | |
| 164 | */ | |
| 165 | #ifndef VM_BCACHE_SIZE_MAX | |
| 79634a66 | 166 | #define VM_BCACHE_SIZE_MAX (200L * 1024 * 1024) |
| fc3f9779 SS |
167 | #endif |
| 168 | ||
| 169 | ||
| 170 | /* | |
| 171 | * Constants related to network buffer management. | |
| 172 | * MCLBYTES must be no larger than CLBYTES (the software page size), and, | |
| 173 | * on machines that exchange pages of input or output buffers with mbuf | |
| 174 | * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple | |
| 175 | * of the hardware page size. | |
| 176 | */ | |
| 177 | #ifndef MSIZE | |
| c8fe38ae | 178 | #define MSIZE 512 /* size of an mbuf */ |
| fc3f9779 SS |
179 | #endif /* MSIZE */ |
| 180 | ||
| 181 | #ifndef MCLSHIFT | |
| 182 | #define MCLSHIFT 11 /* convert bytes to m_buf clusters */ | |
| 183 | #endif /* MCLSHIFT */ | |
| 184 | #define MCLBYTES (1 << MCLSHIFT) /* size of an m_buf cluster */ | |
| 185 | #define MCLOFSET (MCLBYTES - 1) /* offset within an m_buf cluster */ | |
| 186 | ||
| 187 | /* | |
| 188 | * Some macros for units conversion | |
| 189 | */ | |
| 190 | ||
| 191 | /* clicks to bytes */ | |
| 192 | #define ctob(x) ((x)<<PAGE_SHIFT) | |
| 193 | ||
| 194 | /* bytes to clicks */ | |
| 195 | #define btoc(x) (((unsigned)(x)+PAGE_MASK)>>PAGE_SHIFT) | |
| 196 | ||
| 197 | /* | |
| 198 | * btodb() is messy and perhaps slow because `bytes' may be an off_t. We | |
| 199 | * want to shift an unsigned type to avoid sign extension and we don't | |
| 200 | * want to widen `bytes' unnecessarily. Assume that the result fits in | |
| 201 | * a daddr_t. | |
| 202 | */ | |
| 203 | #define btodb(bytes) /* calculates (bytes / DEV_BSIZE) */ \ | |
| 204 | (sizeof (bytes) > sizeof(long) \ | |
| 205 | ? (daddr_t)((unsigned long long)(bytes) >> DEV_BSHIFT) \ | |
| 206 | : (daddr_t)((unsigned long)(bytes) >> DEV_BSHIFT)) | |
| 207 | ||
| 208 | #define dbtob(db) /* calculates (db * DEV_BSIZE) */ \ | |
| 209 | ((off_t)(db) << DEV_BSHIFT) | |
| 210 | ||
| 211 | /* | |
| 212 | * Mach derived conversion macros | |
| 213 | */ | |
| 89ffa1cf SS |
214 | #define round_page(x) ((((unsigned long)(x)) + PAGE_MASK) & ~(unsigned long)(PAGE_MASK)) |
| 215 | #define trunc_page(x) ((unsigned long)(x) & ~(unsigned long)(PAGE_MASK)) | |
| 216 | #define trunc_2mpage(x) ((unsigned long)(x) & ~(unsigned long)PDRMASK) | |
| 217 | #define round_2mpage(x) ((((unsigned long)(x)) + PDRMASK) & ~(unsigned long)PDRMASK) | |
| fc3f9779 SS |
218 | |
| 219 | #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) | |
| c8fe38ae | 220 | #define atop(x) ((vm_pindex_t)((x) >> PAGE_SHIFT)) |
| fc3f9779 | 221 | #endif |
| c8fe38ae | 222 | #define ptoa(x) ((vm_paddr_t)(x) << PAGE_SHIFT) |
| fc3f9779 | 223 | |
| c1543a89 SS |
224 | #define x86_64_btop(x) ((vm_pindex_t)((x) >> PAGE_SHIFT)) |
| 225 | #define x86_64_ptob(x) ((vm_paddr_t)(x) << PAGE_SHIFT) | |
| fc3f9779 SS |
226 | |
| 227 | #define pgtok(x) ((x) * (PAGE_SIZE / 1024)) | |
| 228 | ||
| 229 | #ifdef _KERNEL | |
| 230 | ||
| 231 | /* | |
| 232 | * We put here the definition of two debugging macros/function which | |
| 233 | * are very convenient to have available. | |
| 234 | * The macro is called TSTMP() and is used to timestamp events in the | |
| 235 | * kernel using the TSC register, and export them to userland through | |
| 236 | * the sysctl variable debug.timestamp, which is a circular buffer | |
| 237 | * holding pairs of u_int32_t variables <timestamp, argument> . | |
| 238 | * They can be retrieved with something like | |
| 239 | * | |
| 240 | * sysctl -b debug.timestamp | hexdump -e '"%15u %15u\n"' | |
| 241 | * | |
| 242 | * The function _TSTMP() is defined in i386/isa/clock.c. It does not | |
| 243 | * try to grab any locks or block interrupts or identify which CPU it | |
| 244 | * is running on. You are supposed to know what to do if you use it. | |
| 245 | * | |
| 246 | * The macros must be enabled with "options KERN_TIMESTAMP" in the kernel | |
| 247 | * config file, otherwise they default to an empty block. | |
| 248 | */ | |
| 249 | ||
| 250 | #ifdef KERN_TIMESTAMP | |
| 251 | extern void _TSTMP(u_int32_t argument); | |
| 252 | #define TSTMP(class, unit, event, par) _TSTMP( \ | |
| 253 | (((class) & 0x0f) << 28 ) | \ | |
| 254 | (((unit) & 0x0f) << 24 ) | \ | |
| 255 | (((event) & 0xff) << 16 ) | \ | |
| 256 | (((par) & 0xffff) ) ) | |
| 257 | ||
| 258 | #else /* !KERN_TIMESTAMP */ | |
| 259 | #define _TSTMP(x) {} | |
| 260 | #define TSTMP(class, unit, event, par) _TSTMP(0) | |
| 261 | #endif /* !KERN_TIMESTAMP */ | |
| 262 | #endif /* _KERNEL */ | |
| 263 | ||
| 264 | #endif /* !_NO_NAMESPACE_POLLUTION */ | |
| 265 | #endif /* !_CPU_PARAM_H_ */ |