162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Test cases for bitmap API. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/bitmap.h> 962306a36Sopenharmony_ci#include <linux/init.h> 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci#include <linux/printk.h> 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci#include <linux/string.h> 1562306a36Sopenharmony_ci#include <linux/uaccess.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include "../tools/testing/selftests/kselftest_module.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define EXP1_IN_BITS (sizeof(exp1) * 8) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciKSTM_MODULE_GLOBALS(); 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic char pbl_buffer[PAGE_SIZE] __initdata; 2462306a36Sopenharmony_cistatic char print_buf[PAGE_SIZE * 2] __initdata; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistatic const unsigned long exp1[] __initconst = { 2762306a36Sopenharmony_ci BITMAP_FROM_U64(1), 2862306a36Sopenharmony_ci BITMAP_FROM_U64(2), 2962306a36Sopenharmony_ci BITMAP_FROM_U64(0x0000ffff), 3062306a36Sopenharmony_ci BITMAP_FROM_U64(0xffff0000), 3162306a36Sopenharmony_ci BITMAP_FROM_U64(0x55555555), 3262306a36Sopenharmony_ci BITMAP_FROM_U64(0xaaaaaaaa), 3362306a36Sopenharmony_ci BITMAP_FROM_U64(0x11111111), 3462306a36Sopenharmony_ci BITMAP_FROM_U64(0x22222222), 3562306a36Sopenharmony_ci BITMAP_FROM_U64(0xffffffff), 3662306a36Sopenharmony_ci BITMAP_FROM_U64(0xfffffffe), 3762306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), 3862306a36Sopenharmony_ci BITMAP_FROM_U64(0xffffffff77777777ULL), 3962306a36Sopenharmony_ci BITMAP_FROM_U64(0), 4062306a36Sopenharmony_ci BITMAP_FROM_U64(0x00008000), 4162306a36Sopenharmony_ci BITMAP_FROM_U64(0x80000000), 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic const unsigned long exp2[] __initconst = { 4562306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), 4662306a36Sopenharmony_ci BITMAP_FROM_U64(0xffffffff77777777ULL), 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* Fibonacci sequence */ 5062306a36Sopenharmony_cistatic const unsigned long exp2_to_exp3_mask[] __initconst = { 5162306a36Sopenharmony_ci BITMAP_FROM_U64(0x008000020020212eULL), 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci/* exp3_0_1 = (exp2[0] & ~exp2_to_exp3_mask) | (exp2[1] & exp2_to_exp3_mask) */ 5462306a36Sopenharmony_cistatic const unsigned long exp3_0_1[] __initconst = { 5562306a36Sopenharmony_ci BITMAP_FROM_U64(0x33b3333311313137ULL), 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci/* exp3_1_0 = (exp2[1] & ~exp2_to_exp3_mask) | (exp2[0] & exp2_to_exp3_mask) */ 5862306a36Sopenharmony_cistatic const unsigned long exp3_1_0[] __initconst = { 5962306a36Sopenharmony_ci BITMAP_FROM_U64(0xff7fffff77575751ULL), 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic bool __init 6362306a36Sopenharmony_ci__check_eq_uint(const char *srcfile, unsigned int line, 6462306a36Sopenharmony_ci const unsigned int exp_uint, unsigned int x) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci if (exp_uint != x) { 6762306a36Sopenharmony_ci pr_err("[%s:%u] expected %u, got %u\n", 6862306a36Sopenharmony_ci srcfile, line, exp_uint, x); 6962306a36Sopenharmony_ci return false; 7062306a36Sopenharmony_ci } 7162306a36Sopenharmony_ci return true; 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic bool __init 7662306a36Sopenharmony_ci__check_eq_bitmap(const char *srcfile, unsigned int line, 7762306a36Sopenharmony_ci const unsigned long *exp_bmap, const unsigned long *bmap, 7862306a36Sopenharmony_ci unsigned int nbits) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci if (!bitmap_equal(exp_bmap, bmap, nbits)) { 8162306a36Sopenharmony_ci pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n", 8262306a36Sopenharmony_ci srcfile, line, 8362306a36Sopenharmony_ci nbits, exp_bmap, nbits, bmap); 8462306a36Sopenharmony_ci return false; 8562306a36Sopenharmony_ci } 8662306a36Sopenharmony_ci return true; 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistatic bool __init 9062306a36Sopenharmony_ci__check_eq_pbl(const char *srcfile, unsigned int line, 9162306a36Sopenharmony_ci const char *expected_pbl, 9262306a36Sopenharmony_ci const unsigned long *bitmap, unsigned int nbits) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci snprintf(pbl_buffer, sizeof(pbl_buffer), "%*pbl", nbits, bitmap); 9562306a36Sopenharmony_ci if (strcmp(expected_pbl, pbl_buffer)) { 9662306a36Sopenharmony_ci pr_warn("[%s:%u] expected \"%s\", got \"%s\"\n", 9762306a36Sopenharmony_ci srcfile, line, 9862306a36Sopenharmony_ci expected_pbl, pbl_buffer); 9962306a36Sopenharmony_ci return false; 10062306a36Sopenharmony_ci } 10162306a36Sopenharmony_ci return true; 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic bool __init 10562306a36Sopenharmony_ci__check_eq_u32_array(const char *srcfile, unsigned int line, 10662306a36Sopenharmony_ci const u32 *exp_arr, unsigned int exp_len, 10762306a36Sopenharmony_ci const u32 *arr, unsigned int len) __used; 10862306a36Sopenharmony_cistatic bool __init 10962306a36Sopenharmony_ci__check_eq_u32_array(const char *srcfile, unsigned int line, 11062306a36Sopenharmony_ci const u32 *exp_arr, unsigned int exp_len, 11162306a36Sopenharmony_ci const u32 *arr, unsigned int len) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci if (exp_len != len) { 11462306a36Sopenharmony_ci pr_warn("[%s:%u] array length differ: expected %u, got %u\n", 11562306a36Sopenharmony_ci srcfile, line, 11662306a36Sopenharmony_ci exp_len, len); 11762306a36Sopenharmony_ci return false; 11862306a36Sopenharmony_ci } 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci if (memcmp(exp_arr, arr, len*sizeof(*arr))) { 12162306a36Sopenharmony_ci pr_warn("[%s:%u] array contents differ\n", srcfile, line); 12262306a36Sopenharmony_ci print_hex_dump(KERN_WARNING, " exp: ", DUMP_PREFIX_OFFSET, 12362306a36Sopenharmony_ci 32, 4, exp_arr, exp_len*sizeof(*exp_arr), false); 12462306a36Sopenharmony_ci print_hex_dump(KERN_WARNING, " got: ", DUMP_PREFIX_OFFSET, 12562306a36Sopenharmony_ci 32, 4, arr, len*sizeof(*arr), false); 12662306a36Sopenharmony_ci return false; 12762306a36Sopenharmony_ci } 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci return true; 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic bool __init __check_eq_clump8(const char *srcfile, unsigned int line, 13362306a36Sopenharmony_ci const unsigned int offset, 13462306a36Sopenharmony_ci const unsigned int size, 13562306a36Sopenharmony_ci const unsigned char *const clump_exp, 13662306a36Sopenharmony_ci const unsigned long *const clump) 13762306a36Sopenharmony_ci{ 13862306a36Sopenharmony_ci unsigned long exp; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci if (offset >= size) { 14162306a36Sopenharmony_ci pr_warn("[%s:%u] bit offset for clump out-of-bounds: expected less than %u, got %u\n", 14262306a36Sopenharmony_ci srcfile, line, size, offset); 14362306a36Sopenharmony_ci return false; 14462306a36Sopenharmony_ci } 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci exp = clump_exp[offset / 8]; 14762306a36Sopenharmony_ci if (!exp) { 14862306a36Sopenharmony_ci pr_warn("[%s:%u] bit offset for zero clump: expected nonzero clump, got bit offset %u with clump value 0", 14962306a36Sopenharmony_ci srcfile, line, offset); 15062306a36Sopenharmony_ci return false; 15162306a36Sopenharmony_ci } 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci if (*clump != exp) { 15462306a36Sopenharmony_ci pr_warn("[%s:%u] expected clump value of 0x%lX, got clump value of 0x%lX", 15562306a36Sopenharmony_ci srcfile, line, exp, *clump); 15662306a36Sopenharmony_ci return false; 15762306a36Sopenharmony_ci } 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci return true; 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistatic bool __init 16362306a36Sopenharmony_ci__check_eq_str(const char *srcfile, unsigned int line, 16462306a36Sopenharmony_ci const char *exp_str, const char *str, 16562306a36Sopenharmony_ci unsigned int len) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci bool eq; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci eq = strncmp(exp_str, str, len) == 0; 17062306a36Sopenharmony_ci if (!eq) 17162306a36Sopenharmony_ci pr_err("[%s:%u] expected %s, got %s\n", srcfile, line, exp_str, str); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci return eq; 17462306a36Sopenharmony_ci} 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#define __expect_eq(suffix, ...) \ 17762306a36Sopenharmony_ci ({ \ 17862306a36Sopenharmony_ci int result = 0; \ 17962306a36Sopenharmony_ci total_tests++; \ 18062306a36Sopenharmony_ci if (!__check_eq_ ## suffix(__FILE__, __LINE__, \ 18162306a36Sopenharmony_ci ##__VA_ARGS__)) { \ 18262306a36Sopenharmony_ci failed_tests++; \ 18362306a36Sopenharmony_ci result = 1; \ 18462306a36Sopenharmony_ci } \ 18562306a36Sopenharmony_ci result; \ 18662306a36Sopenharmony_ci }) 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci#define expect_eq_uint(...) __expect_eq(uint, ##__VA_ARGS__) 18962306a36Sopenharmony_ci#define expect_eq_bitmap(...) __expect_eq(bitmap, ##__VA_ARGS__) 19062306a36Sopenharmony_ci#define expect_eq_pbl(...) __expect_eq(pbl, ##__VA_ARGS__) 19162306a36Sopenharmony_ci#define expect_eq_u32_array(...) __expect_eq(u32_array, ##__VA_ARGS__) 19262306a36Sopenharmony_ci#define expect_eq_clump8(...) __expect_eq(clump8, ##__VA_ARGS__) 19362306a36Sopenharmony_ci#define expect_eq_str(...) __expect_eq(str, ##__VA_ARGS__) 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic void __init test_zero_clear(void) 19662306a36Sopenharmony_ci{ 19762306a36Sopenharmony_ci DECLARE_BITMAP(bmap, 1024); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci /* Known way to set all bits */ 20062306a36Sopenharmony_ci memset(bmap, 0xff, 128); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci expect_eq_pbl("0-22", bmap, 23); 20362306a36Sopenharmony_ci expect_eq_pbl("0-1023", bmap, 1024); 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci /* single-word bitmaps */ 20662306a36Sopenharmony_ci bitmap_clear(bmap, 0, 9); 20762306a36Sopenharmony_ci expect_eq_pbl("9-1023", bmap, 1024); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci bitmap_zero(bmap, 35); 21062306a36Sopenharmony_ci expect_eq_pbl("64-1023", bmap, 1024); 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci /* cross boundaries operations */ 21362306a36Sopenharmony_ci bitmap_clear(bmap, 79, 19); 21462306a36Sopenharmony_ci expect_eq_pbl("64-78,98-1023", bmap, 1024); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci bitmap_zero(bmap, 115); 21762306a36Sopenharmony_ci expect_eq_pbl("128-1023", bmap, 1024); 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci /* Zeroing entire area */ 22062306a36Sopenharmony_ci bitmap_zero(bmap, 1024); 22162306a36Sopenharmony_ci expect_eq_pbl("", bmap, 1024); 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_cistatic void __init test_find_nth_bit(void) 22562306a36Sopenharmony_ci{ 22662306a36Sopenharmony_ci unsigned long b, bit, cnt = 0; 22762306a36Sopenharmony_ci DECLARE_BITMAP(bmap, 64 * 3); 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci bitmap_zero(bmap, 64 * 3); 23062306a36Sopenharmony_ci __set_bit(10, bmap); 23162306a36Sopenharmony_ci __set_bit(20, bmap); 23262306a36Sopenharmony_ci __set_bit(30, bmap); 23362306a36Sopenharmony_ci __set_bit(40, bmap); 23462306a36Sopenharmony_ci __set_bit(50, bmap); 23562306a36Sopenharmony_ci __set_bit(60, bmap); 23662306a36Sopenharmony_ci __set_bit(80, bmap); 23762306a36Sopenharmony_ci __set_bit(123, bmap); 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci expect_eq_uint(10, find_nth_bit(bmap, 64 * 3, 0)); 24062306a36Sopenharmony_ci expect_eq_uint(20, find_nth_bit(bmap, 64 * 3, 1)); 24162306a36Sopenharmony_ci expect_eq_uint(30, find_nth_bit(bmap, 64 * 3, 2)); 24262306a36Sopenharmony_ci expect_eq_uint(40, find_nth_bit(bmap, 64 * 3, 3)); 24362306a36Sopenharmony_ci expect_eq_uint(50, find_nth_bit(bmap, 64 * 3, 4)); 24462306a36Sopenharmony_ci expect_eq_uint(60, find_nth_bit(bmap, 64 * 3, 5)); 24562306a36Sopenharmony_ci expect_eq_uint(80, find_nth_bit(bmap, 64 * 3, 6)); 24662306a36Sopenharmony_ci expect_eq_uint(123, find_nth_bit(bmap, 64 * 3, 7)); 24762306a36Sopenharmony_ci expect_eq_uint(64 * 3, find_nth_bit(bmap, 64 * 3, 8)); 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci expect_eq_uint(10, find_nth_bit(bmap, 64 * 3 - 1, 0)); 25062306a36Sopenharmony_ci expect_eq_uint(20, find_nth_bit(bmap, 64 * 3 - 1, 1)); 25162306a36Sopenharmony_ci expect_eq_uint(30, find_nth_bit(bmap, 64 * 3 - 1, 2)); 25262306a36Sopenharmony_ci expect_eq_uint(40, find_nth_bit(bmap, 64 * 3 - 1, 3)); 25362306a36Sopenharmony_ci expect_eq_uint(50, find_nth_bit(bmap, 64 * 3 - 1, 4)); 25462306a36Sopenharmony_ci expect_eq_uint(60, find_nth_bit(bmap, 64 * 3 - 1, 5)); 25562306a36Sopenharmony_ci expect_eq_uint(80, find_nth_bit(bmap, 64 * 3 - 1, 6)); 25662306a36Sopenharmony_ci expect_eq_uint(123, find_nth_bit(bmap, 64 * 3 - 1, 7)); 25762306a36Sopenharmony_ci expect_eq_uint(64 * 3 - 1, find_nth_bit(bmap, 64 * 3 - 1, 8)); 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci for_each_set_bit(bit, exp1, EXP1_IN_BITS) { 26062306a36Sopenharmony_ci b = find_nth_bit(exp1, EXP1_IN_BITS, cnt++); 26162306a36Sopenharmony_ci expect_eq_uint(b, bit); 26262306a36Sopenharmony_ci } 26362306a36Sopenharmony_ci} 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic void __init test_fill_set(void) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci DECLARE_BITMAP(bmap, 1024); 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci /* Known way to clear all bits */ 27062306a36Sopenharmony_ci memset(bmap, 0x00, 128); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci expect_eq_pbl("", bmap, 23); 27362306a36Sopenharmony_ci expect_eq_pbl("", bmap, 1024); 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci /* single-word bitmaps */ 27662306a36Sopenharmony_ci bitmap_set(bmap, 0, 9); 27762306a36Sopenharmony_ci expect_eq_pbl("0-8", bmap, 1024); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci bitmap_fill(bmap, 35); 28062306a36Sopenharmony_ci expect_eq_pbl("0-63", bmap, 1024); 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci /* cross boundaries operations */ 28362306a36Sopenharmony_ci bitmap_set(bmap, 79, 19); 28462306a36Sopenharmony_ci expect_eq_pbl("0-63,79-97", bmap, 1024); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci bitmap_fill(bmap, 115); 28762306a36Sopenharmony_ci expect_eq_pbl("0-127", bmap, 1024); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci /* Zeroing entire area */ 29062306a36Sopenharmony_ci bitmap_fill(bmap, 1024); 29162306a36Sopenharmony_ci expect_eq_pbl("0-1023", bmap, 1024); 29262306a36Sopenharmony_ci} 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_cistatic void __init test_copy(void) 29562306a36Sopenharmony_ci{ 29662306a36Sopenharmony_ci DECLARE_BITMAP(bmap1, 1024); 29762306a36Sopenharmony_ci DECLARE_BITMAP(bmap2, 1024); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci bitmap_zero(bmap1, 1024); 30062306a36Sopenharmony_ci bitmap_zero(bmap2, 1024); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci /* single-word bitmaps */ 30362306a36Sopenharmony_ci bitmap_set(bmap1, 0, 19); 30462306a36Sopenharmony_ci bitmap_copy(bmap2, bmap1, 23); 30562306a36Sopenharmony_ci expect_eq_pbl("0-18", bmap2, 1024); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci bitmap_set(bmap2, 0, 23); 30862306a36Sopenharmony_ci bitmap_copy(bmap2, bmap1, 23); 30962306a36Sopenharmony_ci expect_eq_pbl("0-18", bmap2, 1024); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci /* multi-word bitmaps */ 31262306a36Sopenharmony_ci bitmap_set(bmap1, 0, 109); 31362306a36Sopenharmony_ci bitmap_copy(bmap2, bmap1, 1024); 31462306a36Sopenharmony_ci expect_eq_pbl("0-108", bmap2, 1024); 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci bitmap_fill(bmap2, 1024); 31762306a36Sopenharmony_ci bitmap_copy(bmap2, bmap1, 1024); 31862306a36Sopenharmony_ci expect_eq_pbl("0-108", bmap2, 1024); 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci /* the following tests assume a 32- or 64-bit arch (even 128b 32162306a36Sopenharmony_ci * if we care) 32262306a36Sopenharmony_ci */ 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci bitmap_fill(bmap2, 1024); 32562306a36Sopenharmony_ci bitmap_copy(bmap2, bmap1, 109); /* ... but 0-padded til word length */ 32662306a36Sopenharmony_ci expect_eq_pbl("0-108,128-1023", bmap2, 1024); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci bitmap_fill(bmap2, 1024); 32962306a36Sopenharmony_ci bitmap_copy(bmap2, bmap1, 97); /* ... but aligned on word length */ 33062306a36Sopenharmony_ci expect_eq_pbl("0-108,128-1023", bmap2, 1024); 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci#define EXP2_IN_BITS (sizeof(exp2) * 8) 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cistatic void __init test_replace(void) 33662306a36Sopenharmony_ci{ 33762306a36Sopenharmony_ci unsigned int nbits = 64; 33862306a36Sopenharmony_ci unsigned int nlongs = DIV_ROUND_UP(nbits, BITS_PER_LONG); 33962306a36Sopenharmony_ci DECLARE_BITMAP(bmap, 1024); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci BUILD_BUG_ON(EXP2_IN_BITS < nbits * 2); 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci bitmap_zero(bmap, 1024); 34462306a36Sopenharmony_ci bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits); 34562306a36Sopenharmony_ci expect_eq_bitmap(bmap, exp3_0_1, nbits); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci bitmap_zero(bmap, 1024); 34862306a36Sopenharmony_ci bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits); 34962306a36Sopenharmony_ci expect_eq_bitmap(bmap, exp3_1_0, nbits); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci bitmap_fill(bmap, 1024); 35262306a36Sopenharmony_ci bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits); 35362306a36Sopenharmony_ci expect_eq_bitmap(bmap, exp3_0_1, nbits); 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci bitmap_fill(bmap, 1024); 35662306a36Sopenharmony_ci bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits); 35762306a36Sopenharmony_ci expect_eq_bitmap(bmap, exp3_1_0, nbits); 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci#define PARSE_TIME 0x1 36162306a36Sopenharmony_ci#define NO_LEN 0x2 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistruct test_bitmap_parselist{ 36462306a36Sopenharmony_ci const int errno; 36562306a36Sopenharmony_ci const char *in; 36662306a36Sopenharmony_ci const unsigned long *expected; 36762306a36Sopenharmony_ci const int nbits; 36862306a36Sopenharmony_ci const int flags; 36962306a36Sopenharmony_ci}; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistatic const struct test_bitmap_parselist parselist_tests[] __initconst = { 37262306a36Sopenharmony_ci#define step (sizeof(u64) / sizeof(unsigned long)) 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci {0, "0", &exp1[0], 8, 0}, 37562306a36Sopenharmony_ci {0, "1", &exp1[1 * step], 8, 0}, 37662306a36Sopenharmony_ci {0, "0-15", &exp1[2 * step], 32, 0}, 37762306a36Sopenharmony_ci {0, "16-31", &exp1[3 * step], 32, 0}, 37862306a36Sopenharmony_ci {0, "0-31:1/2", &exp1[4 * step], 32, 0}, 37962306a36Sopenharmony_ci {0, "1-31:1/2", &exp1[5 * step], 32, 0}, 38062306a36Sopenharmony_ci {0, "0-31:1/4", &exp1[6 * step], 32, 0}, 38162306a36Sopenharmony_ci {0, "1-31:1/4", &exp1[7 * step], 32, 0}, 38262306a36Sopenharmony_ci {0, "0-31:4/4", &exp1[8 * step], 32, 0}, 38362306a36Sopenharmony_ci {0, "1-31:4/4", &exp1[9 * step], 32, 0}, 38462306a36Sopenharmony_ci {0, "0-31:1/4,32-63:2/4", &exp1[10 * step], 64, 0}, 38562306a36Sopenharmony_ci {0, "0-31:3/4,32-63:4/4", &exp1[11 * step], 64, 0}, 38662306a36Sopenharmony_ci {0, " ,, 0-31:3/4 ,, 32-63:4/4 ,, ", &exp1[11 * step], 64, 0}, 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci {0, "0-31:1/4,32-63:2/4,64-95:3/4,96-127:4/4", exp2, 128, 0}, 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci {0, "0-2047:128/256", NULL, 2048, PARSE_TIME}, 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci {0, "", &exp1[12 * step], 8, 0}, 39362306a36Sopenharmony_ci {0, "\n", &exp1[12 * step], 8, 0}, 39462306a36Sopenharmony_ci {0, ",, ,, , , ,", &exp1[12 * step], 8, 0}, 39562306a36Sopenharmony_ci {0, " , ,, , , ", &exp1[12 * step], 8, 0}, 39662306a36Sopenharmony_ci {0, " , ,, , , \n", &exp1[12 * step], 8, 0}, 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci {0, "0-0", &exp1[0], 32, 0}, 39962306a36Sopenharmony_ci {0, "1-1", &exp1[1 * step], 32, 0}, 40062306a36Sopenharmony_ci {0, "15-15", &exp1[13 * step], 32, 0}, 40162306a36Sopenharmony_ci {0, "31-31", &exp1[14 * step], 32, 0}, 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci {0, "0-0:0/1", &exp1[12 * step], 32, 0}, 40462306a36Sopenharmony_ci {0, "0-0:1/1", &exp1[0], 32, 0}, 40562306a36Sopenharmony_ci {0, "0-0:1/31", &exp1[0], 32, 0}, 40662306a36Sopenharmony_ci {0, "0-0:31/31", &exp1[0], 32, 0}, 40762306a36Sopenharmony_ci {0, "1-1:1/1", &exp1[1 * step], 32, 0}, 40862306a36Sopenharmony_ci {0, "0-15:16/31", &exp1[2 * step], 32, 0}, 40962306a36Sopenharmony_ci {0, "15-15:1/2", &exp1[13 * step], 32, 0}, 41062306a36Sopenharmony_ci {0, "15-15:31/31", &exp1[13 * step], 32, 0}, 41162306a36Sopenharmony_ci {0, "15-31:1/31", &exp1[13 * step], 32, 0}, 41262306a36Sopenharmony_ci {0, "16-31:16/31", &exp1[3 * step], 32, 0}, 41362306a36Sopenharmony_ci {0, "31-31:31/31", &exp1[14 * step], 32, 0}, 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci {0, "N-N", &exp1[14 * step], 32, 0}, 41662306a36Sopenharmony_ci {0, "0-0:1/N", &exp1[0], 32, 0}, 41762306a36Sopenharmony_ci {0, "0-0:N/N", &exp1[0], 32, 0}, 41862306a36Sopenharmony_ci {0, "0-15:16/N", &exp1[2 * step], 32, 0}, 41962306a36Sopenharmony_ci {0, "15-15:N/N", &exp1[13 * step], 32, 0}, 42062306a36Sopenharmony_ci {0, "15-N:1/N", &exp1[13 * step], 32, 0}, 42162306a36Sopenharmony_ci {0, "16-N:16/N", &exp1[3 * step], 32, 0}, 42262306a36Sopenharmony_ci {0, "N-N:N/N", &exp1[14 * step], 32, 0}, 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci {0, "0-N:1/3,1-N:1/3,2-N:1/3", &exp1[8 * step], 32, 0}, 42562306a36Sopenharmony_ci {0, "0-31:1/3,1-31:1/3,2-31:1/3", &exp1[8 * step], 32, 0}, 42662306a36Sopenharmony_ci {0, "1-10:8/12,8-31:24/29,0-31:0/3", &exp1[9 * step], 32, 0}, 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci {0, "all", &exp1[8 * step], 32, 0}, 42962306a36Sopenharmony_ci {0, "0, 1, all, ", &exp1[8 * step], 32, 0}, 43062306a36Sopenharmony_ci {0, "all:1/2", &exp1[4 * step], 32, 0}, 43162306a36Sopenharmony_ci {0, "ALL:1/2", &exp1[4 * step], 32, 0}, 43262306a36Sopenharmony_ci {-EINVAL, "al", NULL, 8, 0}, 43362306a36Sopenharmony_ci {-EINVAL, "alll", NULL, 8, 0}, 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci {-EINVAL, "-1", NULL, 8, 0}, 43662306a36Sopenharmony_ci {-EINVAL, "-0", NULL, 8, 0}, 43762306a36Sopenharmony_ci {-EINVAL, "10-1", NULL, 8, 0}, 43862306a36Sopenharmony_ci {-ERANGE, "8-8", NULL, 8, 0}, 43962306a36Sopenharmony_ci {-ERANGE, "0-31", NULL, 8, 0}, 44062306a36Sopenharmony_ci {-EINVAL, "0-31:", NULL, 32, 0}, 44162306a36Sopenharmony_ci {-EINVAL, "0-31:0", NULL, 32, 0}, 44262306a36Sopenharmony_ci {-EINVAL, "0-31:0/", NULL, 32, 0}, 44362306a36Sopenharmony_ci {-EINVAL, "0-31:0/0", NULL, 32, 0}, 44462306a36Sopenharmony_ci {-EINVAL, "0-31:1/0", NULL, 32, 0}, 44562306a36Sopenharmony_ci {-EINVAL, "0-31:10/1", NULL, 32, 0}, 44662306a36Sopenharmony_ci {-EOVERFLOW, "0-98765432123456789:10/1", NULL, 8, 0}, 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci {-EINVAL, "a-31", NULL, 8, 0}, 44962306a36Sopenharmony_ci {-EINVAL, "0-a1", NULL, 8, 0}, 45062306a36Sopenharmony_ci {-EINVAL, "a-31:10/1", NULL, 8, 0}, 45162306a36Sopenharmony_ci {-EINVAL, "0-31:a/1", NULL, 8, 0}, 45262306a36Sopenharmony_ci {-EINVAL, "0-\n", NULL, 8, 0}, 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci}; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_cistatic void __init test_bitmap_parselist(void) 45762306a36Sopenharmony_ci{ 45862306a36Sopenharmony_ci int i; 45962306a36Sopenharmony_ci int err; 46062306a36Sopenharmony_ci ktime_t time; 46162306a36Sopenharmony_ci DECLARE_BITMAP(bmap, 2048); 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(parselist_tests); i++) { 46462306a36Sopenharmony_ci#define ptest parselist_tests[i] 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci time = ktime_get(); 46762306a36Sopenharmony_ci err = bitmap_parselist(ptest.in, bmap, ptest.nbits); 46862306a36Sopenharmony_ci time = ktime_get() - time; 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci if (err != ptest.errno) { 47162306a36Sopenharmony_ci pr_err("parselist: %d: input is %s, errno is %d, expected %d\n", 47262306a36Sopenharmony_ci i, ptest.in, err, ptest.errno); 47362306a36Sopenharmony_ci failed_tests++; 47462306a36Sopenharmony_ci continue; 47562306a36Sopenharmony_ci } 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci if (!err && ptest.expected 47862306a36Sopenharmony_ci && !__bitmap_equal(bmap, ptest.expected, ptest.nbits)) { 47962306a36Sopenharmony_ci pr_err("parselist: %d: input is %s, result is 0x%lx, expected 0x%lx\n", 48062306a36Sopenharmony_ci i, ptest.in, bmap[0], 48162306a36Sopenharmony_ci *ptest.expected); 48262306a36Sopenharmony_ci failed_tests++; 48362306a36Sopenharmony_ci continue; 48462306a36Sopenharmony_ci } 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci if (ptest.flags & PARSE_TIME) 48762306a36Sopenharmony_ci pr_err("parselist: %d: input is '%s' OK, Time: %llu\n", 48862306a36Sopenharmony_ci i, ptest.in, time); 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci#undef ptest 49162306a36Sopenharmony_ci } 49262306a36Sopenharmony_ci} 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_cistatic void __init test_bitmap_printlist(void) 49562306a36Sopenharmony_ci{ 49662306a36Sopenharmony_ci unsigned long *bmap = kmalloc(PAGE_SIZE, GFP_KERNEL); 49762306a36Sopenharmony_ci char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 49862306a36Sopenharmony_ci char expected[256]; 49962306a36Sopenharmony_ci int ret, slen; 50062306a36Sopenharmony_ci ktime_t time; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci if (!buf || !bmap) 50362306a36Sopenharmony_ci goto out; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci memset(bmap, -1, PAGE_SIZE); 50662306a36Sopenharmony_ci slen = snprintf(expected, 256, "0-%ld", PAGE_SIZE * 8 - 1); 50762306a36Sopenharmony_ci if (slen < 0) 50862306a36Sopenharmony_ci goto out; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci time = ktime_get(); 51162306a36Sopenharmony_ci ret = bitmap_print_to_pagebuf(true, buf, bmap, PAGE_SIZE * 8); 51262306a36Sopenharmony_ci time = ktime_get() - time; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci if (ret != slen + 1) { 51562306a36Sopenharmony_ci pr_err("bitmap_print_to_pagebuf: result is %d, expected %d\n", ret, slen); 51662306a36Sopenharmony_ci failed_tests++; 51762306a36Sopenharmony_ci goto out; 51862306a36Sopenharmony_ci } 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci if (strncmp(buf, expected, slen)) { 52162306a36Sopenharmony_ci pr_err("bitmap_print_to_pagebuf: result is %s, expected %s\n", buf, expected); 52262306a36Sopenharmony_ci failed_tests++; 52362306a36Sopenharmony_ci goto out; 52462306a36Sopenharmony_ci } 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci pr_err("bitmap_print_to_pagebuf: input is '%s', Time: %llu\n", buf, time); 52762306a36Sopenharmony_ciout: 52862306a36Sopenharmony_ci kfree(buf); 52962306a36Sopenharmony_ci kfree(bmap); 53062306a36Sopenharmony_ci} 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_cistatic const unsigned long parse_test[] __initconst = { 53362306a36Sopenharmony_ci BITMAP_FROM_U64(0), 53462306a36Sopenharmony_ci BITMAP_FROM_U64(1), 53562306a36Sopenharmony_ci BITMAP_FROM_U64(0xdeadbeef), 53662306a36Sopenharmony_ci BITMAP_FROM_U64(0x100000000ULL), 53762306a36Sopenharmony_ci}; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_cistatic const unsigned long parse_test2[] __initconst = { 54062306a36Sopenharmony_ci BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xdeadbeef), 54162306a36Sopenharmony_ci BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xbaadf00ddeadbeef), 54262306a36Sopenharmony_ci BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0x0badf00ddeadbeef), 54362306a36Sopenharmony_ci}; 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_cistatic const struct test_bitmap_parselist parse_tests[] __initconst = { 54662306a36Sopenharmony_ci {0, "", &parse_test[0 * step], 32, 0}, 54762306a36Sopenharmony_ci {0, " ", &parse_test[0 * step], 32, 0}, 54862306a36Sopenharmony_ci {0, "0", &parse_test[0 * step], 32, 0}, 54962306a36Sopenharmony_ci {0, "0\n", &parse_test[0 * step], 32, 0}, 55062306a36Sopenharmony_ci {0, "1", &parse_test[1 * step], 32, 0}, 55162306a36Sopenharmony_ci {0, "deadbeef", &parse_test[2 * step], 32, 0}, 55262306a36Sopenharmony_ci {0, "1,0", &parse_test[3 * step], 33, 0}, 55362306a36Sopenharmony_ci {0, "deadbeef,\n,0,1", &parse_test[2 * step], 96, 0}, 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci {0, "deadbeef,1,0", &parse_test2[0 * 2 * step], 96, 0}, 55662306a36Sopenharmony_ci {0, "baadf00d,deadbeef,1,0", &parse_test2[1 * 2 * step], 128, 0}, 55762306a36Sopenharmony_ci {0, "badf00d,deadbeef,1,0", &parse_test2[2 * 2 * step], 124, 0}, 55862306a36Sopenharmony_ci {0, "badf00d,deadbeef,1,0", &parse_test2[2 * 2 * step], 124, NO_LEN}, 55962306a36Sopenharmony_ci {0, " badf00d,deadbeef,1,0 ", &parse_test2[2 * 2 * step], 124, 0}, 56062306a36Sopenharmony_ci {0, " , badf00d,deadbeef,1,0 , ", &parse_test2[2 * 2 * step], 124, 0}, 56162306a36Sopenharmony_ci {0, " , badf00d, ,, ,,deadbeef,1,0 , ", &parse_test2[2 * 2 * step], 124, 0}, 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci {-EINVAL, "goodfood,deadbeef,1,0", NULL, 128, 0}, 56462306a36Sopenharmony_ci {-EOVERFLOW, "3,0", NULL, 33, 0}, 56562306a36Sopenharmony_ci {-EOVERFLOW, "123badf00d,deadbeef,1,0", NULL, 128, 0}, 56662306a36Sopenharmony_ci {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 90, 0}, 56762306a36Sopenharmony_ci {-EOVERFLOW, "fbadf00d,deadbeef,1,0", NULL, 95, 0}, 56862306a36Sopenharmony_ci {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 100, 0}, 56962306a36Sopenharmony_ci#undef step 57062306a36Sopenharmony_ci}; 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_cistatic void __init test_bitmap_parse(void) 57362306a36Sopenharmony_ci{ 57462306a36Sopenharmony_ci int i; 57562306a36Sopenharmony_ci int err; 57662306a36Sopenharmony_ci ktime_t time; 57762306a36Sopenharmony_ci DECLARE_BITMAP(bmap, 2048); 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(parse_tests); i++) { 58062306a36Sopenharmony_ci struct test_bitmap_parselist test = parse_tests[i]; 58162306a36Sopenharmony_ci size_t len = test.flags & NO_LEN ? UINT_MAX : strlen(test.in); 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci time = ktime_get(); 58462306a36Sopenharmony_ci err = bitmap_parse(test.in, len, bmap, test.nbits); 58562306a36Sopenharmony_ci time = ktime_get() - time; 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_ci if (err != test.errno) { 58862306a36Sopenharmony_ci pr_err("parse: %d: input is %s, errno is %d, expected %d\n", 58962306a36Sopenharmony_ci i, test.in, err, test.errno); 59062306a36Sopenharmony_ci failed_tests++; 59162306a36Sopenharmony_ci continue; 59262306a36Sopenharmony_ci } 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci if (!err && test.expected 59562306a36Sopenharmony_ci && !__bitmap_equal(bmap, test.expected, test.nbits)) { 59662306a36Sopenharmony_ci pr_err("parse: %d: input is %s, result is 0x%lx, expected 0x%lx\n", 59762306a36Sopenharmony_ci i, test.in, bmap[0], 59862306a36Sopenharmony_ci *test.expected); 59962306a36Sopenharmony_ci failed_tests++; 60062306a36Sopenharmony_ci continue; 60162306a36Sopenharmony_ci } 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci if (test.flags & PARSE_TIME) 60462306a36Sopenharmony_ci pr_err("parse: %d: input is '%s' OK, Time: %llu\n", 60562306a36Sopenharmony_ci i, test.in, time); 60662306a36Sopenharmony_ci } 60762306a36Sopenharmony_ci} 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_cistatic void __init test_bitmap_arr32(void) 61062306a36Sopenharmony_ci{ 61162306a36Sopenharmony_ci unsigned int nbits, next_bit; 61262306a36Sopenharmony_ci u32 arr[EXP1_IN_BITS / 32]; 61362306a36Sopenharmony_ci DECLARE_BITMAP(bmap2, EXP1_IN_BITS); 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci memset(arr, 0xa5, sizeof(arr)); 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) { 61862306a36Sopenharmony_ci bitmap_to_arr32(arr, exp1, nbits); 61962306a36Sopenharmony_ci bitmap_from_arr32(bmap2, arr, nbits); 62062306a36Sopenharmony_ci expect_eq_bitmap(bmap2, exp1, nbits); 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ci next_bit = find_next_bit(bmap2, 62362306a36Sopenharmony_ci round_up(nbits, BITS_PER_LONG), nbits); 62462306a36Sopenharmony_ci if (next_bit < round_up(nbits, BITS_PER_LONG)) { 62562306a36Sopenharmony_ci pr_err("bitmap_copy_arr32(nbits == %d:" 62662306a36Sopenharmony_ci " tail is not safely cleared: %d\n", 62762306a36Sopenharmony_ci nbits, next_bit); 62862306a36Sopenharmony_ci failed_tests++; 62962306a36Sopenharmony_ci } 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci if (nbits < EXP1_IN_BITS - 32) 63262306a36Sopenharmony_ci expect_eq_uint(arr[DIV_ROUND_UP(nbits, 32)], 63362306a36Sopenharmony_ci 0xa5a5a5a5); 63462306a36Sopenharmony_ci } 63562306a36Sopenharmony_ci} 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_cistatic void __init test_bitmap_arr64(void) 63862306a36Sopenharmony_ci{ 63962306a36Sopenharmony_ci unsigned int nbits, next_bit; 64062306a36Sopenharmony_ci u64 arr[EXP1_IN_BITS / 64]; 64162306a36Sopenharmony_ci DECLARE_BITMAP(bmap2, EXP1_IN_BITS); 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci memset(arr, 0xa5, sizeof(arr)); 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci for (nbits = 0; nbits < EXP1_IN_BITS; ++nbits) { 64662306a36Sopenharmony_ci memset(bmap2, 0xff, sizeof(arr)); 64762306a36Sopenharmony_ci bitmap_to_arr64(arr, exp1, nbits); 64862306a36Sopenharmony_ci bitmap_from_arr64(bmap2, arr, nbits); 64962306a36Sopenharmony_ci expect_eq_bitmap(bmap2, exp1, nbits); 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci next_bit = find_next_bit(bmap2, round_up(nbits, BITS_PER_LONG), nbits); 65262306a36Sopenharmony_ci if (next_bit < round_up(nbits, BITS_PER_LONG)) { 65362306a36Sopenharmony_ci pr_err("bitmap_copy_arr64(nbits == %d:" 65462306a36Sopenharmony_ci " tail is not safely cleared: %d\n", nbits, next_bit); 65562306a36Sopenharmony_ci failed_tests++; 65662306a36Sopenharmony_ci } 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci if ((nbits % 64) && 65962306a36Sopenharmony_ci (arr[(nbits - 1) / 64] & ~GENMASK_ULL((nbits - 1) % 64, 0))) { 66062306a36Sopenharmony_ci pr_err("bitmap_to_arr64(nbits == %d): tail is not safely cleared: 0x%016llx (must be 0x%016llx)\n", 66162306a36Sopenharmony_ci nbits, arr[(nbits - 1) / 64], 66262306a36Sopenharmony_ci GENMASK_ULL((nbits - 1) % 64, 0)); 66362306a36Sopenharmony_ci failed_tests++; 66462306a36Sopenharmony_ci } 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ci if (nbits < EXP1_IN_BITS - 64) 66762306a36Sopenharmony_ci expect_eq_uint(arr[DIV_ROUND_UP(nbits, 64)], 0xa5a5a5a5); 66862306a36Sopenharmony_ci } 66962306a36Sopenharmony_ci} 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_cistatic void noinline __init test_mem_optimisations(void) 67262306a36Sopenharmony_ci{ 67362306a36Sopenharmony_ci DECLARE_BITMAP(bmap1, 1024); 67462306a36Sopenharmony_ci DECLARE_BITMAP(bmap2, 1024); 67562306a36Sopenharmony_ci unsigned int start, nbits; 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci for (start = 0; start < 1024; start += 8) { 67862306a36Sopenharmony_ci for (nbits = 0; nbits < 1024 - start; nbits += 8) { 67962306a36Sopenharmony_ci memset(bmap1, 0x5a, sizeof(bmap1)); 68062306a36Sopenharmony_ci memset(bmap2, 0x5a, sizeof(bmap2)); 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci bitmap_set(bmap1, start, nbits); 68362306a36Sopenharmony_ci __bitmap_set(bmap2, start, nbits); 68462306a36Sopenharmony_ci if (!bitmap_equal(bmap1, bmap2, 1024)) { 68562306a36Sopenharmony_ci printk("set not equal %d %d\n", start, nbits); 68662306a36Sopenharmony_ci failed_tests++; 68762306a36Sopenharmony_ci } 68862306a36Sopenharmony_ci if (!__bitmap_equal(bmap1, bmap2, 1024)) { 68962306a36Sopenharmony_ci printk("set not __equal %d %d\n", start, nbits); 69062306a36Sopenharmony_ci failed_tests++; 69162306a36Sopenharmony_ci } 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci bitmap_clear(bmap1, start, nbits); 69462306a36Sopenharmony_ci __bitmap_clear(bmap2, start, nbits); 69562306a36Sopenharmony_ci if (!bitmap_equal(bmap1, bmap2, 1024)) { 69662306a36Sopenharmony_ci printk("clear not equal %d %d\n", start, nbits); 69762306a36Sopenharmony_ci failed_tests++; 69862306a36Sopenharmony_ci } 69962306a36Sopenharmony_ci if (!__bitmap_equal(bmap1, bmap2, 1024)) { 70062306a36Sopenharmony_ci printk("clear not __equal %d %d\n", start, 70162306a36Sopenharmony_ci nbits); 70262306a36Sopenharmony_ci failed_tests++; 70362306a36Sopenharmony_ci } 70462306a36Sopenharmony_ci } 70562306a36Sopenharmony_ci } 70662306a36Sopenharmony_ci} 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_cistatic const unsigned char clump_exp[] __initconst = { 70962306a36Sopenharmony_ci 0x01, /* 1 bit set */ 71062306a36Sopenharmony_ci 0x02, /* non-edge 1 bit set */ 71162306a36Sopenharmony_ci 0x00, /* zero bits set */ 71262306a36Sopenharmony_ci 0x38, /* 3 bits set across 4-bit boundary */ 71362306a36Sopenharmony_ci 0x38, /* Repeated clump */ 71462306a36Sopenharmony_ci 0x0F, /* 4 bits set */ 71562306a36Sopenharmony_ci 0xFF, /* all bits set */ 71662306a36Sopenharmony_ci 0x05, /* non-adjacent 2 bits set */ 71762306a36Sopenharmony_ci}; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_cistatic void __init test_for_each_set_clump8(void) 72062306a36Sopenharmony_ci{ 72162306a36Sopenharmony_ci#define CLUMP_EXP_NUMBITS 64 72262306a36Sopenharmony_ci DECLARE_BITMAP(bits, CLUMP_EXP_NUMBITS); 72362306a36Sopenharmony_ci unsigned int start; 72462306a36Sopenharmony_ci unsigned long clump; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci /* set bitmap to test case */ 72762306a36Sopenharmony_ci bitmap_zero(bits, CLUMP_EXP_NUMBITS); 72862306a36Sopenharmony_ci bitmap_set(bits, 0, 1); /* 0x01 */ 72962306a36Sopenharmony_ci bitmap_set(bits, 9, 1); /* 0x02 */ 73062306a36Sopenharmony_ci bitmap_set(bits, 27, 3); /* 0x28 */ 73162306a36Sopenharmony_ci bitmap_set(bits, 35, 3); /* 0x28 */ 73262306a36Sopenharmony_ci bitmap_set(bits, 40, 4); /* 0x0F */ 73362306a36Sopenharmony_ci bitmap_set(bits, 48, 8); /* 0xFF */ 73462306a36Sopenharmony_ci bitmap_set(bits, 56, 1); /* 0x05 - part 1 */ 73562306a36Sopenharmony_ci bitmap_set(bits, 58, 1); /* 0x05 - part 2 */ 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci for_each_set_clump8(start, clump, bits, CLUMP_EXP_NUMBITS) 73862306a36Sopenharmony_ci expect_eq_clump8(start, CLUMP_EXP_NUMBITS, clump_exp, &clump); 73962306a36Sopenharmony_ci} 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_cistatic void __init test_for_each_set_bit_wrap(void) 74262306a36Sopenharmony_ci{ 74362306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 74462306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 74562306a36Sopenharmony_ci unsigned int wr, bit; 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci bitmap_zero(orig, 500); 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_ci /* Set individual bits */ 75062306a36Sopenharmony_ci for (bit = 0; bit < 500; bit += 10) 75162306a36Sopenharmony_ci bitmap_set(orig, bit, 1); 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci /* Set range of bits */ 75462306a36Sopenharmony_ci bitmap_set(orig, 100, 50); 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci for (wr = 0; wr < 500; wr++) { 75762306a36Sopenharmony_ci bitmap_zero(copy, 500); 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_ci for_each_set_bit_wrap(bit, orig, 500, wr) 76062306a36Sopenharmony_ci bitmap_set(copy, bit, 1); 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci expect_eq_bitmap(orig, copy, 500); 76362306a36Sopenharmony_ci } 76462306a36Sopenharmony_ci} 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_cistatic void __init test_for_each_set_bit(void) 76762306a36Sopenharmony_ci{ 76862306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 76962306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 77062306a36Sopenharmony_ci unsigned int bit; 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci bitmap_zero(orig, 500); 77362306a36Sopenharmony_ci bitmap_zero(copy, 500); 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci /* Set individual bits */ 77662306a36Sopenharmony_ci for (bit = 0; bit < 500; bit += 10) 77762306a36Sopenharmony_ci bitmap_set(orig, bit, 1); 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci /* Set range of bits */ 78062306a36Sopenharmony_ci bitmap_set(orig, 100, 50); 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci for_each_set_bit(bit, orig, 500) 78362306a36Sopenharmony_ci bitmap_set(copy, bit, 1); 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci expect_eq_bitmap(orig, copy, 500); 78662306a36Sopenharmony_ci} 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_cistatic void __init test_for_each_set_bit_from(void) 78962306a36Sopenharmony_ci{ 79062306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 79162306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 79262306a36Sopenharmony_ci unsigned int wr, bit; 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci bitmap_zero(orig, 500); 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci /* Set individual bits */ 79762306a36Sopenharmony_ci for (bit = 0; bit < 500; bit += 10) 79862306a36Sopenharmony_ci bitmap_set(orig, bit, 1); 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ci /* Set range of bits */ 80162306a36Sopenharmony_ci bitmap_set(orig, 100, 50); 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_ci for (wr = 0; wr < 500; wr++) { 80462306a36Sopenharmony_ci DECLARE_BITMAP(tmp, 500); 80562306a36Sopenharmony_ci 80662306a36Sopenharmony_ci bitmap_zero(copy, 500); 80762306a36Sopenharmony_ci bit = wr; 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci for_each_set_bit_from(bit, orig, 500) 81062306a36Sopenharmony_ci bitmap_set(copy, bit, 1); 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_ci bitmap_copy(tmp, orig, 500); 81362306a36Sopenharmony_ci bitmap_clear(tmp, 0, wr); 81462306a36Sopenharmony_ci expect_eq_bitmap(tmp, copy, 500); 81562306a36Sopenharmony_ci } 81662306a36Sopenharmony_ci} 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_cistatic void __init test_for_each_clear_bit(void) 81962306a36Sopenharmony_ci{ 82062306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 82162306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 82262306a36Sopenharmony_ci unsigned int bit; 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci bitmap_fill(orig, 500); 82562306a36Sopenharmony_ci bitmap_fill(copy, 500); 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_ci /* Set individual bits */ 82862306a36Sopenharmony_ci for (bit = 0; bit < 500; bit += 10) 82962306a36Sopenharmony_ci bitmap_clear(orig, bit, 1); 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci /* Set range of bits */ 83262306a36Sopenharmony_ci bitmap_clear(orig, 100, 50); 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_ci for_each_clear_bit(bit, orig, 500) 83562306a36Sopenharmony_ci bitmap_clear(copy, bit, 1); 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_ci expect_eq_bitmap(orig, copy, 500); 83862306a36Sopenharmony_ci} 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_cistatic void __init test_for_each_clear_bit_from(void) 84162306a36Sopenharmony_ci{ 84262306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 84362306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 84462306a36Sopenharmony_ci unsigned int wr, bit; 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci bitmap_fill(orig, 500); 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci /* Set individual bits */ 84962306a36Sopenharmony_ci for (bit = 0; bit < 500; bit += 10) 85062306a36Sopenharmony_ci bitmap_clear(orig, bit, 1); 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_ci /* Set range of bits */ 85362306a36Sopenharmony_ci bitmap_clear(orig, 100, 50); 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci for (wr = 0; wr < 500; wr++) { 85662306a36Sopenharmony_ci DECLARE_BITMAP(tmp, 500); 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci bitmap_fill(copy, 500); 85962306a36Sopenharmony_ci bit = wr; 86062306a36Sopenharmony_ci 86162306a36Sopenharmony_ci for_each_clear_bit_from(bit, orig, 500) 86262306a36Sopenharmony_ci bitmap_clear(copy, bit, 1); 86362306a36Sopenharmony_ci 86462306a36Sopenharmony_ci bitmap_copy(tmp, orig, 500); 86562306a36Sopenharmony_ci bitmap_set(tmp, 0, wr); 86662306a36Sopenharmony_ci expect_eq_bitmap(tmp, copy, 500); 86762306a36Sopenharmony_ci } 86862306a36Sopenharmony_ci} 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_cistatic void __init test_for_each_set_bitrange(void) 87162306a36Sopenharmony_ci{ 87262306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 87362306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 87462306a36Sopenharmony_ci unsigned int s, e; 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci bitmap_zero(orig, 500); 87762306a36Sopenharmony_ci bitmap_zero(copy, 500); 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci /* Set individual bits */ 88062306a36Sopenharmony_ci for (s = 0; s < 500; s += 10) 88162306a36Sopenharmony_ci bitmap_set(orig, s, 1); 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci /* Set range of bits */ 88462306a36Sopenharmony_ci bitmap_set(orig, 100, 50); 88562306a36Sopenharmony_ci 88662306a36Sopenharmony_ci for_each_set_bitrange(s, e, orig, 500) 88762306a36Sopenharmony_ci bitmap_set(copy, s, e-s); 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_ci expect_eq_bitmap(orig, copy, 500); 89062306a36Sopenharmony_ci} 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_cistatic void __init test_for_each_clear_bitrange(void) 89362306a36Sopenharmony_ci{ 89462306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 89562306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 89662306a36Sopenharmony_ci unsigned int s, e; 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci bitmap_fill(orig, 500); 89962306a36Sopenharmony_ci bitmap_fill(copy, 500); 90062306a36Sopenharmony_ci 90162306a36Sopenharmony_ci /* Set individual bits */ 90262306a36Sopenharmony_ci for (s = 0; s < 500; s += 10) 90362306a36Sopenharmony_ci bitmap_clear(orig, s, 1); 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci /* Set range of bits */ 90662306a36Sopenharmony_ci bitmap_clear(orig, 100, 50); 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci for_each_clear_bitrange(s, e, orig, 500) 90962306a36Sopenharmony_ci bitmap_clear(copy, s, e-s); 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_ci expect_eq_bitmap(orig, copy, 500); 91262306a36Sopenharmony_ci} 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_cistatic void __init test_for_each_set_bitrange_from(void) 91562306a36Sopenharmony_ci{ 91662306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 91762306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 91862306a36Sopenharmony_ci unsigned int wr, s, e; 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci bitmap_zero(orig, 500); 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci /* Set individual bits */ 92362306a36Sopenharmony_ci for (s = 0; s < 500; s += 10) 92462306a36Sopenharmony_ci bitmap_set(orig, s, 1); 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci /* Set range of bits */ 92762306a36Sopenharmony_ci bitmap_set(orig, 100, 50); 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_ci for (wr = 0; wr < 500; wr++) { 93062306a36Sopenharmony_ci DECLARE_BITMAP(tmp, 500); 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci bitmap_zero(copy, 500); 93362306a36Sopenharmony_ci s = wr; 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_ci for_each_set_bitrange_from(s, e, orig, 500) 93662306a36Sopenharmony_ci bitmap_set(copy, s, e - s); 93762306a36Sopenharmony_ci 93862306a36Sopenharmony_ci bitmap_copy(tmp, orig, 500); 93962306a36Sopenharmony_ci bitmap_clear(tmp, 0, wr); 94062306a36Sopenharmony_ci expect_eq_bitmap(tmp, copy, 500); 94162306a36Sopenharmony_ci } 94262306a36Sopenharmony_ci} 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_cistatic void __init test_for_each_clear_bitrange_from(void) 94562306a36Sopenharmony_ci{ 94662306a36Sopenharmony_ci DECLARE_BITMAP(orig, 500); 94762306a36Sopenharmony_ci DECLARE_BITMAP(copy, 500); 94862306a36Sopenharmony_ci unsigned int wr, s, e; 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_ci bitmap_fill(orig, 500); 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_ci /* Set individual bits */ 95362306a36Sopenharmony_ci for (s = 0; s < 500; s += 10) 95462306a36Sopenharmony_ci bitmap_clear(orig, s, 1); 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci /* Set range of bits */ 95762306a36Sopenharmony_ci bitmap_set(orig, 100, 50); 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_ci for (wr = 0; wr < 500; wr++) { 96062306a36Sopenharmony_ci DECLARE_BITMAP(tmp, 500); 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_ci bitmap_fill(copy, 500); 96362306a36Sopenharmony_ci s = wr; 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci for_each_clear_bitrange_from(s, e, orig, 500) 96662306a36Sopenharmony_ci bitmap_clear(copy, s, e - s); 96762306a36Sopenharmony_ci 96862306a36Sopenharmony_ci bitmap_copy(tmp, orig, 500); 96962306a36Sopenharmony_ci bitmap_set(tmp, 0, wr); 97062306a36Sopenharmony_ci expect_eq_bitmap(tmp, copy, 500); 97162306a36Sopenharmony_ci } 97262306a36Sopenharmony_ci} 97362306a36Sopenharmony_ci 97462306a36Sopenharmony_cistruct test_bitmap_cut { 97562306a36Sopenharmony_ci unsigned int first; 97662306a36Sopenharmony_ci unsigned int cut; 97762306a36Sopenharmony_ci unsigned int nbits; 97862306a36Sopenharmony_ci unsigned long in[4]; 97962306a36Sopenharmony_ci unsigned long expected[4]; 98062306a36Sopenharmony_ci}; 98162306a36Sopenharmony_ci 98262306a36Sopenharmony_cistatic struct test_bitmap_cut test_cut[] = { 98362306a36Sopenharmony_ci { 0, 0, 8, { 0x0000000aUL, }, { 0x0000000aUL, }, }, 98462306a36Sopenharmony_ci { 0, 0, 32, { 0xdadadeadUL, }, { 0xdadadeadUL, }, }, 98562306a36Sopenharmony_ci { 0, 3, 8, { 0x000000aaUL, }, { 0x00000015UL, }, }, 98662306a36Sopenharmony_ci { 3, 3, 8, { 0x000000aaUL, }, { 0x00000012UL, }, }, 98762306a36Sopenharmony_ci { 0, 1, 32, { 0xa5a5a5a5UL, }, { 0x52d2d2d2UL, }, }, 98862306a36Sopenharmony_ci { 0, 8, 32, { 0xdeadc0deUL, }, { 0x00deadc0UL, }, }, 98962306a36Sopenharmony_ci { 1, 1, 32, { 0x5a5a5a5aUL, }, { 0x2d2d2d2cUL, }, }, 99062306a36Sopenharmony_ci { 0, 15, 32, { 0xa5a5a5a5UL, }, { 0x00014b4bUL, }, }, 99162306a36Sopenharmony_ci { 0, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, }, 99262306a36Sopenharmony_ci { 15, 15, 32, { 0xa5a5a5a5UL, }, { 0x000125a5UL, }, }, 99362306a36Sopenharmony_ci { 15, 16, 32, { 0xa5a5a5a5UL, }, { 0x0000a5a5UL, }, }, 99462306a36Sopenharmony_ci { 16, 15, 32, { 0xa5a5a5a5UL, }, { 0x0001a5a5UL, }, }, 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci { BITS_PER_LONG, BITS_PER_LONG, BITS_PER_LONG, 99762306a36Sopenharmony_ci { 0xa5a5a5a5UL, 0xa5a5a5a5UL, }, 99862306a36Sopenharmony_ci { 0xa5a5a5a5UL, 0xa5a5a5a5UL, }, 99962306a36Sopenharmony_ci }, 100062306a36Sopenharmony_ci { 1, BITS_PER_LONG - 1, BITS_PER_LONG, 100162306a36Sopenharmony_ci { 0xa5a5a5a5UL, 0xa5a5a5a5UL, }, 100262306a36Sopenharmony_ci { 0x00000001UL, 0x00000001UL, }, 100362306a36Sopenharmony_ci }, 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_ci { 0, BITS_PER_LONG * 2, BITS_PER_LONG * 2 + 1, 100662306a36Sopenharmony_ci { 0xa5a5a5a5UL, 0x00000001UL, 0x00000001UL, 0x00000001UL }, 100762306a36Sopenharmony_ci { 0x00000001UL, }, 100862306a36Sopenharmony_ci }, 100962306a36Sopenharmony_ci { 16, BITS_PER_LONG * 2 + 1, BITS_PER_LONG * 2 + 1 + 16, 101062306a36Sopenharmony_ci { 0x0000ffffUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL, 0x5a5a5a5aUL }, 101162306a36Sopenharmony_ci { 0x2d2dffffUL, }, 101262306a36Sopenharmony_ci }, 101362306a36Sopenharmony_ci}; 101462306a36Sopenharmony_ci 101562306a36Sopenharmony_cistatic void __init test_bitmap_cut(void) 101662306a36Sopenharmony_ci{ 101762306a36Sopenharmony_ci unsigned long b[5], *in = &b[1], *out = &b[0]; /* Partial overlap */ 101862306a36Sopenharmony_ci int i; 101962306a36Sopenharmony_ci 102062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(test_cut); i++) { 102162306a36Sopenharmony_ci struct test_bitmap_cut *t = &test_cut[i]; 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci memcpy(in, t->in, sizeof(t->in)); 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci bitmap_cut(out, in, t->first, t->cut, t->nbits); 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci expect_eq_bitmap(t->expected, out, t->nbits); 102862306a36Sopenharmony_ci } 102962306a36Sopenharmony_ci} 103062306a36Sopenharmony_ci 103162306a36Sopenharmony_cistruct test_bitmap_print { 103262306a36Sopenharmony_ci const unsigned long *bitmap; 103362306a36Sopenharmony_ci unsigned long nbits; 103462306a36Sopenharmony_ci const char *mask; 103562306a36Sopenharmony_ci const char *list; 103662306a36Sopenharmony_ci}; 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_cistatic const unsigned long small_bitmap[] __initconst = { 103962306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), 104062306a36Sopenharmony_ci}; 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_cistatic const char small_mask[] __initconst = "33333333,11111111\n"; 104362306a36Sopenharmony_cistatic const char small_list[] __initconst = "0,4,8,12,16,20,24,28,32-33,36-37,40-41,44-45,48-49,52-53,56-57,60-61\n"; 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_cistatic const unsigned long large_bitmap[] __initconst = { 104662306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 104762306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 104862306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 104962306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105062306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105162306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105262306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105362306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105462306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105562306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105662306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105762306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105862306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 105962306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 106062306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 106162306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 106262306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 106362306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 106462306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 106562306a36Sopenharmony_ci BITMAP_FROM_U64(0x3333333311111111ULL), BITMAP_FROM_U64(0x3333333311111111ULL), 106662306a36Sopenharmony_ci}; 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_cistatic const char large_mask[] __initconst = "33333333,11111111,33333333,11111111," 106962306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107062306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107162306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107262306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107362306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107462306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107562306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107662306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107762306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107862306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 107962306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108062306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108162306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108262306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108362306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108462306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108562306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108662306a36Sopenharmony_ci "33333333,11111111,33333333,11111111," 108762306a36Sopenharmony_ci "33333333,11111111,33333333,11111111\n"; 108862306a36Sopenharmony_ci 108962306a36Sopenharmony_cistatic const char large_list[] __initconst = /* more than 4KB */ 109062306a36Sopenharmony_ci "0,4,8,12,16,20,24,28,32-33,36-37,40-41,44-45,48-49,52-53,56-57,60-61,64,68,72,76,80,84,88,92,96-97,100-101,104-1" 109162306a36Sopenharmony_ci "05,108-109,112-113,116-117,120-121,124-125,128,132,136,140,144,148,152,156,160-161,164-165,168-169,172-173,176-1" 109262306a36Sopenharmony_ci "77,180-181,184-185,188-189,192,196,200,204,208,212,216,220,224-225,228-229,232-233,236-237,240-241,244-245,248-2" 109362306a36Sopenharmony_ci "49,252-253,256,260,264,268,272,276,280,284,288-289,292-293,296-297,300-301,304-305,308-309,312-313,316-317,320,3" 109462306a36Sopenharmony_ci "24,328,332,336,340,344,348,352-353,356-357,360-361,364-365,368-369,372-373,376-377,380-381,384,388,392,396,400,4" 109562306a36Sopenharmony_ci "04,408,412,416-417,420-421,424-425,428-429,432-433,436-437,440-441,444-445,448,452,456,460,464,468,472,476,480-4" 109662306a36Sopenharmony_ci "81,484-485,488-489,492-493,496-497,500-501,504-505,508-509,512,516,520,524,528,532,536,540,544-545,548-549,552-5" 109762306a36Sopenharmony_ci "53,556-557,560-561,564-565,568-569,572-573,576,580,584,588,592,596,600,604,608-609,612-613,616-617,620-621,624-6" 109862306a36Sopenharmony_ci "25,628-629,632-633,636-637,640,644,648,652,656,660,664,668,672-673,676-677,680-681,684-685,688-689,692-693,696-6" 109962306a36Sopenharmony_ci "97,700-701,704,708,712,716,720,724,728,732,736-737,740-741,744-745,748-749,752-753,756-757,760-761,764-765,768,7" 110062306a36Sopenharmony_ci "72,776,780,784,788,792,796,800-801,804-805,808-809,812-813,816-817,820-821,824-825,828-829,832,836,840,844,848,8" 110162306a36Sopenharmony_ci "52,856,860,864-865,868-869,872-873,876-877,880-881,884-885,888-889,892-893,896,900,904,908,912,916,920,924,928-9" 110262306a36Sopenharmony_ci "29,932-933,936-937,940-941,944-945,948-949,952-953,956-957,960,964,968,972,976,980,984,988,992-993,996-997,1000-" 110362306a36Sopenharmony_ci "1001,1004-1005,1008-1009,1012-1013,1016-1017,1020-1021,1024,1028,1032,1036,1040,1044,1048,1052,1056-1057,1060-10" 110462306a36Sopenharmony_ci "61,1064-1065,1068-1069,1072-1073,1076-1077,1080-1081,1084-1085,1088,1092,1096,1100,1104,1108,1112,1116,1120-1121" 110562306a36Sopenharmony_ci ",1124-1125,1128-1129,1132-1133,1136-1137,1140-1141,1144-1145,1148-1149,1152,1156,1160,1164,1168,1172,1176,1180,1" 110662306a36Sopenharmony_ci "184-1185,1188-1189,1192-1193,1196-1197,1200-1201,1204-1205,1208-1209,1212-1213,1216,1220,1224,1228,1232,1236,124" 110762306a36Sopenharmony_ci "0,1244,1248-1249,1252-1253,1256-1257,1260-1261,1264-1265,1268-1269,1272-1273,1276-1277,1280,1284,1288,1292,1296," 110862306a36Sopenharmony_ci "1300,1304,1308,1312-1313,1316-1317,1320-1321,1324-1325,1328-1329,1332-1333,1336-1337,1340-1341,1344,1348,1352,13" 110962306a36Sopenharmony_ci "56,1360,1364,1368,1372,1376-1377,1380-1381,1384-1385,1388-1389,1392-1393,1396-1397,1400-1401,1404-1405,1408,1412" 111062306a36Sopenharmony_ci ",1416,1420,1424,1428,1432,1436,1440-1441,1444-1445,1448-1449,1452-1453,1456-1457,1460-1461,1464-1465,1468-1469,1" 111162306a36Sopenharmony_ci "472,1476,1480,1484,1488,1492,1496,1500,1504-1505,1508-1509,1512-1513,1516-1517,1520-1521,1524-1525,1528-1529,153" 111262306a36Sopenharmony_ci "2-1533,1536,1540,1544,1548,1552,1556,1560,1564,1568-1569,1572-1573,1576-1577,1580-1581,1584-1585,1588-1589,1592-" 111362306a36Sopenharmony_ci "1593,1596-1597,1600,1604,1608,1612,1616,1620,1624,1628,1632-1633,1636-1637,1640-1641,1644-1645,1648-1649,1652-16" 111462306a36Sopenharmony_ci "53,1656-1657,1660-1661,1664,1668,1672,1676,1680,1684,1688,1692,1696-1697,1700-1701,1704-1705,1708-1709,1712-1713" 111562306a36Sopenharmony_ci ",1716-1717,1720-1721,1724-1725,1728,1732,1736,1740,1744,1748,1752,1756,1760-1761,1764-1765,1768-1769,1772-1773,1" 111662306a36Sopenharmony_ci "776-1777,1780-1781,1784-1785,1788-1789,1792,1796,1800,1804,1808,1812,1816,1820,1824-1825,1828-1829,1832-1833,183" 111762306a36Sopenharmony_ci "6-1837,1840-1841,1844-1845,1848-1849,1852-1853,1856,1860,1864,1868,1872,1876,1880,1884,1888-1889,1892-1893,1896-" 111862306a36Sopenharmony_ci "1897,1900-1901,1904-1905,1908-1909,1912-1913,1916-1917,1920,1924,1928,1932,1936,1940,1944,1948,1952-1953,1956-19" 111962306a36Sopenharmony_ci "57,1960-1961,1964-1965,1968-1969,1972-1973,1976-1977,1980-1981,1984,1988,1992,1996,2000,2004,2008,2012,2016-2017" 112062306a36Sopenharmony_ci ",2020-2021,2024-2025,2028-2029,2032-2033,2036-2037,2040-2041,2044-2045,2048,2052,2056,2060,2064,2068,2072,2076,2" 112162306a36Sopenharmony_ci "080-2081,2084-2085,2088-2089,2092-2093,2096-2097,2100-2101,2104-2105,2108-2109,2112,2116,2120,2124,2128,2132,213" 112262306a36Sopenharmony_ci "6,2140,2144-2145,2148-2149,2152-2153,2156-2157,2160-2161,2164-2165,2168-2169,2172-2173,2176,2180,2184,2188,2192," 112362306a36Sopenharmony_ci "2196,2200,2204,2208-2209,2212-2213,2216-2217,2220-2221,2224-2225,2228-2229,2232-2233,2236-2237,2240,2244,2248,22" 112462306a36Sopenharmony_ci "52,2256,2260,2264,2268,2272-2273,2276-2277,2280-2281,2284-2285,2288-2289,2292-2293,2296-2297,2300-2301,2304,2308" 112562306a36Sopenharmony_ci ",2312,2316,2320,2324,2328,2332,2336-2337,2340-2341,2344-2345,2348-2349,2352-2353,2356-2357,2360-2361,2364-2365,2" 112662306a36Sopenharmony_ci "368,2372,2376,2380,2384,2388,2392,2396,2400-2401,2404-2405,2408-2409,2412-2413,2416-2417,2420-2421,2424-2425,242" 112762306a36Sopenharmony_ci "8-2429,2432,2436,2440,2444,2448,2452,2456,2460,2464-2465,2468-2469,2472-2473,2476-2477,2480-2481,2484-2485,2488-" 112862306a36Sopenharmony_ci "2489,2492-2493,2496,2500,2504,2508,2512,2516,2520,2524,2528-2529,2532-2533,2536-2537,2540-2541,2544-2545,2548-25" 112962306a36Sopenharmony_ci "49,2552-2553,2556-2557\n"; 113062306a36Sopenharmony_ci 113162306a36Sopenharmony_cistatic const struct test_bitmap_print test_print[] __initconst = { 113262306a36Sopenharmony_ci { small_bitmap, sizeof(small_bitmap) * BITS_PER_BYTE, small_mask, small_list }, 113362306a36Sopenharmony_ci { large_bitmap, sizeof(large_bitmap) * BITS_PER_BYTE, large_mask, large_list }, 113462306a36Sopenharmony_ci}; 113562306a36Sopenharmony_ci 113662306a36Sopenharmony_cistatic void __init test_bitmap_print_buf(void) 113762306a36Sopenharmony_ci{ 113862306a36Sopenharmony_ci int i; 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(test_print); i++) { 114162306a36Sopenharmony_ci const struct test_bitmap_print *t = &test_print[i]; 114262306a36Sopenharmony_ci int n; 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_ci n = bitmap_print_bitmask_to_buf(print_buf, t->bitmap, t->nbits, 114562306a36Sopenharmony_ci 0, 2 * PAGE_SIZE); 114662306a36Sopenharmony_ci expect_eq_uint(strlen(t->mask) + 1, n); 114762306a36Sopenharmony_ci expect_eq_str(t->mask, print_buf, n); 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_ci n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits, 115062306a36Sopenharmony_ci 0, 2 * PAGE_SIZE); 115162306a36Sopenharmony_ci expect_eq_uint(strlen(t->list) + 1, n); 115262306a36Sopenharmony_ci expect_eq_str(t->list, print_buf, n); 115362306a36Sopenharmony_ci 115462306a36Sopenharmony_ci /* test by non-zero offset */ 115562306a36Sopenharmony_ci if (strlen(t->list) > PAGE_SIZE) { 115662306a36Sopenharmony_ci n = bitmap_print_list_to_buf(print_buf, t->bitmap, t->nbits, 115762306a36Sopenharmony_ci PAGE_SIZE, PAGE_SIZE); 115862306a36Sopenharmony_ci expect_eq_uint(strlen(t->list) + 1 - PAGE_SIZE, n); 115962306a36Sopenharmony_ci expect_eq_str(t->list + PAGE_SIZE, print_buf, n); 116062306a36Sopenharmony_ci } 116162306a36Sopenharmony_ci } 116262306a36Sopenharmony_ci} 116362306a36Sopenharmony_ci 116462306a36Sopenharmony_ci/* 116562306a36Sopenharmony_ci * FIXME: Clang breaks compile-time evaluations when KASAN and GCOV are enabled. 116662306a36Sopenharmony_ci * To workaround it, GCOV is force-disabled in Makefile for this configuration. 116762306a36Sopenharmony_ci */ 116862306a36Sopenharmony_cistatic void __init test_bitmap_const_eval(void) 116962306a36Sopenharmony_ci{ 117062306a36Sopenharmony_ci DECLARE_BITMAP(bitmap, BITS_PER_LONG); 117162306a36Sopenharmony_ci unsigned long initvar = BIT(2); 117262306a36Sopenharmony_ci unsigned long bitopvar = 0; 117362306a36Sopenharmony_ci unsigned long var = 0; 117462306a36Sopenharmony_ci int res; 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci /* 117762306a36Sopenharmony_ci * Compilers must be able to optimize all of those to compile-time 117862306a36Sopenharmony_ci * constants on any supported optimization level (-O2, -Os) and any 117962306a36Sopenharmony_ci * architecture. Otherwise, trigger a build bug. 118062306a36Sopenharmony_ci * The whole function gets optimized out then, there's nothing to do 118162306a36Sopenharmony_ci * in runtime. 118262306a36Sopenharmony_ci */ 118362306a36Sopenharmony_ci 118462306a36Sopenharmony_ci /* 118562306a36Sopenharmony_ci * Equals to `unsigned long bitmap[1] = { GENMASK(6, 5), }`. 118662306a36Sopenharmony_ci * Clang on s390 optimizes bitops at compile-time as intended, but at 118762306a36Sopenharmony_ci * the same time stops treating @bitmap and @bitopvar as compile-time 118862306a36Sopenharmony_ci * constants after regular test_bit() is executed, thus triggering the 118962306a36Sopenharmony_ci * build bugs below. So, call const_test_bit() there directly until 119062306a36Sopenharmony_ci * the compiler is fixed. 119162306a36Sopenharmony_ci */ 119262306a36Sopenharmony_ci bitmap_clear(bitmap, 0, BITS_PER_LONG); 119362306a36Sopenharmony_ci if (!test_bit(7, bitmap)) 119462306a36Sopenharmony_ci bitmap_set(bitmap, 5, 2); 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci /* Equals to `unsigned long bitopvar = BIT(20)` */ 119762306a36Sopenharmony_ci __change_bit(31, &bitopvar); 119862306a36Sopenharmony_ci bitmap_shift_right(&bitopvar, &bitopvar, 11, BITS_PER_LONG); 119962306a36Sopenharmony_ci 120062306a36Sopenharmony_ci /* Equals to `unsigned long var = BIT(25)` */ 120162306a36Sopenharmony_ci var |= BIT(25); 120262306a36Sopenharmony_ci if (var & BIT(0)) 120362306a36Sopenharmony_ci var ^= GENMASK(9, 6); 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_ci /* __const_hweight<32|64>(GENMASK(6, 5)) == 2 */ 120662306a36Sopenharmony_ci res = bitmap_weight(bitmap, 20); 120762306a36Sopenharmony_ci BUILD_BUG_ON(!__builtin_constant_p(res)); 120862306a36Sopenharmony_ci BUILD_BUG_ON(res != 2); 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_ci /* !(BIT(31) & BIT(18)) == 1 */ 121162306a36Sopenharmony_ci res = !test_bit(18, &bitopvar); 121262306a36Sopenharmony_ci BUILD_BUG_ON(!__builtin_constant_p(res)); 121362306a36Sopenharmony_ci BUILD_BUG_ON(!res); 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_ci /* BIT(2) & GENMASK(14, 8) == 0 */ 121662306a36Sopenharmony_ci res = initvar & GENMASK(14, 8); 121762306a36Sopenharmony_ci BUILD_BUG_ON(!__builtin_constant_p(res)); 121862306a36Sopenharmony_ci BUILD_BUG_ON(res); 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci /* ~BIT(25) */ 122162306a36Sopenharmony_ci BUILD_BUG_ON(!__builtin_constant_p(~var)); 122262306a36Sopenharmony_ci BUILD_BUG_ON(~var != ~BIT(25)); 122362306a36Sopenharmony_ci} 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_cistatic void __init selftest(void) 122662306a36Sopenharmony_ci{ 122762306a36Sopenharmony_ci test_zero_clear(); 122862306a36Sopenharmony_ci test_fill_set(); 122962306a36Sopenharmony_ci test_copy(); 123062306a36Sopenharmony_ci test_replace(); 123162306a36Sopenharmony_ci test_bitmap_arr32(); 123262306a36Sopenharmony_ci test_bitmap_arr64(); 123362306a36Sopenharmony_ci test_bitmap_parse(); 123462306a36Sopenharmony_ci test_bitmap_parselist(); 123562306a36Sopenharmony_ci test_bitmap_printlist(); 123662306a36Sopenharmony_ci test_mem_optimisations(); 123762306a36Sopenharmony_ci test_bitmap_cut(); 123862306a36Sopenharmony_ci test_bitmap_print_buf(); 123962306a36Sopenharmony_ci test_bitmap_const_eval(); 124062306a36Sopenharmony_ci 124162306a36Sopenharmony_ci test_find_nth_bit(); 124262306a36Sopenharmony_ci test_for_each_set_bit(); 124362306a36Sopenharmony_ci test_for_each_set_bit_from(); 124462306a36Sopenharmony_ci test_for_each_clear_bit(); 124562306a36Sopenharmony_ci test_for_each_clear_bit_from(); 124662306a36Sopenharmony_ci test_for_each_set_bitrange(); 124762306a36Sopenharmony_ci test_for_each_clear_bitrange(); 124862306a36Sopenharmony_ci test_for_each_set_bitrange_from(); 124962306a36Sopenharmony_ci test_for_each_clear_bitrange_from(); 125062306a36Sopenharmony_ci test_for_each_set_clump8(); 125162306a36Sopenharmony_ci test_for_each_set_bit_wrap(); 125262306a36Sopenharmony_ci} 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_ciKSTM_MODULE_LOADERS(test_bitmap); 125562306a36Sopenharmony_ciMODULE_AUTHOR("david decotigny <david.decotigny@googlers.com>"); 125662306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 1257