Skip to content

Commit 1457b09

Browse files
cfriedtChristopher Friedt
authored andcommitted
tests: kernel: atomics: expand atomic operations to 64-bit
This change updates the atomic tests to validate 32-bits on 32-bit architectures and 64-bits on 64-bit architectures. Signed-off-by: Christopher Friedt <chrisfriedt@gmail.com>
1 parent 081714a commit 1457b09

File tree

1 file changed

+31
-24
lines changed

1 file changed

+31
-24
lines changed

tests/kernel/common/src/atomic.c

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
#include <ztest.h>
88
#include <sys/atomic.h>
99

10+
/* convenience macro - return either 64-bit or 32-bit value */
11+
#define ATOMIC_WORD(val_if_64, val_if_32) \
12+
((atomic_t)((sizeof(void *) == sizeof(uint64_t)) ? (val_if_64) : (val_if_32)))
13+
1014
/* an example of the number of atomic bit in an array */
1115
#define NUM_FLAG_BITS 100
1216

@@ -102,6 +106,9 @@ void test_atomic(void)
102106

103107
ATOMIC_DEFINE(flag_bits, NUM_FLAG_BITS) = {0};
104108

109+
zassert_equal(sizeof(atomic_t), ATOMIC_WORD(sizeof(uint64_t), sizeof(uint32_t)),
110+
"sizeof(atomic_t)");
111+
105112
target = 4;
106113
value = 5;
107114
oldvalue = 6;
@@ -211,63 +218,63 @@ void test_atomic(void)
211218
target = 0xFF00;
212219
value = 0x0F0F;
213220
zassert_true((atomic_nand(&target, value) == 0xFF00), "atomic_nand");
214-
zassert_true((target == 0xFFFFF0FF), "atomic_nand");
221+
zassert_true((target == ATOMIC_WORD(0xFFFFFFFFFFFFF0FF, 0xFFFFF0FF)), "atomic_nand");
215222

216223
/* atomic_test_bit() */
217-
for (i = 0; i < 32; i++) {
218-
target = 0x0F0F0F0F;
219-
zassert_true(!!(atomic_test_bit(&target, i) == !!(target & (1 << i))),
224+
for (i = 0; i < ATOMIC_BITS; i++) {
225+
target = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F);
226+
zassert_true(!!(atomic_test_bit(&target, i) == !!(target & BIT(i))),
220227
"atomic_test_bit");
221228
}
222229

223230
/* atomic_test_and_clear_bit() */
224-
for (i = 0; i < 32; i++) {
225-
orig = 0x0F0F0F0F;
231+
for (i = 0; i < ATOMIC_BITS; i++) {
232+
orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F);
226233
target = orig;
227-
zassert_true(!!(atomic_test_and_clear_bit(&target, i)) == !!(orig & (1 << i)),
234+
zassert_true(!!(atomic_test_and_clear_bit(&target, i)) == !!(orig & BIT(i)),
228235
"atomic_test_and_clear_bit");
229-
zassert_true(target == (orig & ~(1 << i)), "atomic_test_and_clear_bit");
236+
zassert_true(target == (orig & ~BIT(i)), "atomic_test_and_clear_bit");
230237
}
231238

232239
/* atomic_test_and_set_bit() */
233-
for (i = 0; i < 32; i++) {
234-
orig = 0x0F0F0F0F;
240+
for (i = 0; i < ATOMIC_BITS; i++) {
241+
orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F);
235242
target = orig;
236-
zassert_true(!!(atomic_test_and_set_bit(&target, i)) == !!(orig & (1 << i)),
243+
zassert_true(!!(atomic_test_and_set_bit(&target, i)) == !!(orig & BIT(i)),
237244
"atomic_test_and_set_bit");
238-
zassert_true(target == (orig | (1 << i)), "atomic_test_and_set_bit");
245+
zassert_true(target == (orig | BIT(i)), "atomic_test_and_set_bit");
239246
}
240247

241248
/* atomic_clear_bit() */
242-
for (i = 0; i < 32; i++) {
243-
orig = 0x0F0F0F0F;
249+
for (i = 0; i < ATOMIC_BITS; i++) {
250+
orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F);
244251
target = orig;
245252
atomic_clear_bit(&target, i);
246-
zassert_true(target == (orig & ~(1 << i)), "atomic_clear_bit");
253+
zassert_true(target == (orig & ~BIT(i)), "atomic_clear_bit");
247254
}
248255

249256
/* atomic_set_bit() */
250-
for (i = 0; i < 32; i++) {
251-
orig = 0x0F0F0F0F;
257+
for (i = 0; i < ATOMIC_BITS; i++) {
258+
orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F);
252259
target = orig;
253260
atomic_set_bit(&target, i);
254-
zassert_true(target == (orig | (1 << i)), "atomic_set_bit");
261+
zassert_true(target == (orig | BIT(i)), "atomic_set_bit");
255262
}
256263

257264
/* atomic_set_bit_to(&target, i, false) */
258-
for (i = 0; i < 32; i++) {
259-
orig = 0x0F0F0F0F;
265+
for (i = 0; i < ATOMIC_BITS; i++) {
266+
orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F);
260267
target = orig;
261268
atomic_set_bit_to(&target, i, false);
262-
zassert_true(target == (orig & ~(1 << i)), "atomic_set_bit_to");
269+
zassert_true(target == (orig & ~BIT(i)), "atomic_set_bit_to");
263270
}
264271

265272
/* atomic_set_bit_to(&target, i, true) */
266-
for (i = 0; i < 32; i++) {
267-
orig = 0x0F0F0F0F;
273+
for (i = 0; i < ATOMIC_BITS; i++) {
274+
orig = ATOMIC_WORD(0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F);
268275
target = orig;
269276
atomic_set_bit_to(&target, i, true);
270-
zassert_true(target == (orig | (1 << i)), "atomic_set_bit_to");
277+
zassert_true(target == (orig | BIT(i)), "atomic_set_bit_to");
271278
}
272279

273280
/* ATOMIC_DEFINE */

0 commit comments

Comments
 (0)