]> git.karo-electronics.de Git - linux-beck.git/blobdiff - include/linux/bitmap.h
bitmap.h, perf/core: Fix the mask in perf_output_sample_regs()
[linux-beck.git] / include / linux / bitmap.h
index 27bfc0b631a98373c3af7d3f8878aa75006303ba..3b77588a93602eecd5d73d30d6fd77377286f07e 100644 (file)
@@ -266,13 +266,12 @@ static inline int bitmap_equal(const unsigned long *src1,
                        const unsigned long *src2, unsigned int nbits)
 {
        if (small_const_nbits(nbits))
-               return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
+               return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
 #ifdef CONFIG_S390
-       else if (__builtin_constant_p(nbits) && (nbits % BITS_PER_LONG) == 0)
+       if (__builtin_constant_p(nbits) && (nbits % BITS_PER_LONG) == 0)
                return !memcmp(src1, src2, nbits / 8);
 #endif
-       else
-               return __bitmap_equal(src1, src2, nbits);
+       return __bitmap_equal(src1, src2, nbits);
 }
 
 static inline int bitmap_intersects(const unsigned long *src1,
@@ -340,6 +339,24 @@ static inline int bitmap_parse(const char *buf, unsigned int buflen,
        return __bitmap_parse(buf, buflen, 0, maskp, nmaskbits);
 }
 
+/*
+ * bitmap_from_u64 - Check and swap words within u64.
+ *  @mask: source bitmap
+ *  @dst:  destination bitmap
+ *
+ * In 32-bit Big Endian kernel, when using (u32 *)(&val)[*]
+ * to read u64 mask, we will get the wrong word.
+ * That is "(u32 *)(&val)[0]" gets the upper 32 bits,
+ * but we expect the lower 32-bits of u64.
+ */
+static inline void bitmap_from_u64(unsigned long *dst, u64 mask)
+{
+       dst[0] = mask & ULONG_MAX;
+
+       if (sizeof(mask) > sizeof(unsigned long))
+               dst[1] = mask >> 32;
+}
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __LINUX_BITMAP_H */