From: Lukas Funke <lukas.fu...@weidmueller.com> Add generic 'find_next_zero_bit' implementation in order to enable the use of the 'for_each_set_bitrange' macro. The implementation is currently missing for the sandbox-arch and using the function results in a linker error.
There are more efficient implementations in the architecture specific implementations. However, for the sandbox the implementation should be simple and portable. Signed-off-by: Lukas Funke <lukas.fu...@weidmueller.com> --- arch/sandbox/include/asm/bitops.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/arch/sandbox/include/asm/bitops.h b/arch/sandbox/include/asm/bitops.h index f27d5e98c5..453ff005d2 100644 --- a/arch/sandbox/include/asm/bitops.h +++ b/arch/sandbox/include/asm/bitops.h @@ -104,8 +104,20 @@ static inline int __test_and_change_bit(int nr, void *addr) return (old & mask) != 0; } -extern int find_first_zero_bit(void *addr, unsigned size); -extern int find_next_zero_bit(void *addr, int size, int offset); +#define find_first_zero_bit(addr, size) \ + find_next_zero_bit((addr), (size), 0) + +static inline int find_next_zero_bit(const unsigned long *addr, int size, + int offset) { + unsigned long *p = ((unsigned long *)addr) + (offset >> 5); + + while ((~(*p) & 0x1 << offset) == 0x0ll && (offset < size)) { + offset++; + p = ((unsigned long *)addr) + (offset >> 5); + } + + return offset; +} /* * This routine doesn't need to be atomic. -- 2.30.2