1 /*
2 * Copyright (c) 2016 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/kernel.h>
8 #include <zephyr/ztest.h>
9 #include <zephyr/arch/cpu.h>
10
11 #include <zephyr/tc_util.h>
12
13 #ifdef CONFIG_BIG_ENDIAN
14 #define BIT_INDEX(bit) ((3 - ((bit >> 3) & 0x3)) + 4*(bit >> 5))
15 #else
16 #define BIT_INDEX(bit) (bit >> 3)
17 #endif
18 #define BIT_VAL(bit) (1 << (bit & 0x7))
19 #define BITFIELD_SIZE 512
20
21 /**
22 * @defgroup kernel_bitfield_tests Bit Fields
23 * @ingroup all_tests
24 * @{
25 * @}
26 *
27 * @addtogroup kernel_bitfield_tests
28 * @{
29 */
30
31 /**
32 * @brief Test bitfield operations
33 *
34 * @see sys_test_bit(), sys_set_bit(), sys_clear_bit(),
35 * sys_bitfield_set_bit(), sys_bitfield_clear_bit(),
36 * sys_bitfield_test_bit(), sys_bitfield_test_and_set_bit(),
37 * sys_bitfield_test_and_clear_bit()
38 */
ZTEST(bitfield,test_bitfield)39 ZTEST(bitfield, test_bitfield)
40 {
41 #ifdef CONFIG_ARM
42 ztest_test_skip();
43 #else
44 uint32_t b1 = 0U;
45 unsigned char b2[BITFIELD_SIZE >> 3] = { 0 };
46 unsigned int bit;
47 int ret;
48
49 TC_PRINT("twiddling bits....\n");
50
51 for (bit = 0U; bit < 32; ++bit) {
52 sys_set_bit((mem_addr_t)&b1, bit);
53
54 zassert_equal(b1, (1 << bit),
55 "sys_set_bit failed on bit %d\n", bit);
56
57 zassert_true(sys_test_bit((mem_addr_t)&b1, bit),
58 "sys_test_bit did not detect bit %d\n", bit);
59
60 sys_clear_bit((mem_addr_t)&b1, bit);
61 zassert_equal(b1, 0, "sys_clear_bit failed for bit %d\n", bit);
62
63 zassert_false(sys_test_bit((mem_addr_t)&b1, bit),
64 "sys_test_bit erroneously detected bit %d\n",
65 bit);
66
67 zassert_false(sys_test_and_set_bit((mem_addr_t)&b1, bit),
68 "sys_test_and_set_bit erroneously"
69 " detected bit %d\n", bit);
70 zassert_equal(b1, (1 << bit),
71 "sys_test_and_set_bit did not set bit %d\n",
72 bit);
73 zassert_true(sys_test_and_set_bit((mem_addr_t)&b1, bit),
74 "sys_test_and_set_bit did not detect bit %d\n",
75 bit);
76 zassert_equal(b1, (1 << bit),
77 "sys_test_and_set_bit cleared bit %d\n", bit);
78
79 zassert_true(sys_test_and_clear_bit((mem_addr_t)&b1, bit),
80 "sys_test_and_clear_bit did not detect bit %d\n",
81 bit);
82 zassert_equal(b1, 0, "sys_test_and_clear_bit did not clear"
83 " bit %d\n", bit);
84 zassert_false(sys_test_and_clear_bit((mem_addr_t)&b1, bit),
85 "sys_test_and_clear_bit erroneously detected"
86 " bit %d\n", bit);
87 zassert_equal(b1, 0, "sys_test_and_clear_bit set bit %d\n",
88 bit);
89 }
90
91 for (bit = 0U; bit < BITFIELD_SIZE; ++bit) {
92 sys_bitfield_set_bit((mem_addr_t)b2, bit);
93 zassert_equal(b2[BIT_INDEX(bit)], BIT_VAL(bit),
94 "sys_bitfield_set_bit failed for bit %d\n",
95 bit);
96 zassert_true(sys_bitfield_test_bit((mem_addr_t)b2, bit),
97 "sys_bitfield_test_bit did not detect bit %d\n",
98 bit);
99
100 sys_bitfield_clear_bit((mem_addr_t)b2, bit);
101 zassert_equal(b2[BIT_INDEX(bit)], 0,
102 "sys_bitfield_clear_bit failed for bit %d\n",
103 bit);
104 zassert_false(sys_bitfield_test_bit((mem_addr_t)b2, bit),
105 "sys_bitfield_test_bit erroneously detected"
106 " bit %d\n", bit);
107
108 ret = sys_bitfield_test_and_set_bit((mem_addr_t)b2, bit);
109 zassert_false(ret, "sys_bitfield_test_and_set_bit erroneously"
110 " detected bit %d\n", bit);
111
112 zassert_equal(b2[BIT_INDEX(bit)], BIT_VAL(bit),
113 "sys_bitfield_test_and_set_bit did not set"
114 " bit %d\n", bit);
115 zassert_true(sys_bitfield_test_and_set_bit((mem_addr_t)b2, bit),
116 "sys_bitfield_test_and_set_bit did not detect bit"
117 " %d\n", bit);
118 zassert_equal(b2[BIT_INDEX(bit)], BIT_VAL(bit),
119 "sys_bitfield_test_and_set_bit cleared bit %d\n",
120 bit);
121
122 zassert_true(sys_bitfield_test_and_clear_bit((mem_addr_t)b2,
123 bit), "sys_bitfield_test_and_clear_bit did not"
124 " detect bit %d\n", bit);
125 zassert_equal(b2[BIT_INDEX(bit)], 0,
126 "sys_bitfield_test_and_clear_bit did not"
127 " clear bit %d\n", bit);
128 zassert_false(sys_bitfield_test_and_clear_bit((mem_addr_t)b2,
129 bit), "sys_bitfield_test_and_clear_bit"
130 " erroneously detected bit %d\n", bit);
131 zassert_equal(b2[BIT_INDEX(bit)], 0,
132 "sys_bitfield_test_and_clear_bit set bit %d\n",
133 bit);
134 }
135 #endif
136
137 }
138
139 /**
140 * @}
141 */
142
143 extern void *common_setup(void);
144
145 ZTEST_SUITE(bitfield, NULL, common_setup, NULL, NULL, NULL);
146