1a9643ea8Slogwang /*- 2*22ce4affSfengbojiang * SPDX-License-Identifier: BSD-3-Clause 3*22ce4affSfengbojiang * 4a9643ea8Slogwang * Copyright (c) 1982, 1986, 1989, 1993 5a9643ea8Slogwang * The Regents of the University of California. All rights reserved. 6a9643ea8Slogwang * (c) UNIX System Laboratories, Inc. 7a9643ea8Slogwang * All or some portions of this file are derived from material licensed 8a9643ea8Slogwang * to the University of California by American Telephone and Telegraph 9a9643ea8Slogwang * Co. or Unix System Laboratories, Inc. and are reproduced herein with 10a9643ea8Slogwang * the permission of UNIX System Laboratories, Inc. 11a9643ea8Slogwang * 12a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 13a9643ea8Slogwang * modification, are permitted provided that the following conditions 14a9643ea8Slogwang * are met: 15a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 16a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 17a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 18a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 19a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 20*22ce4affSfengbojiang * 3. Neither the name of the University nor the names of its contributors 21a9643ea8Slogwang * may be used to endorse or promote products derived from this software 22a9643ea8Slogwang * without specific prior written permission. 23a9643ea8Slogwang * 24a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34a9643ea8Slogwang * SUCH DAMAGE. 35a9643ea8Slogwang * 36a9643ea8Slogwang * @(#)param.h 8.3 (Berkeley) 4/4/95 37a9643ea8Slogwang * $FreeBSD$ 38a9643ea8Slogwang */ 39a9643ea8Slogwang 40a9643ea8Slogwang #ifndef _SYS_PARAM_H_ 41a9643ea8Slogwang #define _SYS_PARAM_H_ 42a9643ea8Slogwang 43a9643ea8Slogwang #include <sys/_null.h> 44a9643ea8Slogwang 45a9643ea8Slogwang #define BSD 199506 /* System version (year & month). */ 46a9643ea8Slogwang #define BSD4_3 1 47a9643ea8Slogwang #define BSD4_4 1 48a9643ea8Slogwang 49a9643ea8Slogwang /* 50a9643ea8Slogwang * __FreeBSD_version numbers are documented in the Porter's Handbook. 51a9643ea8Slogwang * If you bump the version for any reason, you should update the documentation 52a9643ea8Slogwang * there. 53a9643ea8Slogwang * Currently this lives here in the doc/ repository: 54a9643ea8Slogwang * 55*22ce4affSfengbojiang * documentation/content/en/books/porters-handbook/versions/chapter.adoc 56a9643ea8Slogwang * 57a9643ea8Slogwang * scheme is: <major><two digit minor>Rxx 58a9643ea8Slogwang * 'R' is in the range 0 to 4 if this is a release branch or 59*22ce4affSfengbojiang * X.0-CURRENT before releng/X.0 is created, otherwise 'R' is 60a9643ea8Slogwang * in the range 5 to 9. 61a9643ea8Slogwang */ 62a9643ea8Slogwang #undef __FreeBSD_version 63*22ce4affSfengbojiang #define __FreeBSD_version 1300139 /* Master, propagated to newvers */ 64a9643ea8Slogwang 65a9643ea8Slogwang /* 66a9643ea8Slogwang * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD, 67a9643ea8Slogwang * which by definition is always true on FreeBSD. This macro is also defined 68a9643ea8Slogwang * on other systems that use the kernel of FreeBSD, such as GNU/kFreeBSD. 69a9643ea8Slogwang * 70a9643ea8Slogwang * It is tempting to use this macro in userland code when we want to enable 71a9643ea8Slogwang * kernel-specific routines, and in fact it's fine to do this in code that 72a9643ea8Slogwang * is part of FreeBSD itself. However, be aware that as presence of this 73a9643ea8Slogwang * macro is still not widespread (e.g. older FreeBSD versions, 3rd party 74a9643ea8Slogwang * compilers, etc), it is STRONGLY DISCOURAGED to check for this macro in 75a9643ea8Slogwang * external applications without also checking for __FreeBSD__ as an 76a9643ea8Slogwang * alternative. 77a9643ea8Slogwang */ 78a9643ea8Slogwang #undef __FreeBSD_kernel__ 79a9643ea8Slogwang #define __FreeBSD_kernel__ 80a9643ea8Slogwang 81*22ce4affSfengbojiang #if defined(_KERNEL) || defined(IN_RTLD) 82a9643ea8Slogwang #define P_OSREL_SIGWAIT 700000 83a9643ea8Slogwang #define P_OSREL_SIGSEGV 700004 84a9643ea8Slogwang #define P_OSREL_MAP_ANON 800104 85a9643ea8Slogwang #define P_OSREL_MAP_FSTRICT 1100036 86a9643ea8Slogwang #define P_OSREL_SHUTDOWN_ENOTCONN 1100077 87*22ce4affSfengbojiang #define P_OSREL_MAP_GUARD 1200035 88*22ce4affSfengbojiang #define P_OSREL_WRFSBASE 1200041 89*22ce4affSfengbojiang #define P_OSREL_CK_CYLGRP 1200046 90*22ce4affSfengbojiang #define P_OSREL_VMTOTAL64 1200054 91*22ce4affSfengbojiang #define P_OSREL_CK_SUPERBLOCK 1300000 92*22ce4affSfengbojiang #define P_OSREL_CK_INODE 1300005 93*22ce4affSfengbojiang #define P_OSREL_POWERPC_NEW_AUX_ARGS 1300070 94a9643ea8Slogwang 95a9643ea8Slogwang #define P_OSREL_MAJOR(x) ((x) / 100000) 96a9643ea8Slogwang #endif 97a9643ea8Slogwang 98a9643ea8Slogwang #ifndef LOCORE 99a9643ea8Slogwang #include <sys/types.h> 100a9643ea8Slogwang #endif 101a9643ea8Slogwang 102a9643ea8Slogwang /* 103a9643ea8Slogwang * Machine-independent constants (some used in following include files). 104a9643ea8Slogwang * Redefined constants are from POSIX 1003.1 limits file. 105a9643ea8Slogwang * 106a9643ea8Slogwang * MAXCOMLEN should be >= sizeof(ac_comm) (see <acct.h>) 107a9643ea8Slogwang */ 108a9643ea8Slogwang #include <sys/syslimits.h> 109a9643ea8Slogwang 110a9643ea8Slogwang #define MAXCOMLEN 19 /* max command name remembered */ 111a9643ea8Slogwang #define MAXINTERP PATH_MAX /* max interpreter file name length */ 112a9643ea8Slogwang #define MAXLOGNAME 33 /* max login name length (incl. NUL) */ 113a9643ea8Slogwang #define MAXUPRC CHILD_MAX /* max simultaneous processes */ 114a9643ea8Slogwang #define NCARGS ARG_MAX /* max bytes for an exec function */ 115a9643ea8Slogwang #define NGROUPS (NGROUPS_MAX+1) /* max number groups */ 116a9643ea8Slogwang #define NOFILE OPEN_MAX /* max open files per process */ 117a9643ea8Slogwang #define NOGROUP 65535 /* marker for empty group set member */ 118a9643ea8Slogwang #define MAXHOSTNAMELEN 256 /* max hostname size */ 119*22ce4affSfengbojiang #define SPECNAMELEN 255 /* max length of devicename */ 120a9643ea8Slogwang 121a9643ea8Slogwang /* More types and definitions used throughout the kernel. */ 122a9643ea8Slogwang #ifdef _KERNEL 123a9643ea8Slogwang #include <sys/cdefs.h> 124a9643ea8Slogwang #include <sys/errno.h> 125a9643ea8Slogwang #ifndef LOCORE 126a9643ea8Slogwang #include <sys/time.h> 127a9643ea8Slogwang #include <sys/priority.h> 128a9643ea8Slogwang #endif 129a9643ea8Slogwang 130a9643ea8Slogwang #ifndef FALSE 131a9643ea8Slogwang #define FALSE 0 132a9643ea8Slogwang #endif 133a9643ea8Slogwang #ifndef TRUE 134a9643ea8Slogwang #define TRUE 1 135a9643ea8Slogwang #endif 136a9643ea8Slogwang #endif 137a9643ea8Slogwang 138a9643ea8Slogwang #ifndef _KERNEL 139*22ce4affSfengbojiang #ifndef LOCORE 140a9643ea8Slogwang /* Signals. */ 141a9643ea8Slogwang #include <sys/signal.h> 142a9643ea8Slogwang #endif 143*22ce4affSfengbojiang #endif 144a9643ea8Slogwang 145a9643ea8Slogwang /* Machine type dependent parameters. */ 146a9643ea8Slogwang #include <machine/param.h> 147a9643ea8Slogwang #ifndef _KERNEL 148a9643ea8Slogwang #include <sys/limits.h> 149a9643ea8Slogwang #endif 150a9643ea8Slogwang 151a9643ea8Slogwang #ifndef DEV_BSHIFT 152a9643ea8Slogwang #define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ 153a9643ea8Slogwang #endif 154a9643ea8Slogwang #define DEV_BSIZE (1<<DEV_BSHIFT) 155a9643ea8Slogwang 156a9643ea8Slogwang #ifndef BLKDEV_IOSIZE 157a9643ea8Slogwang #define BLKDEV_IOSIZE PAGE_SIZE /* default block device I/O size */ 158a9643ea8Slogwang #endif 159a9643ea8Slogwang #ifndef DFLTPHYS 160a9643ea8Slogwang #define DFLTPHYS (64 * 1024) /* default max raw I/O transfer size */ 161a9643ea8Slogwang #endif 162*22ce4affSfengbojiang #ifndef MAXPHYS /* max raw I/O transfer size */ 163*22ce4affSfengbojiang #ifdef __ILP32__ 164*22ce4affSfengbojiang #define MAXPHYS (128 * 1024) 165*22ce4affSfengbojiang #else 166*22ce4affSfengbojiang #define MAXPHYS (1024 * 1024) 167*22ce4affSfengbojiang #endif 168a9643ea8Slogwang #endif 169a9643ea8Slogwang #ifndef MAXDUMPPGS 170a9643ea8Slogwang #define MAXDUMPPGS (DFLTPHYS/PAGE_SIZE) 171a9643ea8Slogwang #endif 172a9643ea8Slogwang 173a9643ea8Slogwang /* 174a9643ea8Slogwang * Constants related to network buffer management. 175a9643ea8Slogwang * MCLBYTES must be no larger than PAGE_SIZE. 176a9643ea8Slogwang */ 177a9643ea8Slogwang #ifndef MSIZE 178a9643ea8Slogwang #define MSIZE 256 /* size of an mbuf */ 179a9643ea8Slogwang #endif 180a9643ea8Slogwang 181a9643ea8Slogwang #ifndef MCLSHIFT 182a9643ea8Slogwang #define MCLSHIFT 11 /* convert bytes to mbuf clusters */ 183a9643ea8Slogwang #endif /* MCLSHIFT */ 184a9643ea8Slogwang 185a9643ea8Slogwang #define MCLBYTES (1 << MCLSHIFT) /* size of an mbuf cluster */ 186a9643ea8Slogwang 187a9643ea8Slogwang #if PAGE_SIZE < 2048 188a9643ea8Slogwang #define MJUMPAGESIZE MCLBYTES 189a9643ea8Slogwang #elif PAGE_SIZE <= 8192 190a9643ea8Slogwang #define MJUMPAGESIZE PAGE_SIZE 191a9643ea8Slogwang #else 192a9643ea8Slogwang #define MJUMPAGESIZE (8 * 1024) 193a9643ea8Slogwang #endif 194a9643ea8Slogwang 195a9643ea8Slogwang #define MJUM9BYTES (9 * 1024) /* jumbo cluster 9k */ 196a9643ea8Slogwang #define MJUM16BYTES (16 * 1024) /* jumbo cluster 16k */ 197a9643ea8Slogwang 198a9643ea8Slogwang /* 199a9643ea8Slogwang * Some macros for units conversion 200a9643ea8Slogwang */ 201a9643ea8Slogwang 202a9643ea8Slogwang /* clicks to bytes */ 203a9643ea8Slogwang #ifndef ctob 204a9643ea8Slogwang #define ctob(x) ((x)<<PAGE_SHIFT) 205a9643ea8Slogwang #endif 206a9643ea8Slogwang 207a9643ea8Slogwang /* bytes to clicks */ 208a9643ea8Slogwang #ifndef btoc 209a9643ea8Slogwang #define btoc(x) (((vm_offset_t)(x)+PAGE_MASK)>>PAGE_SHIFT) 210a9643ea8Slogwang #endif 211a9643ea8Slogwang 212a9643ea8Slogwang /* 213a9643ea8Slogwang * btodb() is messy and perhaps slow because `bytes' may be an off_t. We 214a9643ea8Slogwang * want to shift an unsigned type to avoid sign extension and we don't 215a9643ea8Slogwang * want to widen `bytes' unnecessarily. Assume that the result fits in 216a9643ea8Slogwang * a daddr_t. 217a9643ea8Slogwang */ 218a9643ea8Slogwang #ifndef btodb 219a9643ea8Slogwang #define btodb(bytes) /* calculates (bytes / DEV_BSIZE) */ \ 220a9643ea8Slogwang (sizeof (bytes) > sizeof(long) \ 221a9643ea8Slogwang ? (daddr_t)((unsigned long long)(bytes) >> DEV_BSHIFT) \ 222a9643ea8Slogwang : (daddr_t)((unsigned long)(bytes) >> DEV_BSHIFT)) 223a9643ea8Slogwang #endif 224a9643ea8Slogwang 225a9643ea8Slogwang #ifndef dbtob 226a9643ea8Slogwang #define dbtob(db) /* calculates (db * DEV_BSIZE) */ \ 227a9643ea8Slogwang ((off_t)(db) << DEV_BSHIFT) 228a9643ea8Slogwang #endif 229a9643ea8Slogwang 230a9643ea8Slogwang #define PRIMASK 0x0ff 231a9643ea8Slogwang #define PCATCH 0x100 /* OR'd with pri for tsleep to check signals */ 232a9643ea8Slogwang #define PDROP 0x200 /* OR'd with pri to stop re-entry of interlock mutex */ 233a9643ea8Slogwang 234a9643ea8Slogwang #define NZERO 0 /* default "nice" */ 235a9643ea8Slogwang 236a9643ea8Slogwang #define NBBY 8 /* number of bits in a byte */ 237a9643ea8Slogwang #define NBPW sizeof(int) /* number of bytes per word (integer) */ 238a9643ea8Slogwang 239a9643ea8Slogwang #define CMASK 022 /* default file mask: S_IWGRP|S_IWOTH */ 240a9643ea8Slogwang 241a9643ea8Slogwang #define NODEV (dev_t)(-1) /* non-existent device */ 242a9643ea8Slogwang 243a9643ea8Slogwang /* 244a9643ea8Slogwang * File system parameters and macros. 245a9643ea8Slogwang * 246a9643ea8Slogwang * MAXBSIZE - Filesystems are made out of blocks of at most MAXBSIZE bytes 247a9643ea8Slogwang * per block. MAXBSIZE may be made larger without effecting 248a9643ea8Slogwang * any existing filesystems as long as it does not exceed MAXPHYS, 249a9643ea8Slogwang * and may be made smaller at the risk of not being able to use 250a9643ea8Slogwang * filesystems which require a block size exceeding MAXBSIZE. 251a9643ea8Slogwang * 252a9643ea8Slogwang * MAXBCACHEBUF - Maximum size of a buffer in the buffer cache. This must 253a9643ea8Slogwang * be >= MAXBSIZE and can be set differently for different 254a9643ea8Slogwang * architectures by defining it in <machine/param.h>. 255a9643ea8Slogwang * Making this larger allows NFS to do larger reads/writes. 256a9643ea8Slogwang * 257a9643ea8Slogwang * BKVASIZE - Nominal buffer space per buffer, in bytes. BKVASIZE is the 258a9643ea8Slogwang * minimum KVM memory reservation the kernel is willing to make. 259a9643ea8Slogwang * Filesystems can of course request smaller chunks. Actual 260a9643ea8Slogwang * backing memory uses a chunk size of a page (PAGE_SIZE). 261a9643ea8Slogwang * The default value here can be overridden on a per-architecture 262*22ce4affSfengbojiang * basis by defining it in <machine/param.h>. 263a9643ea8Slogwang * 264a9643ea8Slogwang * If you make BKVASIZE too small you risk seriously fragmenting 265a9643ea8Slogwang * the buffer KVM map which may slow things down a bit. If you 266a9643ea8Slogwang * make it too big the kernel will not be able to optimally use 267a9643ea8Slogwang * the KVM memory reserved for the buffer cache and will wind 268a9643ea8Slogwang * up with too-few buffers. 269a9643ea8Slogwang * 270a9643ea8Slogwang * The default is 16384, roughly 2x the block size used by a 271a9643ea8Slogwang * normal UFS filesystem. 272a9643ea8Slogwang */ 273a9643ea8Slogwang #define MAXBSIZE 65536 /* must be power of 2 */ 274a9643ea8Slogwang #ifndef MAXBCACHEBUF 275a9643ea8Slogwang #define MAXBCACHEBUF MAXBSIZE /* must be a power of 2 >= MAXBSIZE */ 276a9643ea8Slogwang #endif 277a9643ea8Slogwang #ifndef BKVASIZE 278a9643ea8Slogwang #define BKVASIZE 16384 /* must be power of 2 */ 279a9643ea8Slogwang #endif 280a9643ea8Slogwang #define BKVAMASK (BKVASIZE-1) 281a9643ea8Slogwang 282a9643ea8Slogwang /* 283a9643ea8Slogwang * MAXPATHLEN defines the longest permissible path length after expanding 284a9643ea8Slogwang * symbolic links. It is used to allocate a temporary buffer from the buffer 285a9643ea8Slogwang * pool in which to do the name expansion, hence should be a power of two, 286a9643ea8Slogwang * and must be less than or equal to MAXBSIZE. MAXSYMLINKS defines the 287a9643ea8Slogwang * maximum number of symbolic links that may be expanded in a path name. 288a9643ea8Slogwang * It should be set high enough to allow all legitimate uses, but halt 289a9643ea8Slogwang * infinite loops reasonably quickly. 290a9643ea8Slogwang */ 291a9643ea8Slogwang #define MAXPATHLEN PATH_MAX 292a9643ea8Slogwang #define MAXSYMLINKS 32 293a9643ea8Slogwang 294a9643ea8Slogwang /* Bit map related macros. */ 295a9643ea8Slogwang #define setbit(a,i) (((unsigned char *)(a))[(i)/NBBY] |= 1<<((i)%NBBY)) 296a9643ea8Slogwang #define clrbit(a,i) (((unsigned char *)(a))[(i)/NBBY] &= ~(1<<((i)%NBBY))) 297a9643ea8Slogwang #define isset(a,i) \ 298a9643ea8Slogwang (((const unsigned char *)(a))[(i)/NBBY] & (1<<((i)%NBBY))) 299a9643ea8Slogwang #define isclr(a,i) \ 300a9643ea8Slogwang ((((const unsigned char *)(a))[(i)/NBBY] & (1<<((i)%NBBY))) == 0) 301a9643ea8Slogwang 302a9643ea8Slogwang /* Macros for counting and rounding. */ 303a9643ea8Slogwang #ifndef howmany 304a9643ea8Slogwang #define howmany(x, y) (((x)+((y)-1))/(y)) 305a9643ea8Slogwang #endif 306a9643ea8Slogwang #define nitems(x) (sizeof((x)) / sizeof((x)[0])) 307a9643ea8Slogwang #define rounddown(x, y) (((x)/(y))*(y)) 308a9643ea8Slogwang #define rounddown2(x, y) ((x)&(~((y)-1))) /* if y is power of two */ 309a9643ea8Slogwang #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* to any y */ 310a9643ea8Slogwang #define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */ 311a9643ea8Slogwang #define powerof2(x) ((((x)-1)&(x))==0) 312a9643ea8Slogwang 313a9643ea8Slogwang /* Macros for min/max. */ 314a9643ea8Slogwang #define MIN(a,b) (((a)<(b))?(a):(b)) 315a9643ea8Slogwang #define MAX(a,b) (((a)>(b))?(a):(b)) 316a9643ea8Slogwang 317a9643ea8Slogwang #ifdef _KERNEL 318a9643ea8Slogwang /* 319a9643ea8Slogwang * Basic byte order function prototypes for non-inline functions. 320a9643ea8Slogwang */ 321a9643ea8Slogwang #ifndef LOCORE 322a9643ea8Slogwang #ifndef _BYTEORDER_PROTOTYPED 323a9643ea8Slogwang #define _BYTEORDER_PROTOTYPED 324a9643ea8Slogwang __BEGIN_DECLS 325a9643ea8Slogwang __uint32_t htonl(__uint32_t); 326a9643ea8Slogwang __uint16_t htons(__uint16_t); 327a9643ea8Slogwang __uint32_t ntohl(__uint32_t); 328a9643ea8Slogwang __uint16_t ntohs(__uint16_t); 329a9643ea8Slogwang __END_DECLS 330a9643ea8Slogwang #endif 331a9643ea8Slogwang #endif 332a9643ea8Slogwang 333a9643ea8Slogwang #ifndef _BYTEORDER_FUNC_DEFINED 334a9643ea8Slogwang #define _BYTEORDER_FUNC_DEFINED 335a9643ea8Slogwang #define htonl(x) __htonl(x) 336a9643ea8Slogwang #define htons(x) __htons(x) 337a9643ea8Slogwang #define ntohl(x) __ntohl(x) 338a9643ea8Slogwang #define ntohs(x) __ntohs(x) 339a9643ea8Slogwang #endif /* !_BYTEORDER_FUNC_DEFINED */ 340a9643ea8Slogwang #endif /* _KERNEL */ 341a9643ea8Slogwang 342a9643ea8Slogwang /* 343a9643ea8Slogwang * Scale factor for scaled integers used to count %cpu time and load avgs. 344a9643ea8Slogwang * 345a9643ea8Slogwang * The number of CPU `tick's that map to a unique `%age' can be expressed 346a9643ea8Slogwang * by the formula (1 / (2 ^ (FSHIFT - 11))). The maximum load average that 347a9643ea8Slogwang * can be calculated (assuming 32 bits) can be closely approximated using 348a9643ea8Slogwang * the formula (2 ^ (2 * (16 - FSHIFT))) for (FSHIFT < 15). 349a9643ea8Slogwang * 350a9643ea8Slogwang * For the scheduler to maintain a 1:1 mapping of CPU `tick' to `%age', 351a9643ea8Slogwang * FSHIFT must be at least 11; this gives us a maximum load avg of ~1024. 352a9643ea8Slogwang */ 353a9643ea8Slogwang #define FSHIFT 11 /* bits to right of fixed binary point */ 354a9643ea8Slogwang #define FSCALE (1<<FSHIFT) 355a9643ea8Slogwang 356a9643ea8Slogwang #define dbtoc(db) /* calculates devblks to pages */ \ 357a9643ea8Slogwang ((db + (ctodb(1) - 1)) >> (PAGE_SHIFT - DEV_BSHIFT)) 358a9643ea8Slogwang 359a9643ea8Slogwang #define ctodb(db) /* calculates pages to devblks */ \ 360a9643ea8Slogwang ((db) << (PAGE_SHIFT - DEV_BSHIFT)) 361a9643ea8Slogwang 362a9643ea8Slogwang /* 363a9643ea8Slogwang * Old spelling of __containerof(). 364a9643ea8Slogwang */ 365a9643ea8Slogwang #define member2struct(s, m, x) \ 366a9643ea8Slogwang ((struct s *)(void *)((char *)(x) - offsetof(struct s, m))) 367a9643ea8Slogwang 368a9643ea8Slogwang /* 369a9643ea8Slogwang * Access a variable length array that has been declared as a fixed 370a9643ea8Slogwang * length array. 371a9643ea8Slogwang */ 372a9643ea8Slogwang #define __PAST_END(array, offset) (((__typeof__(*(array)) *)(array))[offset]) 373a9643ea8Slogwang 374a9643ea8Slogwang #endif /* _SYS_PARAM_H_ */ 375