Messages in this thread | | | Date | Thu, 15 Dec 2011 14:42:41 -0800 | From | "H. Peter Anvin" <> | Subject | x86: fls64() exported to user space but not fls()? |
| |
I'm trying to grok why fls64() seems to be exported to user space in <asm/bitops.h> on x86 by unconditional inclusion of <asm-generic/bitops/fls64.h>:
... #endif /* __KERNEL__ */
#include <asm-generic/bitops/fls64.h>
#ifdef __KERNEL__ ...
whereas fls() isn't (although __fls() is!)
This is even more bizarre since <asm-generic/bitops/fls64.h> contains:
... #if BITS_PER_LONG == 32 static __always_inline int fls64(__u64 x) { __u32 h = x >> 32; if (h) return fls(h) + 32; return fls(x); } #elif BITS_PER_LONG == 64 static __always_inline int fls64(__u64 x) { if (x == 0) return 0; return __fls(x) + 1; } #else #error BITS_PER_LONG not 32 or 64 #endif ...
Both BITS_PER_LONG and fls() are non-user-visible symbols, so this code should fail on user space. Finally, <asm-generic/bitops/*> are non-exported headers; they are not installed by make headers_install.
Is the #endif..#ifdef in <asm/bitops.h> a bug, plain and simple?
-hpa
| |