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