Skip to contentSkip to conversation

lib: fix compilation when strings.h is included

PATCH New Petro Karashchenko 4 participants 7 messages Jan 24, 2022 – Jan 28, 2022 1 message not in the archive

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 lib: fix compilation when strings.h is included

In a systems that provide strings.h and it is included together with sbi_bitops.h the compilation error appears. The ffs() and fls() are provided by strings.h

---
 include/sbi/sbi_bitops.h        | 24 ++++++++++++------------
 lib/sbi/sbi_bitops.c            | 10 +++++-----
 lib/sbi/sbi_hart.c              |  6 +++---
 lib/sbi/sbi_pmu.c               |  6 +++---
 lib/utils/timer/aclint_mtimer.c |  2 +-
 5 files changed, 24 insertions(+), 24 deletions(-)
include/sbi/sbi_bitops.h +12 -12
index 879430d..92ea449 100644
@@ -37,14 +37,14 @@
 	(((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
 
 /**
- * ffs - Find first bit set
+ * __ffs - Find first bit set
  * @x: the word to search
  *
  * This is defined the same way as
  * the libc and compiler builtin ffs routines, therefore
  * differs in spirit from the above ffz (man ffs).
  */
-static inline int ffs(int x)
+static inline int __ffs(int x)
 {
 	int r = 1;
 
@@ -72,12 +72,12 @@ static inline int ffs(int x)
 }
 
 /**
- * __ffs - find first bit in word.
+ * __ffsl - find first bit in word.
  * @word: The word to search
  *
  * Undefined if no bit exists, so code should check against 0 first.
  */
-static inline int __ffs(unsigned long word)
+static inline int __ffsl(unsigned long word)
 {
 	int num = 0;
 
@@ -109,22 +109,22 @@ static inline int __ffs(unsigned long word)
 }
 
 /*
- * ffz - find first zero in word.
+ * __ffz - find first zero in word.
  * @word: The word to search
  *
  * Undefined if no zero exists, so code should check against ~0UL first.
  */
-#define ffz(x) __ffs(~(x))
+#define __ffz(x) __ffsl(~(x))
 
 /**
- * fls - find last (most-significant) bit set
+ * __fls - find last (most-significant) bit set
  * @x: the word to search
  *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ * 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(int x)
 {
 	int r = 32;
 
@@ -152,12 +152,12 @@ static inline int fls(int x)
 }
 
 /**
- * __fls - find last (most-significant) set bit in a long word
+ * __flsl - 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 inline unsigned long __fls(unsigned long word)
+static inline unsigned long __flsl(unsigned long word)
 {
 	int num = BITS_PER_LONG - 1;
 
lib/sbi/sbi_bitops.c +5 -5
index de9d045..2e2860d 100644
@@ -39,7 +39,7 @@ unsigned long find_first_bit(const unsigned long *addr,
 	if (tmp == 0UL)		/* Are any bits set? */
 		return result + size;	/* Nope. */
 found:
-	return result + __ffs(tmp);
+	return result + __ffsl(tmp);
 }
 
 /**
@@ -69,7 +69,7 @@ unsigned long find_first_zero_bit(const unsigned long *addr,
 	if (tmp == ~0UL)	/* Are any bits zero? */
 		return result + size;	/* Nope. */
 found:
-	return result + ffz(tmp);
+	return result + __ffz(tmp);
 }
 
 /**
@@ -100,7 +100,7 @@ unsigned long find_last_bit(const unsigned long *addr,
 		tmp = addr[--words];
 		if (tmp) {
 found:
-			return words * BITS_PER_LONG + __fls(tmp);
+			return words * BITS_PER_LONG + __flsl(tmp);
 		}
 	}
 
@@ -150,7 +150,7 @@ found_first:
 	if (tmp == 0UL)		/* Are any bits set? */
 		return result + size;	/* Nope. */
 found_middle:
-	return result + __ffs(tmp);
+	return result + __ffsl(tmp);
 }
 
 /**
@@ -196,5 +196,5 @@ found_first:
 	if (tmp == ~0UL)	/* Are any bits zero? */
 		return result + size;	/* Nope. */
 found_middle:
-	return result + ffz(tmp);
+	return result + __ffz(tmp);
 }
lib/sbi/sbi_hart.c +3 -3
index d9a15d9..5ac7d80 100644
@@ -368,7 +368,7 @@ static int hart_pmu_get_allowed_bits(void)
 		if (trap.cause)
 			return 0;
 	}
-	num_bits = __fls(val) + 1;
+	num_bits = __flsl(val) + 1;
 #if __riscv_xlen == 32
 	csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val);
 	if (!trap.cause) {
@@ -376,7 +376,7 @@ static int hart_pmu_get_allowed_bits(void)
 		if (trap.cause)
 			return num_bits;
 	}
-	num_bits += __fls(val) + 1;
+	num_bits += __flsl(val) + 1;
 
 #endif
 
@@ -439,7 +439,7 @@ static void hart_detect_features(struct sbi_scratch *scratch)
 	 */
 	val = hart_pmp_get_allowed_addr();
 	if (val) {
-		hfeatures->pmp_gran =  1 << (__ffs(val) + 2);
+		hfeatures->pmp_gran =  1 << (__ffsl(val) + 2);
 		hfeatures->pmp_addr_bits = __fls(val) + 1;
 		/* Detect number of PMP regions. At least PMPADDR0 should be implemented*/
 		__check_csr_64(CSR_PMPADDR0, 0, val, pmp_count, __pmp_skip);
lib/sbi/sbi_pmu.c +3 -3
index 5b845f8..5b191ab 100644
@@ -343,7 +343,7 @@ int sbi_pmu_ctr_start(unsigned long cbase, unsigned long cmask,
 	int ret = SBI_EINVAL;
 	bool bUpdate = FALSE;
 
-	if (__fls(ctr_mask) >= total_ctrs)
+	if (__flsl(ctr_mask) >= total_ctrs)
 		return ret;
 
 	if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)
@@ -417,7 +417,7 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned long cmask,
 	uint32_t event_code;
 	unsigned long ctr_mask = cmask << cbase;
 
-	if (__fls(ctr_mask) >= total_ctrs)
+	if (__flsl(ctr_mask) >= total_ctrs)
 		return SBI_EINVAL;
 
 	for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {
@@ -606,7 +606,7 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask,
 	unsigned long tmp = cidx_mask << cidx_base;
 
 	/* Do a basic sanity check of counter base & mask */
-	if (__fls(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
+	if (__flsl(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
 		return SBI_EINVAL;
 
 	if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {
lib/utils/timer/aclint_mtimer.c +1 -1
index 2532b63..d17d15f 100644
@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsigned long addr, unsigned long size)
 	while (pos < end) {
 		rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
 		if (rsize)
-			rsize = 1UL << __ffs(pos);
+			rsize = 1UL << __ffsl(pos);
 		else
 			rsize = ((end - pos) < MTIMER_ADD_REGION_ALIGN) ?
 				(end - pos) : MTIMER_ADD_REGION_ALIGN;
Signature · 1 line
2.32.0
#1 lore raw

PATCH 1/1 lib: fix compilation when strings.h is included

? 2022-01-24???? 14:22 +0200?Petro Karashchenko???

Quoted 3 lines

In a systems that provide strings.h and it is included together with sbi_bitops.h the compilation error appears. The ffs() and fls() are provided by strings.h

opensbi does not depend on the library provided by the system, nor does it refer to strings.h, so I don't think this modification is necessary

Regards,
Xiang W

Quoted 233 lines

---

?include/sbi/sbi_bitops.h??????? | 24 ++++++++++++------------
?lib/sbi/sbi_bitops.c??????????? | 10 +++++-----
?lib/sbi/sbi_hart.c????????????? |? 6 +++---
?lib/sbi/sbi_pmu.c?????????????? |? 6 +++---
?lib/utils/timer/aclint_mtimer.c |? 2 +-

?5 files changed, 24 insertions(+), 24 deletions(-)

include/sbi/sbi_bitops.h +0 -0
index 879430d..92ea449 100644
@@ -37,14 +37,14 @@

????????(((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
?
?/**
- * ffs - Find first bit set
+ * __ffs - Find first bit set
? * @x: the word to search
? *
? * This is defined the same way as
? * the libc and compiler builtin ffs routines, therefore ? * differs in spirit from the above ffz (man ffs).
? */

include/sbi/sbi_bitops.h +1 -1
-static inline int ffs(int x)
+static inline int __ffs(int x)

?{
????????int r = 1;
?

include/sbi/sbi_bitops.h +0 -0
@@ -72,12 +72,12 @@ static inline int ffs(int x)
 ?}

?
?/**
- * __ffs - find first bit in word.
+ * __ffsl - find first bit in word.
? * @word: The word to search
? *
? * Undefined if no bit exists, so code should check against 0 first. ? */

include/sbi/sbi_bitops.h +1 -1
-static inline int __ffs(unsigned long word)
+static inline int __ffsl(unsigned long word)

?{
????????int num = 0;
?

include/sbi/sbi_bitops.h +0 -0
@@ -109,22 +109,22 @@ static inline int __ffs(unsigned long word)
 ?}

?
?/*
- * ffz - find first zero in word.
+ * __ffz - find first zero in word.
? * @word: The word to search
? *
? * Undefined if no zero exists, so code should check against ~0UL first.
? */

include/sbi/sbi_bitops.h +1 -1
-#define ffz(x) __ffs(~(x))
+#define __ffz(x) __ffsl(~(x))

?
?/**
- * fls - find last (most-significant) bit set
+ * __fls - find last (most-significant) bit set
? * @x: the word to search
? *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ * This is defined the same way as __ffs.
+ * Note __fls(0) = 0, __fls(1) = 1, __fls(0x80000000) = 32. ? */
?

include/sbi/sbi_bitops.h +1 -1
-static inline int fls(int x)
+static inline int __fls(int x)

?{
????????int r = 32;
?

include/sbi/sbi_bitops.h +0 -0
@@ -152,12 +152,12 @@ static inline int fls(int x)
 ?}

?
?/**
- * __fls - find last (most-significant) set bit in a long word
+ * __flsl - 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.
? */

include/sbi/sbi_bitops.h +1 -1
-static inline unsigned long __fls(unsigned long word)
+static inline unsigned long __flsl(unsigned long word)

?{
????????int num = BITS_PER_LONG - 1;
?

lib/sbi/sbi_bitops.c +0 -0
index de9d045..2e2860d 100644
@@ -39,7 +39,7 @@ unsigned long find_first_bit(const unsigned long
 *addr,

????????if (tmp == 0UL)?????????/* Are any bits set? */ ????????????????return result + size;???/* Nope. */ ?found:
-???????return result + __ffs(tmp); +???????return result + __ffsl(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -69,7 +69,7 @@ unsigned long find_first_zero_bit(const unsigned
 long *addr,

????????if (tmp == ~0UL)????????/* Are any bits zero? */ ????????????????return result + size;???/* Nope. */ ?found:
-???????return result + ffz(tmp); +???????return result + __ffz(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -100,7 +100,7 @@ unsigned long find_last_bit(const unsigned long
 *addr,
 ????????????????tmp = addr[--words];
 ????????????????if (tmp) {

?found:
-???????????????????????return words * BITS_PER_LONG + __fls(tmp); +???????????????????????return words * BITS_PER_LONG + __flsl(tmp); ????????????????}
????????}
?

lib/sbi/sbi_bitops.c +0 -0
@@ -150,7 +150,7 @@ found_first:

????????if (tmp == 0UL)?????????/* Are any bits set? */ ????????????????return result + size;???/* Nope. */ ?found_middle:
-???????return result + __ffs(tmp); +???????return result + __ffsl(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -196,5 +196,5 @@ found_first:

????????if (tmp == ~0UL)????????/* Are any bits zero? */ ????????????????return result + size;???/* Nope. */ ?found_middle:
-???????return result + ffz(tmp); +???????return result + __ffz(tmp);
?}

lib/sbi/sbi_hart.c +1 -1
index d9a15d9..5ac7d80 100644
@@ -368,7 +368,7 @@ static int hart_pmu_get_allowed_bits(void)
 ????????????????if (trap.cause)
 ????????????????????????return 0;
 ????????}
-???????num_bits = __fls(val) + 1;
+???????num_bits = __flsl(val) + 1;

?#if __riscv_xlen == 32 ????????csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val); ????????if (!trap.cause) {

lib/sbi/sbi_hart.c +1 -1
@@ -376,7 +376,7 @@ static int hart_pmu_get_allowed_bits(void)
 ????????????????if (trap.cause)
 ????????????????????????return num_bits;
 ????????}
-???????num_bits += __fls(val) + 1;
+???????num_bits += __flsl(val) + 1;

?
?#endif
?

lib/sbi/sbi_hart.c +0 -0
@@ -439,7 +439,7 @@ static void hart_detect_features(struct
 sbi_scratch *scratch)

???????? */
????????val = hart_pmp_get_allowed_addr();
????????if (val) {
-???????????????hfeatures->pmp_gran =? 1 << (__ffs(val) + 2); +???????????????hfeatures->pmp_gran =? 1 << (__ffsl(val) + 2); ????????????????hfeatures->pmp_addr_bits = __fls(val) + 1; ????????????????/* Detect number of PMP regions. At least PMPADDR0 should be implemented*/ ????????????????__check_csr_64(CSR_PMPADDR0, 0, val, pmp_count, __pmp_skip);

lib/sbi/sbi_pmu.c +0 -0
index 5b845f8..5b191ab 100644
@@ -343,7 +343,7 @@ int sbi_pmu_ctr_start(unsigned long cbase,
 unsigned long cmask,
 ????????int ret = SBI_EINVAL;
 ????????bool bUpdate = FALSE;

?
-???????if (__fls(ctr_mask) >= total_ctrs) +???????if (__flsl(ctr_mask) >= total_ctrs) ????????????????return ret;
?
????????if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)

lib/sbi/sbi_pmu.c +0 -0
@@ -417,7 +417,7 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned
 long cmask,
 ????????uint32_t event_code;
 ????????unsigned long ctr_mask = cmask << cbase;

?
-???????if (__fls(ctr_mask) >= total_ctrs) +???????if (__flsl(ctr_mask) >= total_ctrs) ????????????????return SBI_EINVAL;
?
????????for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {

lib/sbi/sbi_pmu.c +0 -0
@@ -606,7 +606,7 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base,
 unsigned long cidx_mask,
 ????????unsigned long tmp = cidx_mask << cidx_base;

?
????????/* Do a basic sanity check of counter base & mask */ -???????if (__fls(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
+???????if (__flsl(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
????????????????return SBI_EINVAL;
?
????????if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {

lib/utils/timer/aclint_mtimer.c +1 -1
index 2532b63..d17d15f 100644
@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsigned long
 addr, unsigned long size)
 ????????while (pos < end) {
 ????????????????rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
 ????????????????if (rsize)
-???????????????????????rsize = 1UL << __ffs(pos);
+???????????????????????rsize = 1UL << __ffsl(pos);

????????????????else
????????????????????????rsize = ((end - pos) < MTIMER_ADD_REGION_ALIGN) ? ????????????????????????????????(end - pos) : MTIMER_ADD_REGION_ALIGN;

Signature · 1 line
2.32.0

A message that is not in the archive (sent off-list or not yet received): CAA5uK6Kg=pXn3h1NSV=HuYvLcnWuDy313XYTYmH=u5d2uFLbgw@mail.gmail.com

#3 lore raw

PATCH 1/1 lib: fix compilation when strings.h is included

Yes. I understand that, but sbi_bitops.h contains "static inline int fls(int x)" that goes in the conflict with strings.h if those two headers are included by opensbi user (application).
I've inspected the code and see that neither "fls()" nor "ffs()" are used in opensbi code, so maybe the alternative to solve the conflict would be to remove "fls()" and "ffs()" implementations from sbi_bitops.h.

Regards,
Petro

??, 25 ???. 2022 ?. ? 15:49 Xiang W <[email protected]> ????:

Quoted 245 lines

? 2022-01-24???? 14:22 +0200?Petro Karashchenko???

Quoted 3 lines

In a systems that provide strings.h and it is included together with sbi_bitops.h the compilation error appears. The ffs() and fls() are provided by strings.h

opensbi does not depend on the library provided by the system, nor does it refer to strings.h, so I don't think this modification is necessary

Regards,
Xiang W

Quoted 233 lines
---
 include/sbi/sbi_bitops.h        | 24 ++++++++++++------------
 lib/sbi/sbi_bitops.c            | 10 +++++-----
 lib/sbi/sbi_hart.c              |  6 +++---
 lib/sbi/sbi_pmu.c               |  6 +++---
 lib/utils/timer/aclint_mtimer.c |  2 +-
 5 files changed, 24 insertions(+), 24 deletions(-)
include/sbi/sbi_bitops.h +5 -5
index 879430d..92ea449 100644
@@ -37,14 +37,14 @@
        (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 -
 (h))))
 
 /**
- * ffs - Find first bit set
+ * __ffs - Find first bit set
  * @x: the word to search
  *
  * This is defined the same way as
  * the libc and compiler builtin ffs routines, therefore
  * differs in spirit from the above ffz (man ffs).
  */
-static inline int ffs(int x)
+static inline int __ffs(int x)
 {
        int r = 1;
@@ -72,12 +72,12 @@ static inline int ffs(int x)
 }
 
 /**
- * __ffs - find first bit in word.
+ * __ffsl - find first bit in word.
  * @word: The word to search
  *
  * Undefined if no bit exists, so code should check against 0 first.
  */
-static inline int __ffs(unsigned long word)
+static inline int __ffsl(unsigned long word)
 {
        int num = 0;
 
@@ -109,22 +109,22 @@ static inline int __ffs(unsigned long word)
 }
 
 /*
- * ffz - find first zero in word.
+ * __ffz - find first zero in word.
  * @word: The word to search
  *
  * Undefined if no zero exists, so code should check against ~0UL

first.
*/

include/sbi/sbi_bitops.h +6 -6
-#define ffz(x) __ffs(~(x))
+#define __ffz(x) __ffsl(~(x))
 
 /**
- * fls - find last (most-significant) bit set
+ * __fls - find last (most-significant) bit set
  * @x: the word to search
  *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ * 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(int x)
 {
        int r = 32;
@@ -152,12 +152,12 @@ static inline int fls(int x)
 }
 
 /**
- * __fls - find last (most-significant) set bit in a long word
+ * __flsl - 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.
*/

include/sbi/sbi_bitops.h +1 -1
-static inline unsigned long __fls(unsigned long word)
+static inline unsigned long __flsl(unsigned long word)
 {
        int num = BITS_PER_LONG - 1;
lib/sbi/sbi_bitops.c +1 -1
index de9d045..2e2860d 100644
@@ -39,7 +39,7 @@ unsigned long find_first_bit(const unsigned long
 *addr,
        if (tmp == 0UL)         /* Are any bits set? */
                return result + size;   /* Nope. */
 found:
-       return result + __ffs(tmp);
+       return result + __ffsl(tmp);
 }
 

/**

lib/sbi/sbi_bitops.c +1 -1
@@ -69,7 +69,7 @@ unsigned long find_first_zero_bit(const unsigned
 long *addr,
        if (tmp == ~0UL)        /* Are any bits zero? */
                return result + size;   /* Nope. */
 found:
-       return result + ffz(tmp);
+       return result + __ffz(tmp);
 }
 

/**

lib/sbi/sbi_bitops.c +3 -3
@@ -100,7 +100,7 @@ unsigned long find_last_bit(const unsigned long
 *addr,
                tmp = addr[--words];
                if (tmp) {
 found:
-                       return words * BITS_PER_LONG + __fls(tmp);
+                       return words * BITS_PER_LONG + __flsl(tmp);
                }
        }
@@ -150,7 +150,7 @@ found_first:
        if (tmp == 0UL)         /* Are any bits set? */
                return result + size;   /* Nope. */
 found_middle:
-       return result + __ffs(tmp);
+       return result + __ffsl(tmp);
 }
 
 /**
@@ -196,5 +196,5 @@ found_first:
        if (tmp == ~0UL)        /* Are any bits zero? */
                return result + size;   /* Nope. */
 found_middle:
-       return result + ffz(tmp);
+       return result + __ffz(tmp);
 }
lib/sbi/sbi_hart.c +3 -3
index d9a15d9..5ac7d80 100644
@@ -368,7 +368,7 @@ static int hart_pmu_get_allowed_bits(void)
                if (trap.cause)
                        return 0;
        }
-       num_bits = __fls(val) + 1;
+       num_bits = __flsl(val) + 1;
 #if __riscv_xlen == 32
        csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val);
        if (!trap.cause) {
@@ -376,7 +376,7 @@ static int hart_pmu_get_allowed_bits(void)
                if (trap.cause)
                        return num_bits;
        }
-       num_bits += __fls(val) + 1;
+       num_bits += __flsl(val) + 1;
 
 #endif
 
@@ -439,7 +439,7 @@ static void hart_detect_features(struct
 sbi_scratch *scratch)
         */
        val = hart_pmp_get_allowed_addr();
        if (val) {
-               hfeatures->pmp_gran =  1 << (__ffs(val) + 2);
+               hfeatures->pmp_gran =  1 << (__ffsl(val) + 2);
                hfeatures->pmp_addr_bits = __fls(val) + 1;
                /* Detect number of PMP regions. At least PMPADDR0

should be implemented*/

                __check_csr_64(CSR_PMPADDR0, 0, val, pmp_count,

__pmp_skip);

lib/sbi/sbi_pmu.c +1 -1
index 5b845f8..5b191ab 100644
@@ -343,7 +343,7 @@ int sbi_pmu_ctr_start(unsigned long cbase,
 unsigned long cmask,
        int ret = SBI_EINVAL;
        bool bUpdate = FALSE;
 
-       if (__fls(ctr_mask) >= total_ctrs)
+       if (__flsl(ctr_mask) >= total_ctrs)
                return ret;
 

if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)

lib/sbi/sbi_pmu.c +1 -1
@@ -417,7 +417,7 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned
 long cmask,
        uint32_t event_code;
        unsigned long ctr_mask = cmask << cbase;
 
-       if (__fls(ctr_mask) >= total_ctrs)
+       if (__flsl(ctr_mask) >= total_ctrs)
                return SBI_EINVAL;
 
        for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {
lib/sbi/sbi_pmu.c +1 -1
@@ -606,7 +606,7 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base,
 unsigned long cidx_mask,
        unsigned long tmp = cidx_mask << cidx_base;
 
        /* Do a basic sanity check of counter base & mask */
-       if (__fls(tmp) >= total_ctrs || event_type >=
 SBI_PMU_EVENT_TYPE_MAX)
+       if (__flsl(tmp) >= total_ctrs || event_type >=
 SBI_PMU_EVENT_TYPE_MAX)
                return SBI_EINVAL;

        if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {
lib/utils/timer/aclint_mtimer.c +1 -1
index 2532b63..d17d15f 100644
@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsigned long
 addr, unsigned long size)
        while (pos < end) {
                rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
                if (rsize)
-                       rsize = 1UL << __ffs(pos);
+                       rsize = 1UL << __ffsl(pos);
                else
                        rsize = ((end - pos) <

MTIMER_ADD_REGION_ALIGN) ?

                                (end - pos) : MTIMER_ADD_REGION_ALIGN;

--
2.32.0

#4 lore raw

PATCH 1/1 lib: fix compilation when strings.h is included

In reply to a message not in the archive

? 2022-01-25???? 16:07 +0200?Petro Karashchenko???

Quoted 8 lines

Yes. I understand that, but sbi_bitops.h contains "static inline int fls(int x)" that goes in the conflict with strings.h if those two headers are included by opensbi user (application).
I've inspected the code and see that neither "fls()" nor "ffs()" are used in opensbi code, so maybe the alternative to solve the conflict would be to remove "fls()" and "ffs()" implementations from sbi_bitops.h.

Thanks for your explanation

Regards?
Xiang W

Quoted 258 lines

Regards,
Petro

??, 25 ???. 2022 ?. ? 15:49 Xiang W <[email protected]> ????:

Quoted 254 lines

? 2022-01-24???? 14:22 +0200?Petro Karashchenko???

Quoted 3 lines

In a systems that provide strings.h and it is included together with sbi_bitops.h the compilation error appears. The ffs() and fls() are provided by strings.h

opensbi does not depend on the library provided by the system, nor does
it refer to strings.h, so I don't think this modification is necessary

Regards,
Xiang W

Quoted 15 lines

---

?include/sbi/sbi_bitops.h??????? | 24 ++++++++++++------------
?lib/sbi/sbi_bitops.c??????????? | 10 +++++-----
?lib/sbi/sbi_hart.c????????????? |? 6 +++---
?lib/sbi/sbi_pmu.c?????????????? |? 6 +++---
?lib/utils/timer/aclint_mtimer.c |? 2 +-

?5 files changed, 24 insertions(+), 24 deletions(-)

include/sbi/sbi_bitops.h +0 -0
index 879430d..92ea449 100644
@@ -37,14 +37,14 @@
Quoted 1 line

????????(((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1

-

Quoted 18 lines

(h))))
?
?/**
- * ffs - Find first bit set
+ * __ffs - Find first bit set
? * @x: the word to search
? *
? * This is defined the same way as
? * the libc and compiler builtin ffs routines, therefore ? * differs in spirit from the above ffz (man ffs). ? */

include/sbi/sbi_bitops.h +1 -1
-static inline int ffs(int x)
+static inline int __ffs(int x)

?{
????????int r = 1;
?

include/sbi/sbi_bitops.h +0 -0
@@ -72,12 +72,12 @@ static inline int ffs(int x)
 ?}
Quoted 7 lines

?
?/**
- * __ffs - find first bit in word.
+ * __ffsl - find first bit in word.
? * @word: The word to search
? *
? * Undefined if no bit exists, so code should check against 0

first.

lib/sbi/sbi_bitops.c unsigned long find_last_bit(const unsigned

Quoted 77 lines

? */

include/sbi/sbi_bitops.h +1 -1
-static inline int __ffs(unsigned long word)
+static inline int __ffsl(unsigned long word)

?{
????????int num = 0;
?

include/sbi/sbi_bitops.h +0 -0
@@ -109,22 +109,22 @@ static inline int __ffs(unsigned long word)
 ?}

?
?/*
- * ffz - find first zero in word.
+ * __ffz - find first zero in word.
? * @word: The word to search
? *
? * Undefined if no zero exists, so code should check against ~0UL first.
? */

include/sbi/sbi_bitops.h +1 -1
-#define ffz(x) __ffs(~(x))
+#define __ffz(x) __ffsl(~(x))

?
?/**
- * fls - find last (most-significant) bit set
+ * __fls - find last (most-significant) bit set
? * @x: the word to search
? *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ * This is defined the same way as __ffs.
+ * Note __fls(0) = 0, __fls(1) = 1, __fls(0x80000000) = 32. ? */
?

include/sbi/sbi_bitops.h +1 -1
-static inline int fls(int x)
+static inline int __fls(int x)

?{
????????int r = 32;
?

include/sbi/sbi_bitops.h +0 -0
@@ -152,12 +152,12 @@ static inline int fls(int x)
 ?}

?
?/**
- * __fls - find last (most-significant) set bit in a long word
+ * __flsl - 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.
? */

include/sbi/sbi_bitops.h +1 -1
-static inline unsigned long __fls(unsigned long word)
+static inline unsigned long __flsl(unsigned long word)

?{
????????int num = BITS_PER_LONG - 1;
?

lib/sbi/sbi_bitops.c +0 -0
index de9d045..2e2860d 100644
@@ -39,7 +39,7 @@ unsigned long find_first_bit(const unsigned long
 *addr,

????????if (tmp == 0UL)?????????/* Are any bits set? */ ????????????????return result + size;???/* Nope. */ ?found:
-???????return result + __ffs(tmp); +???????return result + __ffsl(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -69,7 +69,7 @@ unsigned long find_first_zero_bit(const unsigned
 long *addr,

????????if (tmp == ~0UL)????????/* Are any bits zero? */ ????????????????return result + size;???/* Nope. */ ?found:
-???????return result + ffz(tmp); +???????return result + __ffz(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -100,7 +100,7 @@ unsigned long find_last_bit(const unsigned

long

Quoted 6 lines
lib/sbi/sbi_bitops.c +0 -0
 *addr,
 ????????????????tmp = addr[--words];
 ????????????????if (tmp) {

?found:
-???????????????????????return words * BITS_PER_LONG + __fls(tmp); +???????????????????????return words * BITS_PER_LONG +

__flsl(tmp);

lib/sbi/sbi_pmu.c int sbi_pmu_ctr_stop(unsigned long cbase,

Quoted 68 lines

????????????????}
????????}
?

lib/sbi/sbi_bitops.c +0 -0
@@ -150,7 +150,7 @@ found_first:

????????if (tmp == 0UL)?????????/* Are any bits set? */ ????????????????return result + size;???/* Nope. */ ?found_middle:
-???????return result + __ffs(tmp); +???????return result + __ffsl(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -196,5 +196,5 @@ found_first:

????????if (tmp == ~0UL)????????/* Are any bits zero? */ ????????????????return result + size;???/* Nope. */ ?found_middle:
-???????return result + ffz(tmp); +???????return result + __ffz(tmp);
?}

lib/sbi/sbi_hart.c +1 -1
index d9a15d9..5ac7d80 100644
@@ -368,7 +368,7 @@ static int hart_pmu_get_allowed_bits(void)
 ????????????????if (trap.cause)
 ????????????????????????return 0;
 ????????}
-???????num_bits = __fls(val) + 1;
+???????num_bits = __flsl(val) + 1;

?#if __riscv_xlen == 32 ????????csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val); ????????if (!trap.cause) {

lib/sbi/sbi_hart.c +1 -1
@@ -376,7 +376,7 @@ static int hart_pmu_get_allowed_bits(void)
 ????????????????if (trap.cause)
 ????????????????????????return num_bits;
 ????????}
-???????num_bits += __fls(val) + 1;
+???????num_bits += __flsl(val) + 1;

?
?#endif
?

lib/sbi/sbi_hart.c +0 -0
@@ -439,7 +439,7 @@ static void hart_detect_features(struct
 sbi_scratch *scratch)

???????? */
????????val = hart_pmp_get_allowed_addr();
????????if (val) {
-???????????????hfeatures->pmp_gran =? 1 << (__ffs(val) + 2); +???????????????hfeatures->pmp_gran =? 1 << (__ffsl(val) + 2); ????????????????hfeatures->pmp_addr_bits = __fls(val) + 1; ????????????????/* Detect number of PMP regions. At least PMPADDR0 should be implemented*/ ????????????????__check_csr_64(CSR_PMPADDR0, 0, val, pmp_count, __pmp_skip);

lib/sbi/sbi_pmu.c +0 -0
index 5b845f8..5b191ab 100644
@@ -343,7 +343,7 @@ int sbi_pmu_ctr_start(unsigned long cbase,
 unsigned long cmask,
 ????????int ret = SBI_EINVAL;
 ????????bool bUpdate = FALSE;

?
-???????if (__fls(ctr_mask) >= total_ctrs) +???????if (__flsl(ctr_mask) >= total_ctrs) ????????????????return ret;
?
????????if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)

lib/sbi/sbi_pmu.c +0 -0
@@ -417,7 +417,7 @@ int sbi_pmu_ctr_stop(unsigned long cbase,

unsigned

lib/sbi/sbi_pmu.c int sbi_pmu_ctr_cfg_match(unsigned long

Quoted 10 lines
lib/sbi/sbi_pmu.c +0 -0
 long cmask,
 ????????uint32_t event_code;
 ????????unsigned long ctr_mask = cmask << cbase;

?
-???????if (__fls(ctr_mask) >= total_ctrs) +???????if (__flsl(ctr_mask) >= total_ctrs) ????????????????return SBI_EINVAL;
?
????????for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {

lib/sbi/sbi_pmu.c +0 -0
@@ -606,7 +606,7 @@ int sbi_pmu_ctr_cfg_match(unsigned long

cidx_base,

lib/utils/timer/aclint_mtimer.c static int aclint_mtimer_add_regions(unsigned

Quoted 17 lines
lib/sbi/sbi_pmu.c +0 -0
 unsigned long cidx_mask,
 ????????unsigned long tmp = cidx_mask << cidx_base;

?
????????/* Do a basic sanity check of counter base & mask */ -???????if (__fls(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
+???????if (__flsl(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
????????????????return SBI_EINVAL;
?
????????if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {

lib/utils/timer/aclint_mtimer.c +0 -0
index 2532b63..d17d15f 100644
@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsigned

long

Quoted 10 lines
lib/utils/timer/aclint_mtimer.c +1 -1
 addr, unsigned long size)
 ????????while (pos < end) {
 ????????????????rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
 ????????????????if (rsize)
-???????????????????????rsize = 1UL << __ffs(pos);
+???????????????????????rsize = 1UL << __ffsl(pos);

????????????????else
????????????????????????rsize = ((end - pos) <
MTIMER_ADD_REGION_ALIGN) ?
????????????????????????????????(end - pos) :

MTIMER_ADD_REGION_ALIGN;

Quoted 4 lines
Signature · 1 line
2.32.0
#5 lore raw

PATCH 1/1 lib: fix compilation when strings.h is included

In reply to Petro Karashchenko

? 2022-01-24???? 14:22 +0200?Petro Karashchenko???

Quoted 5 lines

In a systems that provide strings.h and it is included together with sbi_bitops.h the compilation error appears. The ffs() and fls() are provided by strings.h

look good to me.

Quoted 231 lines

---

?include/sbi/sbi_bitops.h??????? | 24 ++++++++++++------------
?lib/sbi/sbi_bitops.c??????????? | 10 +++++-----
?lib/sbi/sbi_hart.c????????????? |? 6 +++---
?lib/sbi/sbi_pmu.c?????????????? |? 6 +++---
?lib/utils/timer/aclint_mtimer.c |? 2 +-

?5 files changed, 24 insertions(+), 24 deletions(-)

include/sbi/sbi_bitops.h +0 -0
index 879430d..92ea449 100644
@@ -37,14 +37,14 @@

????????(((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
?
?/**
- * ffs - Find first bit set
+ * __ffs - Find first bit set
? * @x: the word to search
? *
? * This is defined the same way as
? * the libc and compiler builtin ffs routines, therefore ? * differs in spirit from the above ffz (man ffs).
? */

include/sbi/sbi_bitops.h +1 -1
-static inline int ffs(int x)
+static inline int __ffs(int x)

?{
????????int r = 1;
?

include/sbi/sbi_bitops.h +0 -0
@@ -72,12 +72,12 @@ static inline int ffs(int x)
 ?}

?
?/**
- * __ffs - find first bit in word.
+ * __ffsl - find first bit in word.
? * @word: The word to search
? *
? * Undefined if no bit exists, so code should check against 0 first. ? */

include/sbi/sbi_bitops.h +1 -1
-static inline int __ffs(unsigned long word)
+static inline int __ffsl(unsigned long word)

?{
????????int num = 0;
?

include/sbi/sbi_bitops.h +0 -0
@@ -109,22 +109,22 @@ static inline int __ffs(unsigned long word)
 ?}

?
?/*
- * ffz - find first zero in word.
+ * __ffz - find first zero in word.
? * @word: The word to search
? *
? * Undefined if no zero exists, so code should check against ~0UL first.
? */

include/sbi/sbi_bitops.h +1 -1
-#define ffz(x) __ffs(~(x))
+#define __ffz(x) __ffsl(~(x))

?
?/**
- * fls - find last (most-significant) bit set
+ * __fls - find last (most-significant) bit set
? * @x: the word to search
? *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ * This is defined the same way as __ffs.
+ * Note __fls(0) = 0, __fls(1) = 1, __fls(0x80000000) = 32. ? */
?

include/sbi/sbi_bitops.h +1 -1
-static inline int fls(int x)
+static inline int __fls(int x)

?{
????????int r = 32;
?

include/sbi/sbi_bitops.h +0 -0
@@ -152,12 +152,12 @@ static inline int fls(int x)
 ?}

?
?/**
- * __fls - find last (most-significant) set bit in a long word
+ * __flsl - 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.
? */

include/sbi/sbi_bitops.h +1 -1
-static inline unsigned long __fls(unsigned long word)
+static inline unsigned long __flsl(unsigned long word)

?{
????????int num = BITS_PER_LONG - 1;
?

lib/sbi/sbi_bitops.c +0 -0
index de9d045..2e2860d 100644
@@ -39,7 +39,7 @@ unsigned long find_first_bit(const unsigned long
 *addr,

????????if (tmp == 0UL)?????????/* Are any bits set? */ ????????????????return result + size;???/* Nope. */ ?found:
-???????return result + __ffs(tmp); +???????return result + __ffsl(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -69,7 +69,7 @@ unsigned long find_first_zero_bit(const unsigned
 long *addr,

????????if (tmp == ~0UL)????????/* Are any bits zero? */ ????????????????return result + size;???/* Nope. */ ?found:
-???????return result + ffz(tmp); +???????return result + __ffz(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -100,7 +100,7 @@ unsigned long find_last_bit(const unsigned long
 *addr,
 ????????????????tmp = addr[--words];
 ????????????????if (tmp) {

?found:
-???????????????????????return words * BITS_PER_LONG + __fls(tmp); +???????????????????????return words * BITS_PER_LONG + __flsl(tmp); ????????????????}
????????}
?

lib/sbi/sbi_bitops.c +0 -0
@@ -150,7 +150,7 @@ found_first:

????????if (tmp == 0UL)?????????/* Are any bits set? */ ????????????????return result + size;???/* Nope. */ ?found_middle:
-???????return result + __ffs(tmp); +???????return result + __ffsl(tmp);
?}
?
?/**

lib/sbi/sbi_bitops.c +0 -0
@@ -196,5 +196,5 @@ found_first:

????????if (tmp == ~0UL)????????/* Are any bits zero? */ ????????????????return result + size;???/* Nope. */ ?found_middle:
-???????return result + ffz(tmp); +???????return result + __ffz(tmp);
?}

lib/sbi/sbi_hart.c +1 -1
index d9a15d9..5ac7d80 100644
@@ -368,7 +368,7 @@ static int hart_pmu_get_allowed_bits(void)
 ????????????????if (trap.cause)
 ????????????????????????return 0;
 ????????}
-???????num_bits = __fls(val) + 1;
+???????num_bits = __flsl(val) + 1;

?#if __riscv_xlen == 32 ????????csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val); ????????if (!trap.cause) {

lib/sbi/sbi_hart.c +1 -1
@@ -376,7 +376,7 @@ static int hart_pmu_get_allowed_bits(void)
 ????????????????if (trap.cause)
 ????????????????????????return num_bits;
 ????????}
-???????num_bits += __fls(val) + 1;
+???????num_bits += __flsl(val) + 1;

?
?#endif
?

lib/sbi/sbi_hart.c +0 -0
@@ -439,7 +439,7 @@ static void hart_detect_features(struct
 sbi_scratch *scratch)

???????? */
????????val = hart_pmp_get_allowed_addr();
????????if (val) {
-???????????????hfeatures->pmp_gran =? 1 << (__ffs(val) + 2); +???????????????hfeatures->pmp_gran =? 1 << (__ffsl(val) + 2); ????????????????hfeatures->pmp_addr_bits = __fls(val) + 1; ????????????????/* Detect number of PMP regions. At least PMPADDR0 should be implemented*/ ????????????????__check_csr_64(CSR_PMPADDR0, 0, val, pmp_count, __pmp_skip);

lib/sbi/sbi_pmu.c +0 -0
index 5b845f8..5b191ab 100644
@@ -343,7 +343,7 @@ int sbi_pmu_ctr_start(unsigned long cbase,
 unsigned long cmask,
 ????????int ret = SBI_EINVAL;
 ????????bool bUpdate = FALSE;

?
-???????if (__fls(ctr_mask) >= total_ctrs) +???????if (__flsl(ctr_mask) >= total_ctrs) ????????????????return ret;
?
????????if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)

lib/sbi/sbi_pmu.c +0 -0
@@ -417,7 +417,7 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned
 long cmask,
 ????????uint32_t event_code;
 ????????unsigned long ctr_mask = cmask << cbase;

?
-???????if (__fls(ctr_mask) >= total_ctrs) +???????if (__flsl(ctr_mask) >= total_ctrs) ????????????????return SBI_EINVAL;
?
????????for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {

lib/sbi/sbi_pmu.c +0 -0
@@ -606,7 +606,7 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base,
 unsigned long cidx_mask,
 ????????unsigned long tmp = cidx_mask << cidx_base;

?
????????/* Do a basic sanity check of counter base & mask */ -???????if (__fls(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
+???????if (__flsl(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
????????????????return SBI_EINVAL;
?
????????if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {

lib/utils/timer/aclint_mtimer.c +1 -1
index 2532b63..d17d15f 100644
@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsigned long
 addr, unsigned long size)
 ????????while (pos < end) {
 ????????????????rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
 ????????????????if (rsize)
-???????????????????????rsize = 1UL << __ffs(pos);
+???????????????????????rsize = 1UL << __ffsl(pos);

????????????????else
????????????????????????rsize = ((end - pos) < MTIMER_ADD_REGION_ALIGN) ? ????????????????????????????????(end - pos) : MTIMER_ADD_REGION_ALIGN;

Signature · 1 line
2.32.0
#6 lore raw

PATCH 1/1 lib: fix compilation when strings.h is included

Quoted 26 lines · Xiang W

? 2022-01-24???? 14:22 +0200?Petro Karashchenko???

Quoted 5 lines

In a systems that provide strings.h and it is included together with sbi_bitops.h the compilation error appears. The ffs() and fls() are provided by strings.h

look good to me.

Quoted 16 lines
---
 include/sbi/sbi_bitops.h        | 24 ++++++++++++------------
 lib/sbi/sbi_bitops.c            | 10 +++++-----
 lib/sbi/sbi_hart.c              |  6 +++---
 lib/sbi/sbi_pmu.c               |  6 +++---
 lib/utils/timer/aclint_mtimer.c |  2 +-
 5 files changed, 24 insertions(+), 24 deletions(-)
include/sbi/sbi_bitops.h +0 -0
index 879430d..92ea449 100644
@@ -37,14 +37,14 @@
        (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 -
 (h))))
 
Quoted 11 lines

include/sbi/sbi_bitops.h line 47

Quoted 11 lines
include/sbi/sbi_bitops.h +2 -2
 /**
- * ffs - Find first bit set
+ * __ffs - Find first bit set
  * @x: the word to search
  *
  * This is defined the same way as
  * the libc and compiler builtin ffs routines, therefore
  * differs in spirit from the above ffz (man ffs).
  */
-static inline int ffs(int x)
+static inline int __ffs(int x)

Double-underscore identifiers are reserved for the C implementation. For building OpenSBI firmware itself that?s fine as it?s all bare-metal with no external libc, but for external consumers this potentially treads on the namespace used by their libc. Why not use sbi_foo instead like we do for other functions?

Jess

Quoted 211 lines
Quoted 204 lines
include/sbi/sbi_bitops.h +3 -3
 {
        int r = 1;
@@ -72,12 +72,12 @@ static inline int ffs(int x)
 }
 
 /**
- * __ffs - find first bit in word.
+ * __ffsl - find first bit in word.
  * @word: The word to search
  *
  * Undefined if no bit exists, so code should check against 0 first.
  */
-static inline int __ffs(unsigned long word)
+static inline int __ffsl(unsigned long word)
 {
        int num = 0;
 
@@ -109,22 +109,22 @@ static inline int __ffs(unsigned long word)
 }
 
 /*
- * ffz - find first zero in word.
+ * __ffz - find first zero in word.
  * @word: The word to search
  *
  * Undefined if no zero exists, so code should check against ~0UL

first.
*/

include/sbi/sbi_bitops.h +6 -6
-#define ffz(x) __ffs(~(x))
+#define __ffz(x) __ffsl(~(x))
 
 /**
- * fls - find last (most-significant) bit set
+ * __fls - find last (most-significant) bit set
  * @x: the word to search
  *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ * 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(int x)
 {
        int r = 32;
@@ -152,12 +152,12 @@ static inline int fls(int x)
 }
 
 /**
- * __fls - find last (most-significant) set bit in a long word
+ * __flsl - 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.
*/

include/sbi/sbi_bitops.h +1 -1
-static inline unsigned long __fls(unsigned long word)
+static inline unsigned long __flsl(unsigned long word)
 {
        int num = BITS_PER_LONG - 1;
lib/sbi/sbi_bitops.c +1 -1
index de9d045..2e2860d 100644
@@ -39,7 +39,7 @@ unsigned long find_first_bit(const unsigned long
 *addr,
        if (tmp == 0UL)         /* Are any bits set? */
                return result + size;   /* Nope. */
 found:
-       return result + __ffs(tmp);
+       return result + __ffsl(tmp);
 }
 

/**

lib/sbi/sbi_bitops.c +1 -1
@@ -69,7 +69,7 @@ unsigned long find_first_zero_bit(const unsigned
 long *addr,
        if (tmp == ~0UL)        /* Are any bits zero? */
                return result + size;   /* Nope. */
 found:
-       return result + ffz(tmp);
+       return result + __ffz(tmp);
 }
 

/**

lib/sbi/sbi_bitops.c +3 -3
@@ -100,7 +100,7 @@ unsigned long find_last_bit(const unsigned long
 *addr,
                tmp = addr[--words];
                if (tmp) {
 found:
-                       return words * BITS_PER_LONG + __fls(tmp);
+                       return words * BITS_PER_LONG + __flsl(tmp);
                }
        }
@@ -150,7 +150,7 @@ found_first:
        if (tmp == 0UL)         /* Are any bits set? */
                return result + size;   /* Nope. */
 found_middle:
-       return result + __ffs(tmp);
+       return result + __ffsl(tmp);
 }
 
 /**
@@ -196,5 +196,5 @@ found_first:
        if (tmp == ~0UL)        /* Are any bits zero? */
                return result + size;   /* Nope. */
 found_middle:
-       return result + ffz(tmp);
+       return result + __ffz(tmp);
 }
lib/sbi/sbi_hart.c +3 -3
index d9a15d9..5ac7d80 100644
@@ -368,7 +368,7 @@ static int hart_pmu_get_allowed_bits(void)
                if (trap.cause)
                        return 0;
        }
-       num_bits = __fls(val) + 1;
+       num_bits = __flsl(val) + 1;
 #if __riscv_xlen == 32
        csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val);
        if (!trap.cause) {
@@ -376,7 +376,7 @@ static int hart_pmu_get_allowed_bits(void)
                if (trap.cause)
                        return num_bits;
        }
-       num_bits += __fls(val) + 1;
+       num_bits += __flsl(val) + 1;
 
 #endif
 
@@ -439,7 +439,7 @@ static void hart_detect_features(struct
 sbi_scratch *scratch)
         */
        val = hart_pmp_get_allowed_addr();
        if (val) {
-               hfeatures->pmp_gran =  1 << (__ffs(val) + 2);
+               hfeatures->pmp_gran =  1 << (__ffsl(val) + 2);
                hfeatures->pmp_addr_bits = __fls(val) + 1;
                /* Detect number of PMP regions. At least PMPADDR0

should be implemented*/

                __check_csr_64(CSR_PMPADDR0, 0, val, pmp_count,

__pmp_skip);

lib/sbi/sbi_pmu.c +1 -1
index 5b845f8..5b191ab 100644
@@ -343,7 +343,7 @@ int sbi_pmu_ctr_start(unsigned long cbase,
 unsigned long cmask,
        int ret = SBI_EINVAL;
        bool bUpdate = FALSE;
 
-       if (__fls(ctr_mask) >= total_ctrs)
+       if (__flsl(ctr_mask) >= total_ctrs)
                return ret;
 

if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)

lib/sbi/sbi_pmu.c +1 -1
@@ -417,7 +417,7 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned
 long cmask,
        uint32_t event_code;
        unsigned long ctr_mask = cmask << cbase;
 
-       if (__fls(ctr_mask) >= total_ctrs)
+       if (__flsl(ctr_mask) >= total_ctrs)
                return SBI_EINVAL;
 
        for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {
lib/sbi/sbi_pmu.c +1 -1
@@ -606,7 +606,7 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base,
 unsigned long cidx_mask,
        unsigned long tmp = cidx_mask << cidx_base;
 
        /* Do a basic sanity check of counter base & mask */
-       if (__fls(tmp) >= total_ctrs || event_type >=
 SBI_PMU_EVENT_TYPE_MAX)
+       if (__flsl(tmp) >= total_ctrs || event_type >=
 SBI_PMU_EVENT_TYPE_MAX)
                return SBI_EINVAL;
 
        if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {
lib/utils/timer/aclint_mtimer.c +1 -1
index 2532b63..d17d15f 100644
@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsigned long
 addr, unsigned long size)
        while (pos < end) {
                rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
                if (rsize)
-                       rsize = 1UL << __ffs(pos);
+                       rsize = 1UL << __ffsl(pos);
                else
                        rsize = ((end - pos) <

MTIMER_ADD_REGION_ALIGN) ?

                                (end - pos) : MTIMER_ADD_REGION_ALIGN;
Signature · 1 line
2.32.0
Signature · 3 lines
opensbi mailing list
opensbi at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/opensbi
#7 lore raw

PATCH 1/1 lib: fix compilation when strings.h is included

Quoted 37 lines · Jessica Clarke
Quoted 35 lines · Xiang W

? 2022-01-24???? 14:22 +0200?Petro Karashchenko???

Quoted 5 lines

In a systems that provide strings.h and it is included together with sbi_bitops.h the compilation error appears. The ffs() and fls() are provided by strings.h

look good to me.

Quoted 25 lines
---
 include/sbi/sbi_bitops.h        | 24 ++++++++++++------------
 lib/sbi/sbi_bitops.c            | 10 +++++-----
 lib/sbi/sbi_hart.c              |  6 +++---
 lib/sbi/sbi_pmu.c               |  6 +++---
 lib/utils/timer/aclint_mtimer.c |  2 +-
 5 files changed, 24 insertions(+), 24 deletions(-)
include/sbi/sbi_bitops.h +1 -1
index 879430d..92ea449 100644
@@ -37,14 +37,14 @@
        (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 -
 (h))))
 
 /**
- * ffs - Find first bit set
+ * __ffs - Find first bit set
  * @x: the word to search
  *
  * This is defined the same way as
  * the libc and compiler builtin ffs routines, therefore
  * differs in spirit from the above ffz (man ffs).
  */
Quoted 8 lines
Quoted 2 lines

include/sbi/sbi_bitops.h line 47

Quoted 2 lines
include/sbi/sbi_bitops.h +1 -1
-static inline int ffs(int x)
+static inline int __ffs(int x)

Double-underscore identifiers are reserved for the C implementation. For building OpenSBI firmware itself that?s fine as it?s all bare-metal with no external libc, but for external consumers this potentially treads on the namespace used by their libc. Why not use sbi_foo instead like we do for other functions?

I agree we should use "sbi_" prefix instead of "__".

Regards,
Anup

Quoted 220 lines

Jess

Quoted 203 lines
Quoted 203 lines
include/sbi/sbi_bitops.h +3 -3
 {
        int r = 1;
@@ -72,12 +72,12 @@ static inline int ffs(int x)
 }
 
 /**
- * __ffs - find first bit in word.
+ * __ffsl - find first bit in word.
  * @word: The word to search
  *
  * Undefined if no bit exists, so code should check against 0 first.
  */
-static inline int __ffs(unsigned long word)
+static inline int __ffsl(unsigned long word)
 {
        int num = 0;
 
@@ -109,22 +109,22 @@ static inline int __ffs(unsigned long word)
 }
 
 /*
- * ffz - find first zero in word.
+ * __ffz - find first zero in word.
  * @word: The word to search
  *
  * Undefined if no zero exists, so code should check against ~0UL

first.
*/

include/sbi/sbi_bitops.h +6 -6
-#define ffz(x) __ffs(~(x))
+#define __ffz(x) __ffsl(~(x))
 
 /**
- * fls - find last (most-significant) bit set
+ * __fls - find last (most-significant) bit set
  * @x: the word to search
  *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ * 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(int x)
 {
        int r = 32;
@@ -152,12 +152,12 @@ static inline int fls(int x)
 }
 
 /**
- * __fls - find last (most-significant) set bit in a long word
+ * __flsl - 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.
*/

include/sbi/sbi_bitops.h +1 -1
-static inline unsigned long __fls(unsigned long word)
+static inline unsigned long __flsl(unsigned long word)
 {
        int num = BITS_PER_LONG - 1;
lib/sbi/sbi_bitops.c +1 -1
index de9d045..2e2860d 100644
@@ -39,7 +39,7 @@ unsigned long find_first_bit(const unsigned long
 *addr,
        if (tmp == 0UL)         /* Are any bits set? */
                return result + size;   /* Nope. */
 found:
-       return result + __ffs(tmp);
+       return result + __ffsl(tmp);
 }
 

/**

lib/sbi/sbi_bitops.c +1 -1
@@ -69,7 +69,7 @@ unsigned long find_first_zero_bit(const unsigned
 long *addr,
        if (tmp == ~0UL)        /* Are any bits zero? */
                return result + size;   /* Nope. */
 found:
-       return result + ffz(tmp);
+       return result + __ffz(tmp);
 }
 

/**

lib/sbi/sbi_bitops.c +3 -3
@@ -100,7 +100,7 @@ unsigned long find_last_bit(const unsigned long
 *addr,
                tmp = addr[--words];
                if (tmp) {
 found:
-                       return words * BITS_PER_LONG + __fls(tmp);
+                       return words * BITS_PER_LONG + __flsl(tmp);
                }
        }
@@ -150,7 +150,7 @@ found_first:
        if (tmp == 0UL)         /* Are any bits set? */
                return result + size;   /* Nope. */
 found_middle:
-       return result + __ffs(tmp);
+       return result + __ffsl(tmp);
 }
 
 /**
@@ -196,5 +196,5 @@ found_first:
        if (tmp == ~0UL)        /* Are any bits zero? */
                return result + size;   /* Nope. */
 found_middle:
-       return result + ffz(tmp);
+       return result + __ffz(tmp);
 }
lib/sbi/sbi_hart.c +3 -3
index d9a15d9..5ac7d80 100644
@@ -368,7 +368,7 @@ static int hart_pmu_get_allowed_bits(void)
                if (trap.cause)
                        return 0;
        }
-       num_bits = __fls(val) + 1;
+       num_bits = __flsl(val) + 1;
 #if __riscv_xlen == 32
        csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val);
        if (!trap.cause) {
@@ -376,7 +376,7 @@ static int hart_pmu_get_allowed_bits(void)
                if (trap.cause)
                        return num_bits;
        }
-       num_bits += __fls(val) + 1;
+       num_bits += __flsl(val) + 1;
 
 #endif
 
@@ -439,7 +439,7 @@ static void hart_detect_features(struct
 sbi_scratch *scratch)
         */
        val = hart_pmp_get_allowed_addr();
        if (val) {
-               hfeatures->pmp_gran =  1 << (__ffs(val) + 2);
+               hfeatures->pmp_gran =  1 << (__ffsl(val) + 2);
                hfeatures->pmp_addr_bits = __fls(val) + 1;
                /* Detect number of PMP regions. At least PMPADDR0

should be implemented*/

                __check_csr_64(CSR_PMPADDR0, 0, val, pmp_count,

__pmp_skip);

lib/sbi/sbi_pmu.c +1 -1
index 5b845f8..5b191ab 100644
@@ -343,7 +343,7 @@ int sbi_pmu_ctr_start(unsigned long cbase,
 unsigned long cmask,
        int ret = SBI_EINVAL;
        bool bUpdate = FALSE;
 
-       if (__fls(ctr_mask) >= total_ctrs)
+       if (__flsl(ctr_mask) >= total_ctrs)
                return ret;
 

if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)

lib/sbi/sbi_pmu.c +1 -1
@@ -417,7 +417,7 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned
 long cmask,
        uint32_t event_code;
        unsigned long ctr_mask = cmask << cbase;
 
-       if (__fls(ctr_mask) >= total_ctrs)
+       if (__flsl(ctr_mask) >= total_ctrs)
                return SBI_EINVAL;
 
        for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {
lib/sbi/sbi_pmu.c +1 -1
@@ -606,7 +606,7 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base,
 unsigned long cidx_mask,
        unsigned long tmp = cidx_mask << cidx_base;
 
        /* Do a basic sanity check of counter base & mask */
-       if (__fls(tmp) >= total_ctrs || event_type >=
 SBI_PMU_EVENT_TYPE_MAX)
+       if (__flsl(tmp) >= total_ctrs || event_type >=
 SBI_PMU_EVENT_TYPE_MAX)
                return SBI_EINVAL;

        if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {
lib/utils/timer/aclint_mtimer.c +1 -1
index 2532b63..d17d15f 100644
@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsigned long
 addr, unsigned long size)
        while (pos < end) {
                rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
                if (rsize)
-                       rsize = 1UL << __ffs(pos);
+                       rsize = 1UL << __ffsl(pos);
                else
                        rsize = ((end - pos) <

MTIMER_ADD_REGION_ALIGN) ?

                                (end - pos) : MTIMER_ADD_REGION_ALIGN;

--
2.32.0

Quoted 8 lines
Quoted 1 line

--
opensbi mailing list
opensbi at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/opensbi

--
opensbi mailing list
opensbi at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/opensbi