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