|
|
@@ -49,6 +49,30 @@ do { \
|
|
|
#define __smp_mb__before_atomic() barrier()
|
|
|
#define __smp_mb__after_atomic() barrier()
|
|
|
|
|
|
+/**
|
|
|
+ * array_index_mask_nospec - generate a mask for array_idx() that is
|
|
|
+ * ~0UL when the bounds check succeeds and 0 otherwise
|
|
|
+ * @index: array element index
|
|
|
+ * @size: number of elements in array
|
|
|
+ */
|
|
|
+#define array_index_mask_nospec array_index_mask_nospec
|
|
|
+static inline unsigned long array_index_mask_nospec(unsigned long index,
|
|
|
+ unsigned long size)
|
|
|
+{
|
|
|
+ unsigned long mask;
|
|
|
+
|
|
|
+ if (__builtin_constant_p(size) && size > 0) {
|
|
|
+ asm(" clgr %2,%1\n"
|
|
|
+ " slbgr %0,%0\n"
|
|
|
+ :"=d" (mask) : "d" (size-1), "d" (index) :"cc");
|
|
|
+ return mask;
|
|
|
+ }
|
|
|
+ asm(" clgr %1,%2\n"
|
|
|
+ " slbgr %0,%0\n"
|
|
|
+ :"=d" (mask) : "d" (size), "d" (index) :"cc");
|
|
|
+ return ~mask;
|
|
|
+}
|
|
|
+
|
|
|
#include <asm-generic/barrier.h>
|
|
|
|
|
|
#endif /* __ASM_BARRIER_H */
|