]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fls: change parameter to unsigned int
authorMatthew Wilcox <willy@infradead.org>
Thu, 3 Jan 2019 23:26:41 +0000 (15:26 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 4 Jan 2019 21:13:46 +0000 (13:13 -0800)
When testing in userspace, UBSAN pointed out that shifting into the sign
bit is undefined behaviour.  It doesn't really make sense to ask for the
highest set bit of a negative value, so just turn the argument type into
an unsigned int.

Some architectures (eg ppc) already had it declared as an unsigned int,
so I don't expect too many problems.

Link: http://lkml.kernel.org/r/20181105221117.31828-1-willy@infradead.org
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
16 files changed:
arch/alpha/include/asm/bitops.h
arch/arc/include/asm/bitops.h
arch/c6x/include/asm/bitops.h
arch/csky/include/asm/bitops.h
arch/hexagon/include/asm/bitops.h
arch/ia64/include/asm/bitops.h
arch/m68k/include/asm/bitops.h
arch/mips/include/asm/bitops.h
arch/openrisc/include/asm/bitops/fls.h
arch/parisc/include/asm/bitops.h
arch/s390/include/asm/bitops.h
arch/unicore32/include/asm/bitops.h
arch/x86/include/asm/bitops.h
include/asm-generic/bitops/builtin-fls.h
include/asm-generic/bitops/fls.h
tools/include/asm-generic/bitops/fls.h

index ca43f4d0b93751b3cb262889fb638cf9c07a7011..5adca78830b5e9a3349e5fb410188b0eb98e3bd3 100644 (file)
@@ -391,9 +391,9 @@ static inline unsigned long __fls(unsigned long x)
        return fls64(x) - 1;
 }
 
-static inline int fls(int x)
+static inline int fls(unsigned int x)
 {
-       return fls64((unsigned int) x);
+       return fls64(x);
 }
 
 /*
index 8da87feec59aab58a1309fbd5f92fb12b72d8799..ee9246184033b3138f8d09878fc7763502b11e5c 100644 (file)
@@ -278,7 +278,7 @@ static inline __attribute__ ((const)) int clz(unsigned int x)
        return res;
 }
 
-static inline int constant_fls(int x)
+static inline int constant_fls(unsigned int x)
 {
        int r = 32;
 
@@ -312,7 +312,7 @@ static inline int constant_fls(int x)
  * @result: [1-32]
  * fls(1) = 1, fls(0x80000000) = 32, fls(0) = 0
  */
-static inline __attribute__ ((const)) int fls(unsigned long x)
+static inline __attribute__ ((const)) int fls(unsigned int x)
 {
        if (__builtin_constant_p(x))
               return constant_fls(x);
index f0ab012401b67c10d6717cab8aa52f6987ba0ba3..8b68234ace181bbacdbf9c709d86051fc09b11de 100644 (file)
@@ -54,7 +54,7 @@ static inline unsigned long __ffs(unsigned long x)
  * This is defined the same way as ffs.
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
-static inline int fls(int x)
+static inline int fls(unsigned int x)
 {
        if (!x)
                return 0;
index 335f2883fb1ee85aef5e6e4800f763c975047743..43b9838bff63d153a1942c1d292f8bc81af70599 100644 (file)
@@ -40,7 +40,7 @@ static __always_inline unsigned long __ffs(unsigned long x)
 /*
  * asm-generic/bitops/fls.h
  */
-static __always_inline int fls(int x)
+static __always_inline int fls(unsigned int x)
 {
        asm volatile(
                "ff1 %0\n"
index 2691a1857d203db2522ae178fe744225c71d2da9..bee97426238705e78fca708d3d0d0c4b965cdb60 100644 (file)
@@ -211,7 +211,7 @@ static inline long ffz(int x)
  * This is defined the same way as ffs.
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
-static inline int fls(int x)
+static inline int fls(unsigned int x)
 {
        int r;
 
index 56a774bf13fa73fe3b9523f1d1f25bd3237f0243..2f24ee6459d20ff49e07ebdb1aa5c137c85e1953 100644 (file)
@@ -388,8 +388,7 @@ ia64_fls (unsigned long x)
  * Find the last (most significant) bit set.  Returns 0 for x==0 and
  * bits are numbered from 1..32 (e.g., fls(9) == 4).
  */
-static inline int
-fls (int t)
+static inline int fls(unsigned int t)
 {
        unsigned long x = t & 0xffffffffu;
 
index d979f38af751cfeaa8a83cfc7389b15088ef3e21..10133a968c8e150b10d6cd0a9e778701bbaff882 100644 (file)
@@ -502,7 +502,7 @@ static inline unsigned long __ffs(unsigned long x)
 /*
  *     fls: find last bit set.
  */
-static inline int fls(int x)
+static inline int fls(unsigned int x)
 {
        int cnt;
 
index f2a840fb6a9af6739a792359b3224f5b46d231f0..c4675957b21bca1e5be2cddd37f8af71a24eb6b9 100644 (file)
@@ -555,7 +555,7 @@ static inline unsigned long __ffs(unsigned long word)
  * This is defined the same way as ffs.
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
-static inline int fls(int x)
+static inline int fls(unsigned int x)
 {
        int r;
 
index 9efbf9ad86c409bb8a6671e4a49ea50e2ec35bde..57de5a1115bfd99ea57a208e50057af2afe0b924 100644 (file)
@@ -15,7 +15,7 @@
 
 #ifdef CONFIG_OPENRISC_HAVE_INST_FL1
 
-static inline int fls(int x)
+static inline int fls(unsigned int x)
 {
        int ret;
 
index 53252d4f9a570c7a7ee889bbba7cb167d9bef2f9..a09eaebfdfd07f8caff2dbc2b77fa315770f10e0 100644 (file)
@@ -188,7 +188,7 @@ static __inline__ int ffs(int x)
  * fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
 
-static __inline__ int fls(int x)
+static __inline__ int fls(unsigned int x)
 {
        int ret;
        if (!x)
index 86e5b2fdee3c8ee1b6da3f290de5be4b4460734c..d1f8a4d94cca02269841b6b6e0928ac699089b6b 100644 (file)
@@ -397,9 +397,9 @@ static inline int fls64(unsigned long word)
  * This is defined the same way as ffs.
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
-static inline int fls(int word)
+static inline int fls(unsigned int word)
 {
-       return fls64((unsigned int)word);
+       return fls64(word);
 }
 
 #else /* CONFIG_HAVE_MARCH_Z9_109_FEATURES */
index c0cbdbe1716809115431e0c999363e37f7156d65..de5853761c22ca0b6485f12a06c73f25bb320286 100644 (file)
@@ -22,7 +22,7 @@
  * the cntlz instruction for much better code efficiency.
  */
 
-static inline int fls(int x)
+static inline int fls(unsigned int x)
 {
        int ret;
 
index 124f9195eb3ef5545f96fbb111ee4a111de5f0d0..ad7b210aa3f621c5902f4f077eab0932b4924593 100644 (file)
@@ -448,7 +448,7 @@ static __always_inline int ffs(int x)
  * set bit if value is nonzero. The last (most significant) bit is
  * at position 32.
  */
-static __always_inline int fls(int x)
+static __always_inline int fls(unsigned int x)
 {
        int r;
 
index 62daf940989df977d94be029beafcca21a777338..c8455cc28841afe18cfa24f7c24280836bfc58b7 100644 (file)
@@ -9,7 +9,7 @@
  * This is defined the same way as ffs.
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
-static __always_inline int fls(int x)
+static __always_inline int fls(unsigned int x)
 {
        return x ? sizeof(x) * 8 - __builtin_clz(x) : 0;
 }
index 753aecaab641a82d7f218988fcebe0751f7149ff..b168bb10e1be17bb6394e749c238da3940ea3a01 100644 (file)
@@ -10,7 +10,7 @@
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
 
-static __always_inline int fls(int x)
+static __always_inline int fls(unsigned int x)
 {
        int r = 32;
 
index 753aecaab641a82d7f218988fcebe0751f7149ff..b168bb10e1be17bb6394e749c238da3940ea3a01 100644 (file)
@@ -10,7 +10,7 @@
  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  */
 
-static __always_inline int fls(int x)
+static __always_inline int fls(unsigned int x)
 {
        int r = 32;