| 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | #ifndef _LINUX_MINMAX_H |
| 3 | #define _LINUX_MINMAX_H |
| 4 | |
| 5 | #include <linux/build_bug.h> |
| 6 | #include <linux/compiler.h> |
| 7 | #include <linux/const.h> |
| 8 | #include <linux/types.h> |
| 9 | |
| 10 | /* |
| 11 | * min()/max()/clamp() macros must accomplish several things: |
| 12 | * |
| 13 | * - Avoid multiple evaluations of the arguments (so side-effects like |
| 14 | * "x++" happen only once) when non-constant. |
| 15 | * - Perform signed v unsigned type-checking (to generate compile |
| 16 | * errors instead of nasty runtime surprises). |
| 17 | * - Unsigned char/short are always promoted to signed int and can be |
| 18 | * compared against signed or unsigned arguments. |
| 19 | * - Unsigned arguments can be compared against non-negative signed constants. |
| 20 | * - Comparison of a signed argument against an unsigned constant fails |
| 21 | * even if the constant is below __INT_MAX__ and could be cast to int. |
| 22 | */ |
| 23 | #define __typecheck(x, y) \ |
| 24 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1))) |
| 25 | |
| 26 | /* |
| 27 | * __sign_use for integer expressions: |
| 28 | * bit #0 set if ok for unsigned comparisons |
| 29 | * bit #1 set if ok for signed comparisons |
| 30 | * |
| 31 | * In particular, statically non-negative signed integer expressions |
| 32 | * are ok for both. |
| 33 | * |
| 34 | * NOTE! Unsigned types smaller than 'int' are implicitly converted to 'int' |
| 35 | * in expressions, and are accepted for signed conversions for now. |
| 36 | * This is debatable. |
| 37 | * |
| 38 | * Note that 'x' is the original expression, and 'ux' is the unique variable |
| 39 | * that contains the value. |
| 40 | * |
| 41 | * We use 'ux' for pure type checking, and 'x' for when we need to look at the |
| 42 | * value (but without evaluating it for side effects! |
| 43 | * Careful to only ever evaluate it with sizeof() or __builtin_constant_p() etc). |
| 44 | * |
| 45 | * Pointers end up being checked by the normal C type rules at the actual |
| 46 | * comparison, and these expressions only need to be careful to not cause |
| 47 | * warnings for pointer use. |
| 48 | */ |
| 49 | #define __sign_use(ux) (is_signed_type(typeof(ux)) ? \ |
| 50 | (2 + __is_nonneg(ux)) : (1 + 2 * (sizeof(ux) < 4))) |
| 51 | |
| 52 | /* |
| 53 | * Check whether a signed value is always non-negative. |
| 54 | * |
| 55 | * A cast is needed to avoid any warnings from values that aren't signed |
| 56 | * integer types (in which case the result doesn't matter). |
| 57 | * |
| 58 | * On 64-bit any integer or pointer type can safely be cast to 'long long'. |
| 59 | * But on 32-bit we need to avoid warnings about casting pointers to integers |
| 60 | * of different sizes without truncating 64-bit values so 'long' or 'long long' |
| 61 | * must be used depending on the size of the value. |
| 62 | * |
| 63 | * This does not work for 128-bit signed integers since the cast would truncate |
| 64 | * them, but we do not use s128 types in the kernel (we do use 'u128', |
| 65 | * but they are handled by the !is_signed_type() case). |
| 66 | */ |
| 67 | #if __SIZEOF_POINTER__ == __SIZEOF_LONG_LONG__ |
| 68 | #define __is_nonneg(ux) statically_true((long long)(ux) >= 0) |
| 69 | #else |
| 70 | #define __is_nonneg(ux) statically_true( \ |
| 71 | (typeof(__builtin_choose_expr(sizeof(ux) > 4, 1LL, 1L)))(ux) >= 0) |
| 72 | #endif |
| 73 | |
| 74 | #define __types_ok(ux, uy) \ |
| 75 | (__sign_use(ux) & __sign_use(uy)) |
| 76 | |
| 77 | #define __types_ok3(ux, uy, uz) \ |
| 78 | (__sign_use(ux) & __sign_use(uy) & __sign_use(uz)) |
| 79 | |
| 80 | #define __cmp_op_min < |
| 81 | #define __cmp_op_max > |
| 82 | |
| 83 | #define __cmp(op, x, y) ((x) __cmp_op_##op (y) ? (x) : (y)) |
| 84 | |
| 85 | #define __cmp_once_unique(op, type, x, y, ux, uy) \ |
| 86 | ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); }) |
| 87 | |
| 88 | #define __cmp_once(op, type, x, y) \ |
| 89 | __cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_)) |
| 90 | |
| 91 | #define __careful_cmp_once(op, x, y, ux, uy) ({ \ |
| 92 | __auto_type ux = (x); __auto_type uy = (y); \ |
| 93 | BUILD_BUG_ON_MSG(!__types_ok(ux, uy), \ |
| 94 | #op"("#x", "#y") signedness error"); \ |
| 95 | __cmp(op, ux, uy); }) |
| 96 | |
| 97 | #define __careful_cmp(op, x, y) \ |
| 98 | __careful_cmp_once(op, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_)) |
| 99 | |
| 100 | /** |
| 101 | * min - return minimum of two values of the same or compatible types |
| 102 | * @x: first value |
| 103 | * @y: second value |
| 104 | */ |
| 105 | #define min(x, y) __careful_cmp(min, x, y) |
| 106 | |
| 107 | /** |
| 108 | * max - return maximum of two values of the same or compatible types |
| 109 | * @x: first value |
| 110 | * @y: second value |
| 111 | */ |
| 112 | #define max(x, y) __careful_cmp(max, x, y) |
| 113 | |
| 114 | /** |
| 115 | * umin - return minimum of two non-negative values |
| 116 | * Signed types are zero extended to match a larger unsigned type. |
| 117 | * @x: first value |
| 118 | * @y: second value |
| 119 | */ |
| 120 | #define umin(x, y) \ |
| 121 | __careful_cmp(min, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull) |
| 122 | |
| 123 | /** |
| 124 | * umax - return maximum of two non-negative values |
| 125 | * @x: first value |
| 126 | * @y: second value |
| 127 | */ |
| 128 | #define umax(x, y) \ |
| 129 | __careful_cmp(max, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull) |
| 130 | |
| 131 | #define __careful_op3(op, x, y, z, ux, uy, uz) ({ \ |
| 132 | __auto_type ux = (x); __auto_type uy = (y);__auto_type uz = (z);\ |
| 133 | BUILD_BUG_ON_MSG(!__types_ok3(ux, uy, uz), \ |
| 134 | #op"3("#x", "#y", "#z") signedness error"); \ |
| 135 | __cmp(op, ux, __cmp(op, uy, uz)); }) |
| 136 | |
| 137 | /** |
| 138 | * min3 - return minimum of three values |
| 139 | * @x: first value |
| 140 | * @y: second value |
| 141 | * @z: third value |
| 142 | */ |
| 143 | #define min3(x, y, z) \ |
| 144 | __careful_op3(min, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_)) |
| 145 | |
| 146 | /** |
| 147 | * max3 - return maximum of three values |
| 148 | * @x: first value |
| 149 | * @y: second value |
| 150 | * @z: third value |
| 151 | */ |
| 152 | #define max3(x, y, z) \ |
| 153 | __careful_op3(max, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_)) |
| 154 | |
| 155 | /** |
| 156 | * min_t - return minimum of two values, using the specified type |
| 157 | * @type: data type to use |
| 158 | * @x: first value |
| 159 | * @y: second value |
| 160 | */ |
| 161 | #define min_t(type, x, y) __cmp_once(min, type, x, y) |
| 162 | |
| 163 | /** |
| 164 | * max_t - return maximum of two values, using the specified type |
| 165 | * @type: data type to use |
| 166 | * @x: first value |
| 167 | * @y: second value |
| 168 | */ |
| 169 | #define max_t(type, x, y) __cmp_once(max, type, x, y) |
| 170 | |
| 171 | /** |
| 172 | * min_not_zero - return the minimum that is _not_ zero, unless both are zero |
| 173 | * @x: value1 |
| 174 | * @y: value2 |
| 175 | */ |
| 176 | #define min_not_zero(x, y) ({ \ |
| 177 | typeof(x) __x = (x); \ |
| 178 | typeof(y) __y = (y); \ |
| 179 | __x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); }) |
| 180 | |
| 181 | #define __clamp(val, lo, hi) \ |
| 182 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val))) |
| 183 | |
| 184 | #define __clamp_once(type, val, lo, hi, uval, ulo, uhi) ({ \ |
| 185 | type uval = (val); \ |
| 186 | type ulo = (lo); \ |
| 187 | type uhi = (hi); \ |
| 188 | BUILD_BUG_ON_MSG(statically_true(ulo > uhi), \ |
| 189 | "clamp() low limit " #lo " greater than high limit " #hi); \ |
| 190 | BUILD_BUG_ON_MSG(!__types_ok3(uval, ulo, uhi), \ |
| 191 | "clamp("#val", "#lo", "#hi") signedness error"); \ |
| 192 | __clamp(uval, ulo, uhi); }) |
| 193 | |
| 194 | #define __careful_clamp(type, val, lo, hi) \ |
| 195 | __clamp_once(type, val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_)) |
| 196 | |
| 197 | /** |
| 198 | * clamp - return a value clamped to a given range with typechecking |
| 199 | * @val: current value |
| 200 | * @lo: lowest allowable value |
| 201 | * @hi: highest allowable value |
| 202 | * |
| 203 | * This macro checks @val/@lo/@hi to make sure they have compatible |
| 204 | * signedness. |
| 205 | */ |
| 206 | #define clamp(val, lo, hi) __careful_clamp(__auto_type, val, lo, hi) |
| 207 | |
| 208 | /** |
| 209 | * clamp_t - return a value clamped to a given range using a given type |
| 210 | * @type: the type of variable to use |
| 211 | * @val: current value |
| 212 | * @lo: minimum allowable value |
| 213 | * @hi: maximum allowable value |
| 214 | * |
| 215 | * This macro does no typechecking and uses temporary variables of type |
| 216 | * @type to make all the comparisons. |
| 217 | */ |
| 218 | #define clamp_t(type, val, lo, hi) __careful_clamp(type, val, lo, hi) |
| 219 | |
| 220 | /** |
| 221 | * clamp_val - return a value clamped to a given range using val's type |
| 222 | * @val: current value |
| 223 | * @lo: minimum allowable value |
| 224 | * @hi: maximum allowable value |
| 225 | * |
| 226 | * This macro does no typechecking and uses temporary variables of whatever |
| 227 | * type the input argument @val is. This is useful when @val is an unsigned |
| 228 | * type and @lo and @hi are literals that will otherwise be assigned a signed |
| 229 | * integer type. |
| 230 | */ |
| 231 | #define clamp_val(val, lo, hi) __careful_clamp(typeof(val), val, lo, hi) |
| 232 | |
| 233 | /* |
| 234 | * Do not check the array parameter using __must_be_array(). |
| 235 | * In the following legit use-case where the "array" passed is a simple pointer, |
| 236 | * __must_be_array() will return a failure. |
| 237 | * --- 8< --- |
| 238 | * int *buff |
| 239 | * ... |
| 240 | * min = min_array(buff, nb_items); |
| 241 | * --- 8< --- |
| 242 | * |
| 243 | * The first typeof(&(array)[0]) is needed in order to support arrays of both |
| 244 | * 'int *buff' and 'int buff[N]' types. |
| 245 | * |
| 246 | * The array can be an array of const items. |
| 247 | * typeof() keeps the const qualifier. Use __unqual_scalar_typeof() in order |
| 248 | * to discard the const qualifier for the __element variable. |
| 249 | */ |
| 250 | #define __minmax_array(op, array, len) ({ \ |
| 251 | typeof(&(array)[0]) __array = (array); \ |
| 252 | typeof(len) __len = (len); \ |
| 253 | __unqual_scalar_typeof(__array[0]) __element = __array[--__len];\ |
| 254 | while (__len--) \ |
| 255 | __element = op(__element, __array[__len]); \ |
| 256 | __element; }) |
| 257 | |
| 258 | /** |
| 259 | * min_array - return minimum of values present in an array |
| 260 | * @array: array |
| 261 | * @len: array length |
| 262 | * |
| 263 | * Note that @len must not be zero (empty array). |
| 264 | */ |
| 265 | #define min_array(array, len) __minmax_array(min, array, len) |
| 266 | |
| 267 | /** |
| 268 | * max_array - return maximum of values present in an array |
| 269 | * @array: array |
| 270 | * @len: array length |
| 271 | * |
| 272 | * Note that @len must not be zero (empty array). |
| 273 | */ |
| 274 | #define max_array(array, len) __minmax_array(max, array, len) |
| 275 | |
| 276 | static inline bool in_range64(u64 val, u64 start, u64 len) |
| 277 | { |
| 278 | return (val - start) < len; |
| 279 | } |
| 280 | |
| 281 | static inline bool in_range32(u32 val, u32 start, u32 len) |
| 282 | { |
| 283 | return (val - start) < len; |
| 284 | } |
| 285 | |
| 286 | /** |
| 287 | * in_range - Determine if a value lies within a range. |
| 288 | * @val: Value to test. |
| 289 | * @start: First value in range. |
| 290 | * @len: Number of values in range. |
| 291 | * |
| 292 | * This is more efficient than "if (start <= val && val < (start + len))". |
| 293 | * It also gives a different answer if @start + @len overflows the size of |
| 294 | * the type by a sufficient amount to encompass @val. Decide for yourself |
| 295 | * which behaviour you want, or prove that start + len never overflow. |
| 296 | * Do not blindly replace one form with the other. |
| 297 | */ |
| 298 | #define in_range(val, start, len) \ |
| 299 | ((sizeof(start) | sizeof(len) | sizeof(val)) <= sizeof(u32) ? \ |
| 300 | in_range32(val, start, len) : in_range64(val, start, len)) |
| 301 | |
| 302 | /** |
| 303 | * swap - swap values of @a and @b |
| 304 | * @a: first value |
| 305 | * @b: second value |
| 306 | */ |
| 307 | #define swap(a, b) \ |
| 308 | do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0) |
| 309 | |
| 310 | /* |
| 311 | * Use these carefully: no type checking, and uses the arguments |
| 312 | * multiple times. Use for obvious constants only. |
| 313 | */ |
| 314 | #define MIN(a, b) __cmp(min, a, b) |
| 315 | #define MAX(a, b) __cmp(max, a, b) |
| 316 | #define MIN_T(type, a, b) __cmp(min, (type)(a), (type)(b)) |
| 317 | #define MAX_T(type, a, b) __cmp(max, (type)(a), (type)(b)) |
| 318 | |
| 319 | #endif /* _LINUX_MINMAX_H */ |
| 320 | |