1 /*
2 * Copyright (c) 2016,2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #include <errno.h>
7
8 #include <zephyr/kernel.h>
9 #include <zephyr/ztest.h>
10 #include <zephyr/arch/cpu.h>
11
12 #include <zephyr/tc_util.h>
13 #include <zephyr/sys/bitarray.h>
14 #include <zephyr/sys/util.h>
15
16 #ifdef CONFIG_BIG_ENDIAN
17 #define BIT_INDEX(bit) ((3 - ((bit >> 3) & 0x3)) + 4*(bit >> 5))
18 #else
19 #define BIT_INDEX(bit) (bit >> 3)
20 #endif
21 #define BIT_VAL(bit) (1 << (bit & 0x7))
22 #define BITFIELD_SIZE 512
23
24 /**
25 * @defgroup kernel_bitarray_tests Bit Arrays
26 * @ingroup all_tests
27 * @{
28 * @}
29 *
30 * @addtogroup kernel_bitarray_tests
31 * @{
32 */
33
34 /* Helper function to compare two bitarrays */
cmp_u32_arrays(uint32_t * a1,uint32_t * a2,size_t sz)35 static bool cmp_u32_arrays(uint32_t *a1, uint32_t *a2, size_t sz)
36 {
37 bool are_equal = true;
38 size_t i;
39
40 for (i = 0; i < sz; i++) {
41 if (a1[i] != a2[i]) {
42 are_equal = false;
43 printk("%s: [%zu] 0x%x != 0x%x", __func__,
44 i, a1[i], a2[i]);
45 break;
46 }
47 }
48
49 return are_equal;
50 }
51
52 #define FAIL_ALLOC_MSG_FMT "sys_bitarray_alloc with region size %i allocated incorrectly"
53 #define FAIL_ALLOC_RET_MSG_FMT "sys_bitarray_alloc with region size %i returned incorrect result"
54 #define FAIL_ALLOC_OFFSET_MSG_FMT "sys_bitarray_alloc with region size %i gave incorrect offset"
55 #define FAIL_FREE_MSG_FMT "sys_bitarray_free with region size %i and offset %i failed"
56 #define FREE 0U
57
validate_bitarray_define(sys_bitarray_t * ba,size_t num_bits)58 void validate_bitarray_define(sys_bitarray_t *ba, size_t num_bits)
59 {
60 size_t num_bundles;
61 int i;
62
63 num_bundles = ROUND_UP(ROUND_UP(num_bits, 8) / 8, sizeof(uint32_t))
64 / sizeof(uint32_t);
65
66 zassert_equal(ba->num_bits, num_bits,
67 "SYS_BITARRAY_DEFINE num_bits expected %zu, got %u",
68 num_bits, ba->num_bits);
69
70 zassert_equal(ba->num_bundles, num_bundles,
71 "SYS_BITARRAY_DEFINE num_bundles expected %zu, got %u",
72 num_bundles, ba->num_bundles);
73
74 for (i = 0; i < num_bundles; i++) {
75 zassert_equal(ba->bundles[i], FREE,
76 "SYS_BITARRAY_DEFINE bundles[%u] not free for num_bits %zu",
77 i, num_bits);
78 }
79 }
80
81 /**
82 * @brief Test defining of bitarrays
83 *
84 * @see SYS_BITARRAY_DEFINE()
85 */
ZTEST(bitarray,test_bitarray_declare)86 ZTEST(bitarray, test_bitarray_declare)
87 {
88 SYS_BITARRAY_DEFINE(ba_1_bit, 1);
89 SYS_BITARRAY_DEFINE(ba_32_bit, 32);
90 SYS_BITARRAY_DEFINE(ba_33_bit, 33);
91 SYS_BITARRAY_DEFINE(ba_64_bit, 64);
92 SYS_BITARRAY_DEFINE(ba_65_bit, 65);
93 SYS_BITARRAY_DEFINE(ba_128_bit, 128);
94 SYS_BITARRAY_DEFINE(ba_129_bit, 129);
95
96 /* Test SYS_BITFIELD_DECLARE by asserting that a sufficient number of uint32_t
97 * in the declared array are set as free to represent the number of bits
98 */
99
100 validate_bitarray_define(&ba_1_bit, 1);
101 validate_bitarray_define(&ba_32_bit, 32);
102 validate_bitarray_define(&ba_33_bit, 33);
103 validate_bitarray_define(&ba_64_bit, 64);
104 validate_bitarray_define(&ba_65_bit, 65);
105 validate_bitarray_define(&ba_128_bit, 128);
106 validate_bitarray_define(&ba_129_bit, 129);
107 }
108
bitarray_bundles_is_zero(sys_bitarray_t * ba)109 bool bitarray_bundles_is_zero(sys_bitarray_t *ba)
110 {
111 bool ret = true;
112 unsigned int i;
113
114 for (i = 0; i < ba->num_bundles; i++) {
115 if (ba->bundles[i] != 0) {
116 ret = false;
117 break;
118 }
119 }
120
121 return ret;
122 }
123
124 /**
125 * @brief Test bitarrays set and clear
126 *
127 * @see sys_bitarray_set_bit()
128 * @see sys_bitarray_clear_bit()
129 * @see sys_bitarray_test_bit()
130 * @see sys_bitarray_test_and_set_bit()
131 * @see sys_bitarray_test_and_clear_bit()
132 */
ZTEST(bitarray,test_bitarray_set_clear)133 ZTEST(bitarray, test_bitarray_set_clear)
134 {
135 int ret;
136 int bit_val;
137 size_t bit, bundle_idx, bit_idx_in_bundle;
138
139 /* Bitarrays have embedded spinlocks and can't on the stack. */
140 if (IS_ENABLED(CONFIG_KERNEL_COHERENCE)) {
141 ztest_test_skip();
142 }
143
144 SYS_BITARRAY_DEFINE(ba, 234);
145
146 for (bit = 0U; bit < ba.num_bits; ++bit) {
147 bundle_idx = bit / (sizeof(ba.bundles[0]) * 8);
148 bit_idx_in_bundle = bit % (sizeof(ba.bundles[0]) * 8);
149
150 ret = sys_bitarray_set_bit(&ba, bit);
151 zassert_equal(ret, 0,
152 "sys_bitarray_set_bit failed on bit %zu", bit);
153 zassert_equal(ba.bundles[bundle_idx], BIT(bit_idx_in_bundle),
154 "sys_bitarray_set_bit did not set bit %zu\n", bit);
155 zassert_not_equal(sys_bitfield_test_bit((mem_addr_t)ba.bundles, bit),
156 0, "sys_bitarray_set_bit did not set bit %zu\n", bit);
157
158 ret = sys_bitarray_test_bit(&ba, bit, &bit_val);
159 zassert_equal(ret, 0,
160 "sys_bitarray_test_bit failed at bit %zu", bit);
161 zassert_equal(bit_val, 1,
162 "sys_bitarray_test_bit did not detect bit %zu\n", bit);
163
164 ret = sys_bitarray_clear_bit(&ba, bit);
165 zassert_equal(ret, 0,
166 "sys_bitarray_clear_bit failed at bit %zu", bit);
167 zassert_equal(ba.bundles[bundle_idx], 0,
168 "sys_bitarray_clear_bit did not clear bit %zu\n", bit);
169 zassert_equal(sys_bitfield_test_bit((mem_addr_t)ba.bundles, bit),
170 0, "sys_bitarray_set_bit did not set bit %zu\n", bit);
171
172 ret = sys_bitarray_test_bit(&ba, bit, &bit_val);
173 zassert_equal(ret, 0,
174 "sys_bitarray_test_bit failed at bit %zu", bit);
175 zassert_equal(bit_val, 0,
176 "sys_bitarray_test_bit erroneously detected bit %zu\n",
177 bit);
178
179 ret = sys_bitarray_test_and_set_bit(&ba, bit, &bit_val);
180 zassert_equal(ret, 0,
181 "sys_bitarray_test_and_set_bit failed at bit %zu", bit);
182 zassert_equal(bit_val, 0,
183 "sys_bitarray_test_and_set_bit erroneously detected bit %zu\n",
184 bit);
185 zassert_equal(ba.bundles[bundle_idx], BIT(bit_idx_in_bundle),
186 "sys_bitarray_test_and_set_bit did not set bit %zu\n", bit);
187 zassert_not_equal(sys_bitfield_test_bit((mem_addr_t)ba.bundles, bit),
188 0, "sys_bitarray_set_bit did not set bit %zu\n", bit);
189
190 ret = sys_bitarray_test_and_set_bit(&ba, bit, &bit_val);
191 zassert_equal(ret, 0,
192 "sys_bitarray_test_and_set_bit failed at bit %zu", bit);
193 zassert_equal(bit_val, 1,
194 "sys_bitarray_test_and_set_bit did not detect bit %zu\n",
195 bit);
196 zassert_equal(ba.bundles[bundle_idx], BIT(bit_idx_in_bundle),
197 "sys_bitarray_test_and_set_bit cleared bit %zu\n", bit);
198 zassert_not_equal(sys_bitfield_test_bit((mem_addr_t)ba.bundles, bit),
199 0, "sys_bitarray_set_bit did not set bit %zu\n", bit);
200
201 ret = sys_bitarray_test_and_clear_bit(&ba, bit, &bit_val);
202 zassert_equal(ret, 0,
203 "sys_bitarray_test_and_clear_bit failed at bit %zu", bit);
204 zassert_equal(bit_val, 1,
205 "sys_bitarray_test_and_clear_bit did not detect bit %zu\n",
206 bit);
207 zassert_equal(ba.bundles[bundle_idx], 0,
208 "sys_bitarray_test_and_clear_bit did not clear bit %zu\n",
209 bit);
210 zassert_equal(sys_bitfield_test_bit((mem_addr_t)ba.bundles, bit),
211 0, "sys_bitarray_set_bit did not set bit %zu\n", bit);
212
213 ret = sys_bitarray_test_and_clear_bit(&ba, bit, &bit_val);
214 zassert_equal(ret, 0,
215 "sys_bitarray_test_and_clear_bit failed at bit %zu", bit);
216 zassert_equal(bit_val, 0,
217 "sys_bitarray_test_and_clear_bit erroneously detected bit %zu\n",
218 bit);
219 zassert_equal(ba.bundles[bundle_idx], 0,
220 "sys_bitarray_test_and_clear_bit set bit %zu\n",
221 bit);
222 zassert_equal(sys_bitfield_test_bit((mem_addr_t)ba.bundles, bit),
223 0, "sys_bitarray_set_bit did not set bit %zu\n", bit);
224 }
225
226 /* All this should fail because we go outside of
227 * total bits in bit array. Also needs to make sure bits
228 * are not changed.
229 */
230 ret = sys_bitarray_set_bit(&ba, ba.num_bits);
231 zassert_not_equal(ret, 0, "sys_bitarray_set_bit() should fail but not");
232 zassert_true(bitarray_bundles_is_zero(&ba),
233 "sys_bitarray_set_bit() erroneously changed bitarray");
234
235 ret = sys_bitarray_clear_bit(&ba, ba.num_bits);
236 zassert_not_equal(ret, 0, "sys_bitarray_clear_bit() should fail but not");
237 zassert_true(bitarray_bundles_is_zero(&ba),
238 "sys_bitarray_clear_bit() erroneously changed bitarray");
239
240 ret = sys_bitarray_test_bit(&ba, ba.num_bits, &bit_val);
241 zassert_not_equal(ret, 0, "sys_bitarray_test_bit() should fail but not");
242 zassert_true(bitarray_bundles_is_zero(&ba),
243 "sys_bitarray_test_bit() erroneously changed bitarray");
244
245 ret = sys_bitarray_test_and_set_bit(&ba, ba.num_bits, &bit_val);
246 zassert_not_equal(ret, 0,
247 "sys_bitarray_test_and_set_bit() should fail but not");
248 zassert_true(bitarray_bundles_is_zero(&ba),
249 "sys_bitarray_test_and_set_bit() erroneously changed bitarray");
250
251 ret = sys_bitarray_test_and_clear_bit(&ba, ba.num_bits, &bit_val);
252 zassert_not_equal(ret, 0,
253 "sys_bitarray_test_and_clear_bit() should fail but not");
254 zassert_true(bitarray_bundles_is_zero(&ba),
255 "sys_bitarray_test_and_clear_bit() erroneously changed bitarray");
256
257 ret = sys_bitarray_set_bit(&ba, -1);
258 zassert_not_equal(ret, 0, "sys_bitarray_set_bit() should fail but not");
259 zassert_true(bitarray_bundles_is_zero(&ba),
260 "sys_bitarray_set_bit() erroneously changed bitarray");
261
262 ret = sys_bitarray_clear_bit(&ba, -1);
263 zassert_not_equal(ret, 0, "sys_bitarray_clear_bit() should fail but not");
264 zassert_true(bitarray_bundles_is_zero(&ba),
265 "sys_bitarray_clear_bit() erroneously changed bitarray");
266
267 ret = sys_bitarray_test_bit(&ba, -1, &bit_val);
268 zassert_not_equal(ret, 0, "sys_bitarray_test_bit() should fail but not");
269 zassert_true(bitarray_bundles_is_zero(&ba),
270 "sys_bitarray_test_bit() erroneously changed bitarray");
271
272 ret = sys_bitarray_test_and_set_bit(&ba, -1, &bit_val);
273 zassert_not_equal(ret, 0,
274 "sys_bitarray_test_and_set_bit() should fail but not");
275 zassert_true(bitarray_bundles_is_zero(&ba),
276 "sys_bitarray_test_and_set_bit() erroneously changed bitarray");
277
278 ret = sys_bitarray_test_and_clear_bit(&ba, -1, &bit_val);
279 zassert_not_equal(ret, 0,
280 "sys_bitarray_test_and_clear_bit() should fail but not");
281 zassert_true(bitarray_bundles_is_zero(&ba),
282 "sys_bitarray_test_and_clear_bit() erroneously changed bitarray");
283 }
284
test_alloc_free_32(uint32_t mask,uint32_t mask_after,size_t num_bits,size_t exp_offset,int exp_ret)285 static void test_alloc_free_32(uint32_t mask, uint32_t mask_after, size_t num_bits,
286 size_t exp_offset, int exp_ret)
287 {
288 int ret;
289 size_t offset;
290
291 SYS_BITARRAY_DEFINE(ba_32, 32);
292
293 ba_32.bundles[0] = mask;
294
295 ret = sys_bitarray_alloc(&ba_32, num_bits, &offset);
296 zassert_equal(ret, exp_ret, "sys_bitarray_alloc() failed: %d", ret);
297 if (exp_ret < 0) {
298 return;
299 }
300 zassert_equal(offset, exp_offset,
301 "sys_bitarray_alloc() offset expected %zu, got %zu", exp_offset, offset);
302 zassert_equal(ba_32.bundles[0], mask_after, "sys_bitarray_alloc() failed bits comparison");
303
304 ret = sys_bitarray_free(&ba_32, num_bits, offset);
305 zassert_equal(ret, 0, "sys_bitarray_free() failed: %d", ret);
306 zassert_equal(ba_32.bundles[0], mask, "sys_bitarray_alloc() failed bits comparison");
307 }
308
alloc_and_free_32_predefined(void)309 static void alloc_and_free_32_predefined(void)
310 {
311 printk("Testing bit array alloc and free with predefined patterns using 32 bit array\n");
312
313 test_alloc_free_32(0x0F0F070F, 0x0F0FFF0F, 5, 11, 0);
314 test_alloc_free_32(0x33333333, 0xF3333333, 3, 0, -ENOSPC);
315 test_alloc_free_32(0x33333333, 0xF3333333, 2, 30, 0);
316 }
317
alloc_and_free_predefined(void)318 void alloc_and_free_predefined(void)
319 {
320 int ret;
321 size_t offset;
322
323 uint32_t ba_128_expected[4];
324
325 SYS_BITARRAY_DEFINE(ba_128, 128);
326
327 printk("Testing bit array alloc and free with predefined patterns using 128 bit array\n");
328
329 /* Pre-populate the bits */
330 ba_128.bundles[0] = 0x0F0F070F;
331 ba_128.bundles[1] = 0x0F0F0F0F;
332 ba_128.bundles[2] = 0x0F0F0F0F;
333 ba_128.bundles[3] = 0x0F0F0000;
334
335 /* Expected values */
336 ba_128_expected[0] = 0x0F0FFF0F;
337 ba_128_expected[1] = 0x0F0F0F0F;
338 ba_128_expected[2] = 0x0F0F0F0F;
339 ba_128_expected[3] = 0x0F0F0000;
340
341 ret = sys_bitarray_alloc(&ba_128, 5, &offset);
342 zassert_equal(ret, 0, "sys_bitarray_alloc() failed: %d", ret);
343 zassert_equal(offset, 11, "sys_bitarray_alloc() offset expected %d, got %zu", 11, offset);
344 zassert_true(cmp_u32_arrays(ba_128.bundles, ba_128_expected, ba_128.num_bundles),
345 "sys_bitarray_alloc() failed bits comparison");
346
347 ret = sys_bitarray_alloc(&ba_128, 16, &offset);
348 ba_128_expected[2] = 0xFF0F0F0F;
349 ba_128_expected[3] = 0x0F0F0FFF;
350 zassert_equal(ret, 0, "sys_bitarray_alloc() failed: %d", ret);
351 zassert_equal(offset, 92, "sys_bitarray_alloc() offset expected %d, got %zu", 92, offset);
352 zassert_true(cmp_u32_arrays(ba_128.bundles, ba_128_expected, ba_128.num_bundles),
353 "sys_bitarray_alloc() failed bits comparison");
354
355 ret = sys_bitarray_free(&ba_128, 5, 11);
356 ba_128_expected[0] = 0x0F0F070F;
357 zassert_equal(ret, 0, "sys_bitarray_free() failed: %d", ret);
358 zassert_true(cmp_u32_arrays(ba_128.bundles, ba_128_expected, ba_128.num_bundles),
359 "sys_bitarray_free() failed bits comparison");
360
361 ret = sys_bitarray_free(&ba_128, 5, 0);
362 zassert_not_equal(ret, 0, "sys_bitarray_free() should fail but not");
363 zassert_true(cmp_u32_arrays(ba_128.bundles, ba_128_expected, ba_128.num_bundles),
364 "sys_bitarray_free() failed bits comparison");
365
366 ret = sys_bitarray_free(&ba_128, 24, 92);
367 zassert_not_equal(ret, 0, "sys_bitarray_free() should fail but not");
368 zassert_true(cmp_u32_arrays(ba_128.bundles, ba_128_expected, ba_128.num_bundles),
369 "sys_bitarray_free() failed bits comparison");
370
371 ret = sys_bitarray_free(&ba_128, 16, 92);
372 ba_128_expected[2] = 0x0F0F0F0F;
373 ba_128_expected[3] = 0x0F0F0000;
374 zassert_equal(ret, 0, "sys_bitarray_free() failed: %d", ret);
375 zassert_true(cmp_u32_arrays(ba_128.bundles, ba_128_expected, ba_128.num_bundles),
376 "sys_bitarray_free() failed bits comparison");
377
378 /* test in-between bundles */
379 ba_128.bundles[0] = 0x7FFFFFFF;
380 ba_128.bundles[1] = 0xFFFFFFFF;
381 ba_128.bundles[2] = 0x00000000;
382 ba_128.bundles[3] = 0x00000000;
383
384 ba_128_expected[0] = 0x7FFFFFFF;
385 ba_128_expected[1] = 0xFFFFFFFF;
386 ba_128_expected[2] = 0xFFFFFFFF;
387 ba_128_expected[3] = 0x00000003;
388
389 ret = sys_bitarray_alloc(&ba_128, 34, &offset);
390 zassert_equal(ret, 0, "sys_bitarray_alloc() failed: %d", ret);
391 zassert_equal(offset, 64, "sys_bitarray_alloc() offset expected %d, got %zu", 64, offset);
392 zassert_true(cmp_u32_arrays(ba_128.bundles, ba_128_expected, ba_128.num_bundles),
393 "sys_bitarray_alloc() failed bits comparison");
394 }
395
get_bitarray_popcnt(sys_bitarray_t * ba)396 size_t get_bitarray_popcnt(sys_bitarray_t *ba)
397 {
398 size_t popcnt = 0;
399 unsigned int idx;
400
401 for (idx = 0; idx < ba->num_bundles; idx++) {
402 popcnt += sys_count_bits(&ba->bundles[idx], sizeof(uint32_t));
403 }
404
405 return popcnt;
406 }
407
alloc_and_free_loop(int divisor)408 void alloc_and_free_loop(int divisor)
409 {
410 int ret;
411 size_t offset;
412 size_t bit;
413 size_t num_bits;
414 size_t cur_popcnt;
415 size_t expected_popcnt = 0;
416
417 SYS_BITARRAY_DEFINE(ba, 234);
418
419 printk("Testing bit array alloc and free with divisor %d\n", divisor);
420
421 for (bit = 0U; bit < ba.num_bits; ++bit) {
422 cur_popcnt = get_bitarray_popcnt(&ba);
423 zassert_equal(cur_popcnt, expected_popcnt,
424 "bit count expected %zu, got %zu (at bit %zu)",
425 expected_popcnt, cur_popcnt, bit);
426
427 /* Allocate half of remaining bits */
428 num_bits = (ba.num_bits - bit) / divisor;
429
430 ret = sys_bitarray_alloc(&ba, num_bits, &offset);
431 if (num_bits == 0) {
432 zassert_not_equal(ret, 0,
433 "sys_bitarray_free() should fail but not (bit %zu)",
434 bit);
435 } else {
436 zassert_equal(ret, 0,
437 "sys_bitarray_alloc() failed (%d) at bit %zu",
438 ret, bit);
439 zassert_equal(offset, bit,
440 "sys_bitarray_alloc() offset expected %zu, got %zu",
441 bit, offset);
442
443 expected_popcnt += num_bits;
444 }
445
446 cur_popcnt = get_bitarray_popcnt(&ba);
447 zassert_equal(cur_popcnt, expected_popcnt,
448 "bit count expected %zu, got %zu (at bit %zu)",
449 expected_popcnt, cur_popcnt, bit);
450
451 /* Free all but the first bit of allocated region */
452 ret = sys_bitarray_free(&ba, (num_bits - 1), (bit + 1));
453 if ((num_bits == 0) || ((num_bits - 1) == 0)) {
454 zassert_not_equal(ret, 0,
455 "sys_bitarray_free() should fail but not (bit %zu)",
456 bit);
457 } else {
458 zassert_equal(ret, 0,
459 "sys_bitarray_free() failed (%d) at bit %zu",
460 ret, (bit + 1));
461
462 expected_popcnt -= num_bits - 1;
463 }
464 }
465 }
466
alloc_and_free_interval(void)467 void alloc_and_free_interval(void)
468 {
469 int ret;
470 size_t cnt;
471 size_t offset;
472 size_t expected_offset;
473 size_t expected_popcnt, cur_popcnt;
474
475 /* Make sure number of bits is multiple of 8 */
476 SYS_BITARRAY_DEFINE(ba, 152);
477
478 printk("Testing bit array interval alloc and free\n");
479
480 /* Pre-populate the bits so that 4-bit already allocated,
481 * then 4 free bits, and repeat.
482 */
483 for (cnt = 0; cnt < ba.num_bundles; cnt++) {
484 ba.bundles[cnt] = 0x0F0F0F0F;
485 }
486
487 expected_offset = 4;
488 expected_popcnt = get_bitarray_popcnt(&ba);
489 for (cnt = 0; cnt <= (ba.num_bits / 8); cnt++) {
490
491 ret = sys_bitarray_alloc(&ba, 4, &offset);
492 if (cnt == (ba.num_bits / 8)) {
493 zassert_not_equal(ret, 0,
494 "sys_bitarray_free() should fail but not (cnt %zu)",
495 cnt);
496 } else {
497 zassert_equal(ret, 0,
498 "sys_bitarray_alloc() failed (%d) (cnt %zu)",
499 ret, cnt);
500
501 zassert_equal(offset, expected_offset,
502 "offset expected %zu, got %zu (cnt %zu)",
503 expected_offset, offset, cnt);
504
505 expected_popcnt += 4;
506
507 cur_popcnt = get_bitarray_popcnt(&ba);
508 zassert_equal(cur_popcnt, expected_popcnt,
509 "bit count expected %zu, got %zu (cnt %zu)",
510 expected_popcnt, cur_popcnt, cnt);
511
512
513 expected_offset += 8;
514 }
515 }
516 }
517
518 /**
519 * @brief Test bitarrays allocation and free
520 *
521 * @see sys_bitarray_alloc()
522 * @see sys_bitarray_free()
523 */
ZTEST(bitarray,test_bitarray_alloc_free)524 ZTEST(bitarray, test_bitarray_alloc_free)
525 {
526 int i;
527
528 /* Bitarrays have embedded spinlocks and can't on the stack. */
529 if (IS_ENABLED(CONFIG_KERNEL_COHERENCE)) {
530 ztest_test_skip();
531 }
532
533 alloc_and_free_predefined();
534 alloc_and_free_32_predefined();
535
536 i = 1;
537 while (i < 65) {
538 alloc_and_free_loop(i);
539
540 i *= 2;
541 }
542
543 alloc_and_free_interval();
544 }
545
ZTEST(bitarray,test_bitarray_popcount_region)546 ZTEST(bitarray, test_bitarray_popcount_region)
547 {
548 int ret;
549 size_t count;
550
551 /* Bitarrays have embedded spinlocks and can't on the stack. */
552 if (IS_ENABLED(CONFIG_KERNEL_COHERENCE)) {
553 ztest_test_skip();
554 }
555
556 SYS_BITARRAY_DEFINE(ba, 128);
557
558 printk("Testing bit array region popcount spanning single bundle\n");
559
560 /* Pre-populate the bits */
561 ba.bundles[0] = 0x00000005;
562 ba.bundles[1] = 0x00000000;
563 ba.bundles[2] = 0x00000000;
564 ba.bundles[3] = 0x00000000;
565
566 ret = sys_bitarray_popcount_region(&ba, 1, 0, &count);
567 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
568 zassert_equal(count, 1, "sys_bitarray_popcount_region() returned unexpected count: %zu",
569 count);
570
571 ret = sys_bitarray_popcount_region(&ba, 1, 1, &count);
572 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
573 zassert_equal(count, 0, "sys_bitarray_popcount_region() returned unexpected count: %zu",
574 count);
575
576 ret = sys_bitarray_popcount_region(&ba, 2, 0, &count);
577 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
578 zassert_equal(count, 1, "sys_bitarray_popcount_region() returned unexpected count: %zu",
579 count);
580
581 ret = sys_bitarray_popcount_region(&ba, 3, 0, &count);
582 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
583 zassert_equal(count, 2, "sys_bitarray_popcount_region() returned unexpected count: %zu",
584 count);
585
586 ret = sys_bitarray_popcount_region(&ba, 3, 1, &count);
587 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
588 zassert_equal(count, 1, "sys_bitarray_popcount_region() returned unexpected count: %zu",
589 count);
590
591 printk("Testing bit array region popcount spanning multiple bundles\n");
592
593 /* Pre-populate the bits.
594 * First and last bit of bitarray are set
595 */
596 ba.bundles[0] = 0x00000001;
597 ba.bundles[1] = 0x00000000;
598 ba.bundles[2] = 0x00000000;
599 ba.bundles[3] = 0x80000000;
600
601 ret = sys_bitarray_popcount_region(&ba, 126, 1, &count);
602 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
603 zassert_equal(count, 0, "sys_bitarray_popcount_region() returned unexpected count: %zu",
604 count);
605
606 ret = sys_bitarray_popcount_region(&ba, 126, 0, &count);
607 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
608 zassert_equal(count, 1, "sys_bitarray_popcount_region() returned unexpected count: %zu",
609 count);
610
611 ret = sys_bitarray_popcount_region(&ba, 127, 1, &count);
612 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
613 zassert_equal(count, 1, "sys_bitarray_popcount_region() returned unexpected count: %zu",
614 count);
615 ret = sys_bitarray_popcount_region(&ba, 1, 127, &count);
616 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
617 zassert_equal(count, 1, "sys_bitarray_popcount_region() returned unexpected count: %zu",
618 count);
619
620 ret = sys_bitarray_popcount_region(&ba, 128, 0, &count);
621 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
622 zassert_equal(count, 2, "sys_bitarray_popcount_region() returned unexpected count: %zu",
623 count);
624
625 printk("Testing edge/error cases\n");
626 ret = sys_bitarray_popcount_region(&ba, 0, 0, &count);
627 zassert_equal(ret, -EINVAL, "sys_bitarray_popcount_region() returned unexpected value: %d",
628 ret);
629 ret = sys_bitarray_popcount_region(&ba, 0, 128, &count);
630 zassert_equal(ret, -EINVAL, "sys_bitarray_popcount_region() returned unexpected value: %d",
631 ret);
632 ret = sys_bitarray_popcount_region(&ba, 128, 0, &count);
633 zassert_equal(ret, 0, "sys_bitarray_popcount_region() returned unexpected value: %d", ret);
634
635 ret = sys_bitarray_popcount_region(&ba, 128, 1, &count);
636 zassert_equal(ret, -EINVAL, "sys_bitarray_popcount_region() returned unexpected value: %d",
637 ret);
638 ret = sys_bitarray_popcount_region(&ba, 129, 0, &count);
639 zassert_equal(ret, -EINVAL, "sys_bitarray_popcount_region() returned unexpected value: %d",
640 ret);
641 }
642
ZTEST(bitarray,test_bitarray_xor)643 ZTEST(bitarray, test_bitarray_xor)
644 {
645 int ret;
646
647 /* Bitarrays have embedded spinlocks and can't on the stack. */
648 if (IS_ENABLED(CONFIG_KERNEL_COHERENCE)) {
649 ztest_test_skip();
650 }
651
652 SYS_BITARRAY_DEFINE(ba, 128);
653 SYS_BITARRAY_DEFINE(bb, 128);
654 SYS_BITARRAY_DEFINE(bc, 129);
655
656 printk("Testing bit array region xor spanning single bundle\n");
657
658 /* Pre-populate the bits */
659 ba.bundles[0] = 0x80001001;
660 ba.bundles[1] = 0x10000008;
661 ba.bundles[2] = 0xFFFFFFFF;
662 ba.bundles[3] = 0x00000000;
663
664 bb.bundles[0] = 0x80010001;
665 bb.bundles[1] = 0x10000008;
666 bb.bundles[2] = 0xFFFFFFFF;
667 bb.bundles[3] = 0x00000000;
668
669 ret = sys_bitarray_xor(&ba, &bb, 32, 0);
670 zassert_equal(ret, 0, "sys_bitarray_xor() returned unexpected value: %d", ret);
671 zassert_equal(ba.bundles[0], 0x00011000, "sys_bitarray_xor() result unexpected: %x",
672 ba.bundles[0]);
673 zassert_equal(bb.bundles[0], 0x80010001, "sys_bitarray_xor() result unexpected: %x",
674 bb.bundles[0]);
675
676 zassert_equal(ba.bundles[1], 0x10000008, "sys_bitarray_xor() result unexpected: %x",
677 ba.bundles[1]);
678 zassert_equal(bb.bundles[1], 0x10000008, "sys_bitarray_xor() result unexpected: %x",
679 bb.bundles[1]);
680
681 zassert_equal(ba.bundles[2], 0xFFFFFFFF, "sys_bitarray_xor() result unexpected: %x",
682 ba.bundles[2]);
683 zassert_equal(bb.bundles[2], 0xFFFFFFFF, "sys_bitarray_xor() result unexpected: %x",
684 bb.bundles[2]);
685
686 zassert_equal(ba.bundles[3], 0x00000000, "sys_bitarray_xor() result unexpected: %x",
687 ba.bundles[3]);
688 zassert_equal(bb.bundles[3], 0x00000000, "sys_bitarray_xor() result unexpected: %x",
689 bb.bundles[3]);
690
691 /* Pre-populate the bits */
692 ba.bundles[0] = 0x80001001;
693 ba.bundles[1] = 0x10000008;
694 ba.bundles[2] = 0xFFFFFFFF;
695 ba.bundles[3] = 0x00000000;
696
697 bb.bundles[0] = 0x80010001;
698 bb.bundles[1] = 0x10000008;
699 bb.bundles[2] = 0xFFFFFFFF;
700 bb.bundles[3] = 0x00000000;
701
702 ret = sys_bitarray_xor(&ba, &bb, 16, 0);
703 zassert_equal(ret, 0, "sys_bitarray_xor() returned unexpected value: %d", ret);
704 zassert_equal(ba.bundles[0], 0x80001000, "sys_bitarray_xor() result unexpected: %x",
705 ba.bundles[0]);
706 zassert_equal(bb.bundles[0], 0x80010001, "sys_bitarray_xor() result unexpected: %x",
707 bb.bundles[0]);
708
709 /* Pre-populate the bits */
710 ba.bundles[0] = 0x80001001;
711 ba.bundles[1] = 0x10000008;
712 ba.bundles[2] = 0xFFFFFFFF;
713 ba.bundles[3] = 0x00000000;
714
715 bb.bundles[0] = 0x80010001;
716 bb.bundles[1] = 0x10000008;
717 bb.bundles[2] = 0xFFFFFFFF;
718 bb.bundles[3] = 0x00000000;
719
720 ret = sys_bitarray_xor(&ba, &bb, 16, 16);
721 zassert_equal(ret, 0, "sys_bitarray_xor() returned unexpected value: %d", ret);
722 zassert_equal(ba.bundles[0], 0x00011001, "sys_bitarray_xor() result unexpected: %x",
723 ba.bundles[0]);
724 zassert_equal(bb.bundles[0], 0x80010001, "sys_bitarray_xor() result unexpected: %x",
725 bb.bundles[0]);
726
727 printk("Testing bit array region xor spanning multiple bundles\n");
728
729 /* Pre-populate the bits */
730 ba.bundles[0] = 0x00000000;
731 ba.bundles[1] = 0xFFFFFFFF;
732 ba.bundles[2] = 0xFFFFFFFF;
733 ba.bundles[3] = 0xFFFFFFFF;
734
735 bb.bundles[0] = 0x00000000;
736 bb.bundles[1] = 0xFFFFFFFF;
737 bb.bundles[2] = 0xFFFFFFFF;
738 bb.bundles[3] = 0xFFFFFFFF;
739
740 ret = sys_bitarray_xor(&ba, &bb, 32*3 - 2, 32 + 1);
741 zassert_equal(ret, 0, "sys_bitarray_xor() returned unexpected value: %d", ret);
742 zassert_equal(ba.bundles[0], 0x00000000, "sys_bitarray_xor() result unexpected: %x",
743 ba.bundles[0]);
744 zassert_equal(ba.bundles[1], 0x00000001, "sys_bitarray_xor() result unexpected: %x",
745 ba.bundles[1]);
746 zassert_equal(ba.bundles[2], 0x00000000, "sys_bitarray_xor() result unexpected: %x",
747 ba.bundles[2]);
748 zassert_equal(ba.bundles[3], 0x80000000, "sys_bitarray_xor() result unexpected: %x",
749 ba.bundles[3]);
750
751 printk("Testing error cases\n");
752 /* Pre-populate the bits */
753 ba.bundles[0] = 0x00000000;
754 ba.bundles[1] = 0x00000000;
755 ba.bundles[2] = 0x00000000;
756 ba.bundles[3] = 0x00000000;
757
758 bb.bundles[0] = 0x00000000;
759 bb.bundles[1] = 0x00000000;
760 bb.bundles[2] = 0x00000000;
761 bb.bundles[3] = 0x00000000;
762
763 bc.bundles[0] = 0x00000000;
764 bc.bundles[1] = 0x00000000;
765 bc.bundles[2] = 0x00000000;
766 bc.bundles[3] = 0x00000000;
767 bc.bundles[4] = 0x00000000;
768
769 ret = sys_bitarray_xor(&ba, &bb, 32, 0);
770 zassert_equal(ret, 0, "sys_bitarray_xor() returned unexpected value: %d", ret);
771 ret = sys_bitarray_xor(&ba, &bc, 32, 0);
772 zassert_equal(ret, -EINVAL, "sys_bitarray_xor() returned unexpected value: %d", ret);
773 ret = sys_bitarray_xor(&bc, &ba, 32, 0);
774 zassert_equal(ret, -EINVAL, "sys_bitarray_xor() returned unexpected value: %d", ret);
775
776 ret = sys_bitarray_xor(&ba, &bb, 128, 0);
777 zassert_equal(ret, 0, "sys_bitarray_xor() returned unexpected value: %d", ret);
778 ret = sys_bitarray_xor(&ba, &bb, 128, 1);
779 zassert_equal(ret, -EINVAL, "sys_bitarray_xor() returned unexpected value: %d", ret);
780 ret = sys_bitarray_xor(&ba, &bb, 129, 0);
781 zassert_equal(ret, -EINVAL, "sys_bitarray_xor() returned unexpected value: %d", ret);
782 ret = sys_bitarray_xor(&ba, &bb, 0, 0);
783 zassert_equal(ret, -EINVAL, "sys_bitarray_xor() returned unexpected value: %d", ret);
784 }
785
ZTEST(bitarray,test_bitarray_find_nth_set)786 ZTEST(bitarray, test_bitarray_find_nth_set)
787 {
788 int ret;
789 size_t found_at;
790
791 /* Bitarrays have embedded spinlocks and can't on the stack. */
792 if (IS_ENABLED(CONFIG_KERNEL_COHERENCE)) {
793 ztest_test_skip();
794 }
795
796 SYS_BITARRAY_DEFINE(ba, 128);
797
798 printk("Testing bit array nth bit set finding spanning single bundle\n");
799
800 /* Pre-populate the bits */
801 ba.bundles[0] = 0x80000001;
802 ba.bundles[1] = 0x80000001;
803 ba.bundles[2] = 0x80000001;
804 ba.bundles[3] = 0x80000001;
805
806 ret = sys_bitarray_find_nth_set(&ba, 1, 1, 0, &found_at);
807 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
808 zassert_equal(found_at, 0, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
809 found_at);
810
811 ret = sys_bitarray_find_nth_set(&ba, 1, 32, 0, &found_at);
812 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
813 zassert_equal(found_at, 0, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
814 found_at);
815
816 ret = sys_bitarray_find_nth_set(&ba, 2, 32, 0, &found_at);
817 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
818 zassert_equal(found_at, 31, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
819 found_at);
820
821 ret = sys_bitarray_find_nth_set(&ba, 1, 31, 1, &found_at);
822 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
823 zassert_equal(found_at, 31, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
824 found_at);
825
826 ret = sys_bitarray_find_nth_set(&ba, 2, 31, 1, &found_at);
827 zassert_equal(ret, 1, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
828
829 printk("Testing bit array nth bit set finding spanning multiple bundles\n");
830
831 ret = sys_bitarray_find_nth_set(&ba, 1, 128, 0, &found_at);
832 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
833 zassert_equal(found_at, 0, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
834 found_at);
835
836 ret = sys_bitarray_find_nth_set(&ba, 8, 128, 0, &found_at);
837 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
838 zassert_equal(found_at, 127,
839 "sys_bitarray_find_nth_set() returned unexpected found_at: %zu", found_at);
840
841 ret = sys_bitarray_find_nth_set(&ba, 8, 128, 1, &found_at);
842 zassert_equal(ret, -EINVAL, "sys_bitarray_find_nth_set() returned unexpected value: %d",
843 ret);
844
845 ret = sys_bitarray_find_nth_set(&ba, 7, 127, 1, &found_at);
846 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
847 zassert_equal(found_at, 127,
848 "sys_bitarray_find_nth_set() returned unexpected found_at: %zu", found_at);
849
850 ret = sys_bitarray_find_nth_set(&ba, 7, 127, 0, &found_at);
851 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
852 zassert_equal(found_at, 96, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
853 found_at);
854
855 ret = sys_bitarray_find_nth_set(&ba, 6, 127, 1, &found_at);
856 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
857 zassert_equal(found_at, 96, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
858 found_at);
859
860 ret = sys_bitarray_find_nth_set(&ba, 6, 127, 1, &found_at);
861 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
862 zassert_equal(found_at, 96, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
863 found_at);
864
865 ret = sys_bitarray_find_nth_set(&ba, 1, 32, 48, &found_at);
866 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
867 zassert_equal(found_at, 63, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
868 found_at);
869
870 ret = sys_bitarray_find_nth_set(&ba, 2, 32, 48, &found_at);
871 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
872 zassert_equal(found_at, 64, "sys_bitarray_find_nth_set() returned unexpected found_at: %zu",
873 found_at);
874
875 printk("Testing error cases\n");
876
877 ret = sys_bitarray_find_nth_set(&ba, 1, 128, 0, &found_at);
878 zassert_equal(ret, 0, "sys_bitarray_find_nth_set() returned unexpected value: %d", ret);
879
880 ret = sys_bitarray_find_nth_set(&ba, 1, 128, 1, &found_at);
881 zassert_equal(ret, -EINVAL, "sys_bitarray_find_nth_set() returned unexpected value: %d",
882 ret);
883
884 ret = sys_bitarray_find_nth_set(&ba, 1, 129, 0, &found_at);
885 zassert_equal(ret, -EINVAL, "sys_bitarray_find_nth_set() returned unexpected value: %d",
886 ret);
887
888 ret = sys_bitarray_find_nth_set(&ba, 0, 128, 0, &found_at);
889 zassert_equal(ret, -EINVAL, "sys_bitarray_find_nth_set() returned unexpected value: %d",
890 ret);
891 }
892
ZTEST(bitarray,test_bitarray_region_set_clear)893 ZTEST(bitarray, test_bitarray_region_set_clear)
894 {
895 int ret;
896
897 /* Bitarrays have embedded spinlocks and can't on the stack. */
898 if (IS_ENABLED(CONFIG_KERNEL_COHERENCE)) {
899 ztest_test_skip();
900 }
901
902 uint32_t ba_expected[4];
903
904 SYS_BITARRAY_DEFINE(ba, 64);
905
906 printk("Testing bit array region bit tests\n");
907
908 /* Pre-populate the bits */
909 ba.bundles[0] = 0xFF0F0F0F;
910 ba.bundles[1] = 0x0F0F0FFF;
911
912 zassert_true(sys_bitarray_is_region_set(&ba, 4, 0));
913 zassert_true(sys_bitarray_is_region_set(&ba, 12, 32));
914 zassert_true(sys_bitarray_is_region_set(&ba, 8, 32));
915 zassert_true(sys_bitarray_is_region_set(&ba, 14, 30));
916 zassert_true(sys_bitarray_is_region_set(&ba, 20, 24));
917
918 zassert_false(sys_bitarray_is_region_cleared(&ba, 4, 0));
919 zassert_false(sys_bitarray_is_region_cleared(&ba, 12, 32));
920 zassert_false(sys_bitarray_is_region_cleared(&ba, 8, 32));
921 zassert_false(sys_bitarray_is_region_cleared(&ba, 14, 30));
922 zassert_false(sys_bitarray_is_region_cleared(&ba, 20, 24));
923
924 ba.bundles[0] = ~ba.bundles[0];
925 ba.bundles[1] = ~ba.bundles[1];
926
927 zassert_true(sys_bitarray_is_region_cleared(&ba, 4, 0));
928 zassert_true(sys_bitarray_is_region_cleared(&ba, 12, 32));
929 zassert_true(sys_bitarray_is_region_cleared(&ba, 8, 32));
930 zassert_true(sys_bitarray_is_region_cleared(&ba, 14, 30));
931 zassert_true(sys_bitarray_is_region_cleared(&ba, 20, 24));
932
933 zassert_false(sys_bitarray_is_region_set(&ba, 4, 0));
934 zassert_false(sys_bitarray_is_region_set(&ba, 12, 32));
935 zassert_false(sys_bitarray_is_region_set(&ba, 8, 32));
936 zassert_false(sys_bitarray_is_region_set(&ba, 14, 30));
937 zassert_false(sys_bitarray_is_region_set(&ba, 20, 24));
938
939 zassert_false(sys_bitarray_is_region_set(&ba, 10, 60));
940 zassert_false(sys_bitarray_is_region_cleared(&ba, 10, 60));
941 zassert_false(sys_bitarray_is_region_set(&ba, 8, 120));
942 zassert_false(sys_bitarray_is_region_cleared(&ba, 8, 120));
943
944 printk("Testing bit array region bit manipulations\n");
945
946 /* Pre-populate the bits */
947 ba.bundles[0] = 0xFF0F0F0F;
948 ba.bundles[1] = 0x0F0F0FFF;
949
950 /* Expected values */
951 ba_expected[0] = 0xFF0F0F0F;
952 ba_expected[1] = 0x0F0F0FFF;
953
954 ret = sys_bitarray_set_region(&ba, 4, 0);
955 zassert_equal(ret, 0, "sys_bitarray_set_region() failed: %d", ret);
956 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
957 "sys_bitarray_set_region() failed bits comparison");
958
959 ret = sys_bitarray_set_region(&ba, 4, 4);
960 ba_expected[0] = 0xFF0F0FFF;
961 zassert_equal(ret, 0, "sys_bitarray_set_region() failed: %d", ret);
962 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
963 "sys_bitarray_set_region() failed bits comparison");
964
965 ret = sys_bitarray_clear_region(&ba, 4, 4);
966 ba_expected[0] = 0xFF0F0F0F;
967 zassert_equal(ret, 0, "sys_bitarray_clear_region() failed: %d", ret);
968 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
969 "sys_bitarray_clear_region() failed bits comparison");
970
971 ret = sys_bitarray_clear_region(&ba, 14, 30);
972 ba_expected[0] = 0x3F0F0F0F;
973 ba_expected[1] = 0x0F0F0000;
974 zassert_equal(ret, 0, "sys_bitarray_clear_region() failed: %d", ret);
975 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
976 "sys_bitarray_clear_region() failed bits comparison");
977
978 ret = sys_bitarray_set_region(&ba, 14, 30);
979 ba_expected[0] = 0xFF0F0F0F;
980 ba_expected[1] = 0x0F0F0FFF;
981 zassert_equal(ret, 0, "sys_bitarray_set_region() failed: %d", ret);
982 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
983 "sys_bitarray_set_region() failed bits comparison");
984
985 ret = sys_bitarray_set_region(&ba, 10, 60);
986 zassert_equal(ret, -EINVAL, "sys_bitarray_set_region() should fail but not");
987 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
988 "sys_bitarray_set_region() failed bits comparison");
989
990 ret = sys_bitarray_set_region(&ba, 8, 120);
991 zassert_equal(ret, -EINVAL, "sys_bitarray_set_region() should fail but not");
992 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
993 "sys_bitarray_set_region() failed bits comparison");
994
995 ret = sys_bitarray_clear_region(&ba, 10, 60);
996 zassert_equal(ret, -EINVAL, "sys_bitarray_clear_region() should fail but not");
997 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
998 "sys_bitarray_clear_region() failed bits comparison");
999
1000 ret = sys_bitarray_clear_region(&ba, 8, 120);
1001 zassert_equal(ret, -EINVAL, "sys_bitarray_clear_region() should fail but not");
1002 zassert_true(cmp_u32_arrays(ba.bundles, ba_expected, ba.num_bundles),
1003 "sys_bitarray_clear_region() failed bits comparison");
1004
1005 SYS_BITARRAY_DEFINE(bw, 128);
1006
1007 /* Pre-populate the bits */
1008 bw.bundles[0] = 0xFF0F0F0F;
1009 bw.bundles[1] = 0xF0000000;
1010 bw.bundles[2] = 0xFFFFFFFF;
1011 bw.bundles[3] = 0x0000000F;
1012
1013 zassert_true(sys_bitarray_is_region_set(&bw, 40, 60));
1014 zassert_false(sys_bitarray_is_region_cleared(&bw, 40, 60));
1015
1016 bw.bundles[2] = 0xFFFEEFFF;
1017
1018 zassert_false(sys_bitarray_is_region_set(&bw, 40, 60));
1019 zassert_false(sys_bitarray_is_region_cleared(&bw, 40, 60));
1020
1021 bw.bundles[1] = 0x0FFFFFFF;
1022 bw.bundles[2] = 0x00000000;
1023 bw.bundles[3] = 0xFFFFFFF0;
1024
1025 zassert_true(sys_bitarray_is_region_cleared(&bw, 40, 60));
1026 zassert_false(sys_bitarray_is_region_set(&bw, 40, 60));
1027
1028 bw.bundles[2] = 0x00011000;
1029
1030 zassert_false(sys_bitarray_is_region_cleared(&bw, 40, 60));
1031 zassert_false(sys_bitarray_is_region_set(&bw, 40, 60));
1032 }
1033
1034 /**
1035 * @brief Test find MSB and LSB operations
1036 *
1037 * @details Verify the functions that find out the most significant
1038 * bit and least significant bit work as expected.
1039 *
1040 * @see find_msb_set(), find_lsb_set()
1041 */
ZTEST(bitarray,test_ffs)1042 ZTEST(bitarray, test_ffs)
1043 {
1044 uint32_t value;
1045 unsigned int bit;
1046
1047 /* boundary test, input is min */
1048 value = 0x0;
1049 zassert_equal(find_msb_set(value), 0, "MSB is not matched");
1050 zassert_equal(find_lsb_set(value), 0, "LSB is not matched");
1051
1052 /* boundary test, input is min + 1 */
1053 value = 0x00000001;
1054 zassert_equal(find_msb_set(value), 1, "MSB is not matched");
1055 zassert_equal(find_lsb_set(value), 1, "LSB is not matched");
1056
1057 /* average value test */
1058 value = 0x80000000;
1059 zassert_equal(find_msb_set(value), 32, "MSB is not matched");
1060 zassert_equal(find_lsb_set(value), 32, "LSB is not matched");
1061
1062 /* mediate value test */
1063 value = 0x000FF000;
1064 zassert_equal(find_msb_set(value), 20, "MSB is not matched");
1065 zassert_equal(find_lsb_set(value), 13, "LSB is not matched");
1066
1067 /* boundary test, input is max */
1068 value = 0xffffffff;
1069 zassert_equal(find_msb_set(value), 32, "MSB is not matched");
1070 zassert_equal(find_lsb_set(value), 1, "LSB is not matched");
1071
1072 /* boundary test, input is max - 1 */
1073 value = 0xfffffffe;
1074 zassert_equal(find_msb_set(value), 32, "MSB is not matched");
1075 zassert_equal(find_lsb_set(value), 2, "LSB is not matched");
1076
1077 /* equivalent class testing, each bit means a class */
1078 for (bit = 0; bit < 32 ; bit++) {
1079 value = 1UL << bit;
1080 zassert_equal(find_msb_set(value), bit + 1, "MSB is not matched");
1081 zassert_equal(find_lsb_set(value), bit + 1, "LSB is not matched");
1082 }
1083 }
1084 /**
1085 * @}
1086 */
1087 extern void *common_setup(void);
1088 ZTEST_SUITE(bitarray, NULL, common_setup, NULL, NULL, NULL);
1089