1#include "structures/tests/test_internal.h"
2
3TEST_GROUP_DECLARE(cpu_mask);
4
5TEST_DECLARE_UNIT(cpu_mask, basic_and_range_operations) {
6 struct cpu_mask m;
7 cpu_mask_zero(m: &m);
8 TEST_ASSERT(cpu_mask_empty(&m));
9 TEST_ASSERT_EQ(cpu_mask_popcount(&m), 0);
10
11 /* Single bit ops */
12 cpu_mask_set(m: &m, cpu: 0);
13 cpu_mask_set(m: &m, cpu: 5);
14 cpu_mask_set(m: &m, cpu: 63);
15 cpu_mask_set(m: &m, cpu: 70);
16
17 TEST_ASSERT(cpu_mask_test(&m, 0));
18 TEST_ASSERT(cpu_mask_test(&m, 5));
19 TEST_ASSERT(cpu_mask_test(&m, 63));
20 TEST_ASSERT(cpu_mask_test(&m, 70));
21 TEST_ASSERT(!cpu_mask_test(&m, 1));
22 TEST_ASSERT_EQ(cpu_mask_popcount(&m), 4);
23
24 /* Toggle & test_and_set / test_and_clear */
25 cpu_mask_toggle(m: &m, cpu: 5);
26 TEST_ASSERT(!cpu_mask_test(&m, 5));
27 TEST_ASSERT(!cpu_mask_test_and_set(&m, 5));
28 TEST_ASSERT(cpu_mask_test(&m, 5));
29 TEST_ASSERT(cpu_mask_test_and_clear(&m, 5));
30 TEST_ASSERT(!cpu_mask_test(&m, 5));
31
32 /* Scanning */
33 TEST_ASSERT_EQ(cpu_mask_first_set(&m), 0);
34 TEST_ASSERT_EQ(cpu_mask_next_set(&m, 1), 63);
35 TEST_ASSERT_EQ(cpu_mask_next_set(&m, 64), 70);
36
37 /* Range ops */
38 cpu_mask_clear_all(m: &m);
39 cpu_mask_set_range(m: &m, start: 10, len: 5);
40 for (size_t i = 10; i < 15; i++) {
41 TEST_ASSERT(cpu_mask_test(&m, i));
42 }
43 TEST_ASSERT_EQ(cpu_mask_popcount(&m), 5);
44
45 /* Fill */
46 cpu_mask_fill(m: &m);
47 TEST_ASSERT(cpu_mask_full(&m));
48 TEST_ASSERT_EQ(cpu_mask_popcount(&m), CPU_MASK_BITS);
49
50 return TEST_SUCCESS;
51}
52
53TEST_DECLARE_UNIT(cpu_mask, atomic_operations) {
54 struct cpu_mask m;
55 cpu_mask_zero(m: &m);
56
57 cpu_mask_set_atomic(m: &m, cpu: 12);
58 cpu_mask_set_atomic(m: &m, cpu: 80);
59 TEST_ASSERT(cpu_mask_test_atomic(&m, 12));
60 TEST_ASSERT(cpu_mask_test_atomic(&m, 80));
61 TEST_ASSERT(!cpu_mask_test_atomic(&m, 13));
62
63 TEST_ASSERT(!cpu_mask_test_and_set_atomic(&m, 15));
64 TEST_ASSERT(cpu_mask_test_atomic(&m, 15));
65 TEST_ASSERT(cpu_mask_test_and_clear_atomic(&m, 15));
66 TEST_ASSERT(!cpu_mask_test_atomic(&m, 15));
67
68 cpu_mask_toggle_atomic(m: &m, cpu: 80);
69 TEST_ASSERT(!cpu_mask_test_atomic(&m, 80));
70
71 return TEST_SUCCESS;
72}
73
74TEST_DECLARE_UNIT(cpu_mask, binary_bitwise_operations) {
75 struct cpu_mask a, b, dst;
76 cpu_mask_zero(m: &a);
77 cpu_mask_zero(m: &b);
78 cpu_mask_zero(m: &dst);
79
80 /* Set bits in multiple words */
81 cpu_mask_set(m: &a, cpu: 5);
82 cpu_mask_set(m: &a, cpu: 70);
83
84 cpu_mask_set(m: &b, cpu: 70);
85 cpu_mask_set(m: &b, cpu: 100);
86
87 TEST_ASSERT(cpu_mask_intersects(&a, &b));
88
89 /* AND */
90 cpu_mask_and(dst: &dst, a: &a, b: &b);
91 TEST_ASSERT_EQ(cpu_mask_popcount(&dst), 1);
92 TEST_ASSERT(cpu_mask_test(&dst, 70));
93
94 /* OR */
95 cpu_mask_zero(m: &dst);
96 cpu_mask_copy(dst: &dst, src: &a);
97 cpu_mask_or(dst: &dst, b: &b);
98 TEST_ASSERT_EQ(cpu_mask_popcount(&dst), 3);
99 TEST_ASSERT(cpu_mask_test(&dst, 5));
100 TEST_ASSERT(cpu_mask_test(&dst, 70));
101 TEST_ASSERT(cpu_mask_test(&dst, 100));
102
103 /* XOR */
104 cpu_mask_xor(dst: &dst, a: &a, b: &b);
105 TEST_ASSERT_EQ(cpu_mask_popcount(&dst), 2);
106 TEST_ASSERT(cpu_mask_test(&dst, 5));
107 TEST_ASSERT(cpu_mask_test(&dst, 100));
108 TEST_ASSERT(!cpu_mask_test(&dst, 70));
109
110 /* ANDNOT */
111 cpu_mask_andnot(dst: &dst, a: &a, b: &b);
112 TEST_ASSERT_EQ(cpu_mask_popcount(&dst), 1);
113 TEST_ASSERT(cpu_mask_test(&dst, 5));
114 TEST_ASSERT(!cpu_mask_test(&dst, 70));
115
116 /* Subset / Equal */
117 TEST_ASSERT(cpu_mask_subset(&dst, &a));
118 TEST_ASSERT(!cpu_mask_subset(&a, &dst));
119
120 struct cpu_mask copy;
121 copy = a; /* Value copy test! */
122 TEST_ASSERT(cpu_mask_equal(&copy, &a));
123
124 return TEST_SUCCESS;
125}
126