lib: fix compilation when strings.h is included
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
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.hand it is included together withsbi_bitops.hthe compilation error appears. Theffs()andfls()are provided bystrings.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
Signed-off-by Petro Karashchenko <[email protected]>---
?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@@ -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@@ -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@@ -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@@ -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, unsignedlong cmask, ????????uint32_t event_code; ????????unsigned long ctr_mask = cmask << cbase;?
-???????if (__fls(ctr_mask)>=total_ctrs) +???????if (__flsl(ctr_mask)>=total_ctrs) ????????????????returnSBI_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)
????????????????returnSBI_EINVAL;
?
????????if (flags &SBI_PMU_CFG_FLAG_SKIP_MATCH) {lib/utils/timer/aclint_mtimer.c +1
-1@@ -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
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.hand it is included together withsbi_bitops.hthe compilation error appears. Theffs()andfls()are provided bystrings.hopensbi 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 necessaryRegards,
Xiang WQuoted 233 lines
Signed-off-by Petro Karashchenko <[email protected]>--- 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@@ -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@@ -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@@ -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(structsbi_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@@ -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, unsignedlong 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@@ -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
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.hcontains "static inline int fls(int x)" that goes in the conflict withstrings.hif 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 fromsbi_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.hand it is included together withsbi_bitops.hthe compilation error appears. Theffs()andfls()are provided bystrings.hopensbi does not depend on the library provided by the system, nor does
it refer tostrings.h, so I don't think this modification is necessaryRegards,
Xiang WQuoted 15 lines
Signed-off-by Petro Karashchenko <[email protected]>---
?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@@ -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 0first.
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@@ -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 unsignedlong
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@@ -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@@ -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
-0long cmask, ????????uint32_t event_code; ????????unsigned long ctr_mask = cmask << cbase;?
-???????if (__fls(ctr_mask)>=total_ctrs) +???????if (__flsl(ctr_mask)>=total_ctrs) ????????????????returnSBI_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
-0unsigned 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)
????????????????returnSBI_EINVAL;
?
????????if (flags &SBI_PMU_CFG_FLAG_SKIP_MATCH) {lib/utils/timer/aclint_mtimer.c +0
-0@@ -154,7 +154,7 @@ static int aclint_mtimer_add_regions(unsignedlong
Quoted 10 lines
lib/utils/timer/aclint_mtimer.c +1
-1addr, 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
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.hand it is included together withsbi_bitops.hthe compilation error appears. Theffs()andfls()are provided bystrings.hSigned-off-by Petro Karashchenko <[email protected]>
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@@ -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@@ -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@@ -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@@ -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, unsignedlong cmask, ????????uint32_t event_code; ????????unsigned long ctr_mask = cmask << cbase;?
-???????if (__fls(ctr_mask)>=total_ctrs) +???????if (__flsl(ctr_mask)>=total_ctrs) ????????????????returnSBI_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)
????????????????returnSBI_EINVAL;
?
????????if (flags &SBI_PMU_CFG_FLAG_SKIP_MATCH) {lib/utils/timer/aclint_mtimer.c +1
-1@@ -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
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.hand it is included together withsbi_bitops.hthe compilation error appears. Theffs()andfls()are provided bystrings.hSigned-off-by Petro Karashchenko <[email protected]>look good to me.
Reviewed-by Xiang W <[email protected]>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@@ -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@@ -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@@ -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(structsbi_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@@ -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, unsignedlong 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@@ -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.0Signature · 3 lines
opensbi mailing list opensbi at lists.infradead.org http://lists.infradead.org/mailman/listinfo/opensbi
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.hand it is included together withsbi_bitops.hthe compilation error appears. Theffs()andfls()are provided bystrings.hSigned-off-by Petro Karashchenko <[email protected]>look good to me.
Reviewed-by Xiang W <[email protected]>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@@ -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_fooinstead 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@@ -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@@ -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(structsbi_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@@ -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, unsignedlong 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@@ -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.0Quoted 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