1 /******************************************************************************* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 * 21 * Copyright 2014 QLogic Corporation 22 * The contents of this file are subject to the terms of the 23 * QLogic End User License (the "License"). 24 * You may not use this file except in compliance with the License. 25 * 26 * You can obtain a copy of the License at 27 * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/ 28 * QLogic_End_User_Software_License.txt 29 * See the License for the specific language governing permissions 30 * and limitations under the License. 31 * 32 * 33 * Module Description: 34 * This file should include pure ANSI C defines 35 * 36 * History: 37 * 04/03/07 Alon Elhanani Inception. 38 ******************************************************************************/ 39 40 #ifndef __utils_h__ 41 #define __utils_h__ 42 43 #ifndef BITS_PER_BYTE 44 #define BITS_PER_BYTE (8) 45 #endif //BITS_PER_BYTE 46 /* 47 XXX_FLAGS 48 bitwise flags operations, for readability of the code 49 */ 50 51 // get specific flags 52 #define GET_FLAGS(flags,bits) ((flags) & (bits)) 53 #define GET_FLAGS_WITH_OFFSET(flags,bits,offset) (((flags) & (bits)) >> (offset)) 54 // set specific flags 55 #define SET_FLAGS(flags,bits) ((flags) |= (bits)) 56 // reset specific flags 57 #define RESET_FLAGS(flags,bits) ((flags) &= ~(bits)) 58 // clear flags 59 #define CLEAR_FLAGS(flags) ((flags)=0) 60 61 // macros for a single bit 62 #define SET_BIT( _bits, _val ) SET_FLAGS ( _bits, (0x1ULL << _val) ) 63 #define RESET_BIT( _bits, _val ) RESET_FLAGS( _bits, (0x1ULL << _val) ) 64 #define GET_BIT( _bits, _val ) GET_FLAGS ( _bits, (0x1ULL << _val) ) 65 66 /** 67 * \brief offset of byte next to specified struct member 68 * 69 * Find the size of the structure members, up-to and including 70 * the specified meber (_m). 71 * 72 * \param _s structure type 73 * \param _m struct member 74 */ 75 76 #define LAST_BYTE_OF(_s,_m) (OFFSETOF(_s,_m)+sizeof( ((_s *)0)->_m)) 77 78 /* 79 ARRSIZE: 80 used to calcualte item count of an array 81 this macro is used to prevent compile warning for unreferenced parametes 82 */ 83 #ifndef ARRSIZE 84 #define ARRSIZE(a) (sizeof(a)/sizeof((a)[0])) 85 #endif // ARRSIZE 86 87 /* 88 UNREFERENCED_PARAMETER 89 this macro is used to prevent compile warning for unreferenced parametes 90 */ 91 #ifndef UNREFERENCED_PARAMETER_ 92 #define UNREFERENCED_PARAMETER_(P)\ 93 /*lint -save -e527 -e530 */ \ 94 { \ 95 (P) = (P); \ 96 } 97 #endif // UNREFERENCED_PARAMETER_ 98 99 100 /* 101 ASSERT_STATIC 102 this macro is used to raise COMPILE time assertions 103 e.g: ASSERT_STATIC( sizeof(S08) == 1 ) 104 relevant errors that compilers gives in such case: 105 build.exe (MS) - "error C2196: case value '0' already used" 106 WMAKE.exe (Watcom) - "Error! E1039: Duplicate case value '0' found" 107 */ 108 #ifndef ASSERT_STATIC 109 #define ASSERT_STATIC(cond) \ 110 { \ 111 const unsigned char dummy_zero = 0 ; \ 112 switch(dummy_zero){case 0:case (cond):;} \ 113 } 114 #ifdef __SUNPRO_C /* Sun's cc can't deal with this clever hack */ 115 #undef ASSERT_STATIC 116 #define ASSERT_STATIC(cond) 117 #endif 118 #endif // ASSERT_STATIC(cond) 119 120 /* 121 RANGE 122 this macro is used to check that a certain variable is within a given range 123 e.g: RANGE_INCLUDE(a, 10, 100) - is the following true : 10<=a<=100 124 */ 125 #define IN_RANGE(_var, _min, _max) ( ((_var) >= (_min)) && ((_var) <= (_max)) ) 126 127 /* 128 IS_DIGIT 129 this macro is used to check that a char is a digit 130 example IS_DIGIT('4') - is '4' a digit will return TRUE. 131 */ 132 #ifndef IS_DIGIT 133 #define IS_DIGIT(c) ( ((c) >= '0') && ((c) <= '9') ) 134 #endif 135 136 /* 137 Define standard min and max macros 138 */ 139 #ifndef min 140 #define min(a,b) (((a) < (b)) ? (a) : (b)) 141 #endif 142 143 #if defined(__LINUX) || defined(USER_LINUX) 144 #undef max 145 #endif // LINUX 146 147 #ifndef max 148 #define max(a,b) (((a) > (b)) ? (a) : (b)) 149 #endif // !max 150 151 #if defined(__LINUX) || defined(USER_LINUX) 152 #undef DIV_ROUND_UP_BITS 153 #endif // LINUX 154 // Round up a divied operation more optimal way base on bits. 155 // It is the same opration as d == (1<<bits). 156 // DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) 157 #ifndef BITS_ROUND_UP 158 #define DIV_ROUND_UP_BITS(n,bits) (((n) + (1 << (bits)) - 1) >> (bits)) 159 #endif 160 /* 161 Define for pragma message output with file name and line number 162 usage: #pragma message (MSGSTR("blah blah blah")) 163 */ 164 #define _STR(x) #x 165 #define _STR2(x) _STR(x) 166 #define MSGSTR(msg) __FILE__ "(" _STR2(__LINE__)"): message - " ##msg 167 168 169 #ifndef POWER_OF_2 170 // known algorithm 171 #define POWER_OF_2(x) ((0 != x) && (0 == (x &(x-1)))) 172 #endif // !POWER_OF_2 173 174 175 176 #ifndef FAST_PATH_MODULO 177 // a = b (mod n) 178 // If a==b the compiler will omit the last line. 179 #define FAST_PATH_MODULO(a,b,n) \ 180 do \ 181 { \ 182 while ((b) > ((n) -1)) \ 183 (b) = (b) - (n); \ 184 (a)=(b); \ 185 } \ 186 while(0) 187 #endif // !FAST_PATH_MODULO 188 189 #ifndef MINCHAR 190 #define MINCHAR 0x80 191 #endif 192 #ifndef MAXCHAR 193 #define MAXCHAR 0x7f 194 #endif 195 #ifndef MINSHORT 196 #define MINSHORT 0x8000 197 #endif 198 #ifndef MAXSHORT 199 #define MAXSHORT 0x7fff 200 #endif 201 #ifndef MINLONG 202 #define MINLONG 0x80000000 203 #endif 204 #ifndef MAXLONG 205 #define MAXLONG 0x7fffffff 206 #endif 207 #ifndef MAXBYTE 208 #define MAXBYTE 0xff 209 #endif 210 #ifndef MAXWORD 211 #define MAXWORD 0xffff 212 #endif 213 #ifndef MAXDWORD 214 #define MAXDWORD 0xffffffff 215 #endif 216 217 #define CLEAR_MSB32(_val32) (_val32 & MAXLONG) 218 219 // Calculate the size of a field in a structure of type type, without 220 // knowing or stating the type of the field. 221 // based on NTDDK RTL_FIELD_SIZE 222 #ifndef FIELD_SIZE 223 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) 224 #endif 225 226 #endif /* __utils_h__ */ 227