
Hi York,
On 1 December 2015 at 10:26, York Sun yorksun@freescale.com wrote:
On 11/05/2015 06:43 AM, Fabio Estevam wrote:
Use the generic bitops header files from the kernel.
Imported from kernel 4.2.3.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com
Changes since v6:
- Do not touch include/linux/bitops here to avoid build warnings (Daniel)
include/asm-generic/bitops/__ffs.h | 43 ++++++++++++++++++++++++++++++++++++++ include/asm-generic/bitops/__fls.h | 43 ++++++++++++++++++++++++++++++++++++++ include/asm-generic/bitops/fls.h | 41 ++++++++++++++++++++++++++++++++++++ include/asm-generic/bitops/fls64.h | 36 +++++++++++++++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 include/asm-generic/bitops/__ffs.h create mode 100644 include/asm-generic/bitops/__fls.h create mode 100644 include/asm-generic/bitops/fls.h create mode 100644 include/asm-generic/bitops/fls64.h
<snip>
diff --git a/include/asm-generic/bitops/__fls.h b/include/asm-generic/bitops/__fls.h new file mode 100644 index 0000000..a60a7cc --- /dev/null +++ b/include/asm-generic/bitops/__fls.h @@ -0,0 +1,43 @@ +#ifndef _ASM_GENERIC_BITOPS___FLS_H_ +#define _ASM_GENERIC_BITOPS___FLS_H_
+#include <asm/types.h>
+/**
- __fls - find last (most-significant) set bit in a long word
- @word: the word to search
- Undefined if no set bit exists, so code should check against 0 first.
- */
+static __always_inline unsigned long __fls(unsigned long word) +{
int num = BITS_PER_LONG - 1;
+#if BITS_PER_LONG == 64
if (!(word & (~0ul << 32))) {
num -= 32;
word <<= 32;
}
+#endif
if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
num -= 16;
word <<= 16;
}
if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
num -= 8;
word <<= 8;
}
if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
num -= 4;
word <<= 4;
}
if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
num -= 2;
word <<= 2;
}
if (!(word & (~0ul << (BITS_PER_LONG-1))))
num -= 1;
return num;
+}
Sorry for catching this late. All above left shift causes compiling warning on 32-bit host (ubuntu 12.04 with gcc 4.6.3)
include/asm-generic/bitops/__fls.h:17:2: warning: left shift count >= width of type [enabled by default]
The root cause may be in include/configs/sandbox.h #define CONFIG_SANDBOX_BITS_PER_LONG 64
I think sandbox has a few issues on 32-bit machines. Probably this should change to 32-bits. I don't have a 32-bit machine set up and in regular use so I have not looked a tthis.
Regards, Simon