diff options
Diffstat (limited to 'include/linux/nospec.h')
| -rw-r--r-- | include/linux/nospec.h | 26 | 
1 files changed, 3 insertions, 23 deletions
diff --git a/include/linux/nospec.h b/include/linux/nospec.h index fbc98e2c8228..e791ebc65c9c 100644 --- a/include/linux/nospec.h +++ b/include/linux/nospec.h @@ -5,6 +5,7 @@  #ifndef _LINUX_NOSPEC_H  #define _LINUX_NOSPEC_H +#include <asm/barrier.h>  /**   * array_index_mask_nospec() - generate a ~0 mask when index < size, 0 otherwise @@ -30,26 +31,6 @@ static inline unsigned long array_index_mask_nospec(unsigned long index,  #endif  /* - * Warn developers about inappropriate array_index_nospec() usage. - * - * Even if the CPU speculates past the WARN_ONCE branch, the - * sign bit of @index is taken into account when generating the - * mask. - * - * This warning is compiled out when the compiler can infer that - * @index and @size are less than LONG_MAX. - */ -#define array_index_mask_nospec_check(index, size)				\ -({										\ -	if (WARN_ONCE(index > LONG_MAX || size > LONG_MAX,			\ -	    "array_index_nospec() limited to range of [0, LONG_MAX]\n"))	\ -		_mask = 0;							\ -	else									\ -		_mask = array_index_mask_nospec(index, size);			\ -	_mask;									\ -}) - -/*   * array_index_nospec - sanitize an array index after a bounds check   *   * For a code sequence like: @@ -67,12 +48,11 @@ static inline unsigned long array_index_mask_nospec(unsigned long index,  ({									\  	typeof(index) _i = (index);					\  	typeof(size) _s = (size);					\ -	unsigned long _mask = array_index_mask_nospec_check(_i, _s);	\ +	unsigned long _mask = array_index_mask_nospec(_i, _s);		\  									\  	BUILD_BUG_ON(sizeof(_i) > sizeof(long));			\  	BUILD_BUG_ON(sizeof(_s) > sizeof(long));			\  									\ -	_i &= _mask;							\ -	_i;								\ +	(typeof(_i)) (_i & _mask);					\  })  #endif /* _LINUX_NOSPEC_H */  |