blob: 0b93e25e91bd688a50c01593001acd168f7a4166 [file] [log] [blame]
/*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/
#ifndef BITMAP_H
#define BITMAP_H
#include <sizes.h>
/*
* Returns the index of the first bit set in @bitmap from @start inclusive.
* The index is zero-based from LSB (0) to MSB (63).
* When no such bits are set, returns BITS_PER_UL (64).
*/
static inline unsigned long bitmap_find_next_set_bit(unsigned long bitmap,
unsigned long start)
{
if (start < BITS_PER_UL) {
bitmap &= ~0UL << start;
if (bitmap != 0UL) {
return (unsigned long)(__builtin_ffsl(bitmap) - 1);
}
}
return BITS_PER_UL;
}
#define bitmap_for_each_set_bit(_bit, _bitmap, _max) \
for ((_bit) = find_next_set_bit((_bitmap), 0); \
(_bit) < (_max); \
(_bit) = find_next_set_bit((_bitmap), (_bit) + 1))
#endif /* BITMAP_H */