1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019 Arm Limited
3 */
4
5 #include <rte_launch.h>
6 #include <rte_bitops.h>
7 #include "test.h"
8
9 uint32_t val32;
10 uint64_t val64;
11
12 #define MAX_BITS_32 32
13 #define MAX_BITS_64 64
14
15 /*
16 * Bitops functions
17 * ================
18 *
19 * - The main test function performs several subtests.
20 * - Check bit operations on one core.
21 * - Initialize valXX to specified values, then set each bit of valXX
22 * to 1 one by one in "test_bit_relaxed_set".
23 *
24 * - Clear each bit of valXX to 0 one by one in "test_bit_relaxed_clear".
25 *
26 * - Function "test_bit_relaxed_test_set_clear" checks whether each bit
27 * of valXX can do "test and set" and "test and clear" correctly.
28 */
29
30 static int
test_bit_relaxed_set(void)31 test_bit_relaxed_set(void)
32 {
33 unsigned int i;
34
35 for (i = 0; i < MAX_BITS_32; i++)
36 rte_bit_relaxed_set32(i, &val32);
37
38 for (i = 0; i < MAX_BITS_32; i++)
39 if (!rte_bit_relaxed_get32(i, &val32)) {
40 printf("Failed to set bit in relaxed version.\n");
41 return TEST_FAILED;
42 }
43
44 for (i = 0; i < MAX_BITS_64; i++)
45 rte_bit_relaxed_set64(i, &val64);
46
47 for (i = 0; i < MAX_BITS_64; i++)
48 if (!rte_bit_relaxed_get64(i, &val64)) {
49 printf("Failed to set bit in relaxed version.\n");
50 return TEST_FAILED;
51 }
52
53 return TEST_SUCCESS;
54 }
55
56 static int
test_bit_relaxed_clear(void)57 test_bit_relaxed_clear(void)
58 {
59 unsigned int i;
60
61 for (i = 0; i < MAX_BITS_32; i++)
62 rte_bit_relaxed_clear32(i, &val32);
63
64 for (i = 0; i < MAX_BITS_32; i++)
65 if (rte_bit_relaxed_get32(i, &val32)) {
66 printf("Failed to clear bit in relaxed version.\n");
67 return TEST_FAILED;
68 }
69
70 for (i = 0; i < MAX_BITS_64; i++)
71 rte_bit_relaxed_clear64(i, &val64);
72
73 for (i = 0; i < MAX_BITS_64; i++)
74 if (rte_bit_relaxed_get64(i, &val64)) {
75 printf("Failed to clear bit in relaxed version.\n");
76 return TEST_FAILED;
77 }
78
79 return TEST_SUCCESS;
80 }
81
82 static int
test_bit_relaxed_test_set_clear(void)83 test_bit_relaxed_test_set_clear(void)
84 {
85 unsigned int i;
86
87 for (i = 0; i < MAX_BITS_32; i++)
88 rte_bit_relaxed_test_and_set32(i, &val32);
89
90 for (i = 0; i < MAX_BITS_32; i++)
91 if (!rte_bit_relaxed_test_and_clear32(i, &val32)) {
92 printf("Failed to set and test bit in relaxed version.\n");
93 return TEST_FAILED;
94 }
95
96 for (i = 0; i < MAX_BITS_32; i++)
97 if (rte_bit_relaxed_get32(i, &val32)) {
98 printf("Failed to test and clear bit in relaxed version.\n");
99 return TEST_FAILED;
100 }
101
102 for (i = 0; i < MAX_BITS_64; i++)
103 rte_bit_relaxed_test_and_set64(i, &val64);
104
105 for (i = 0; i < MAX_BITS_64; i++)
106 if (!rte_bit_relaxed_test_and_clear64(i, &val64)) {
107 printf("Failed to set and test bit in relaxed version.\n");
108 return TEST_FAILED;
109 }
110
111 for (i = 0; i < MAX_BITS_64; i++)
112 if (rte_bit_relaxed_get64(i, &val64)) {
113 printf("Failed to test and clear bit in relaxed version.\n");
114 return TEST_FAILED;
115 }
116
117 return TEST_SUCCESS;
118 }
119
120 static int
test_bitops(void)121 test_bitops(void)
122 {
123 val32 = 0;
124 val64 = 0;
125
126 if (test_bit_relaxed_set() < 0)
127 return TEST_FAILED;
128
129 if (test_bit_relaxed_clear() < 0)
130 return TEST_FAILED;
131
132 if (test_bit_relaxed_test_set_clear() < 0)
133 return TEST_FAILED;
134
135 return TEST_SUCCESS;
136 }
137
138 REGISTER_TEST_COMMAND(bitops_autotest, test_bitops);
139