xref: /linux/lib/tests/test_bits.c (revision 22c55fb9eb92395d999b8404d73e58540d11bdd8)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Test cases for functions and macros in bits.h
4  */
5 
6 #include <kunit/test.h>
7 #include <linux/bits.h>
8 #include <linux/types.h>
9 
10 #define assert_type(t, x) _Generic(x, t: x, default: 0)
11 
12 static_assert(assert_type(u8, BIT_U8(0)) == 1u);
13 static_assert(assert_type(u16, BIT_U16(0)) == 1u);
14 static_assert(assert_type(u32, BIT_U32(0)) == 1u);
15 static_assert(assert_type(u64, BIT_U64(0)) == 1ull);
16 
17 static_assert(assert_type(u8, BIT_U8(7)) == 0x80u);
18 static_assert(assert_type(u16, BIT_U16(15)) == 0x8000u);
19 static_assert(assert_type(u32, BIT_U32(31)) == 0x80000000u);
20 static_assert(assert_type(u64, BIT_U64(63)) == 0x8000000000000000ull);
21 
22 static_assert(assert_type(unsigned long, GENMASK(31, 0)) == U32_MAX);
23 static_assert(assert_type(unsigned long long, GENMASK_ULL(63, 0)) == U64_MAX);
24 static_assert(assert_type(u8, GENMASK_U8(7, 0)) == U8_MAX);
25 static_assert(assert_type(u16, GENMASK_U16(15, 0)) == U16_MAX);
26 static_assert(assert_type(u32, GENMASK_U32(31, 0)) == U32_MAX);
27 static_assert(assert_type(u64, GENMASK_U64(63, 0)) == U64_MAX);
28 
29 /* FIXME: add a test case written in asm for GENMASK() and GENMASK_ULL() */
30 
31 static void __genmask_test(struct kunit *test)
32 {
33 	KUNIT_EXPECT_EQ(test, 1ul, __GENMASK(0, 0));
34 	KUNIT_EXPECT_EQ(test, 3ul, __GENMASK(1, 0));
35 	KUNIT_EXPECT_EQ(test, 6ul, __GENMASK(2, 1));
36 	KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, __GENMASK(31, 0));
37 }
38 
39 static void __genmask_ull_test(struct kunit *test)
40 {
41 	KUNIT_EXPECT_EQ(test, 1ull, __GENMASK_ULL(0, 0));
42 	KUNIT_EXPECT_EQ(test, 3ull, __GENMASK_ULL(1, 0));
43 	KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, __GENMASK_ULL(39, 21));
44 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, __GENMASK_ULL(63, 0));
45 }
46 
47 static void genmask_test(struct kunit *test)
48 {
49 	KUNIT_EXPECT_EQ(test, 1ul, GENMASK(0, 0));
50 	KUNIT_EXPECT_EQ(test, 3ul, GENMASK(1, 0));
51 	KUNIT_EXPECT_EQ(test, 6ul, GENMASK(2, 1));
52 	KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, GENMASK(31, 0));
53 
54 	KUNIT_EXPECT_EQ(test, 1u, GENMASK_U8(0, 0));
55 	KUNIT_EXPECT_EQ(test, 3u, GENMASK_U16(1, 0));
56 	KUNIT_EXPECT_EQ(test, 0x10000, GENMASK_U32(16, 16));
57 
58 #ifdef TEST_GENMASK_FAILURES
59 	/* these should fail compilation */
60 	GENMASK(0, 1);
61 	GENMASK(0, 10);
62 	GENMASK(9, 10);
63 
64 	GENMASK_U32(0, 31);
65 	GENMASK_U64(64, 0);
66 	GENMASK_U32(32, 0);
67 	GENMASK_U16(16, 0);
68 	GENMASK_U8(8, 0);
69 #endif
70 
71 
72 }
73 
74 static void genmask_ull_test(struct kunit *test)
75 {
76 	KUNIT_EXPECT_EQ(test, 1ull, GENMASK_ULL(0, 0));
77 	KUNIT_EXPECT_EQ(test, 3ull, GENMASK_ULL(1, 0));
78 	KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_ULL(39, 21));
79 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_ULL(63, 0));
80 
81 #ifdef TEST_GENMASK_FAILURES
82 	/* these should fail compilation */
83 	GENMASK_ULL(0, 1);
84 	GENMASK_ULL(0, 10);
85 	GENMASK_ULL(9, 10);
86 #endif
87 }
88 
89 static void genmask_u128_test(struct kunit *test)
90 {
91 #ifdef CONFIG_ARCH_SUPPORTS_INT128
92 	/* Below 64 bit masks */
93 	KUNIT_EXPECT_EQ(test, 0x0000000000000001ull, GENMASK_U128(0, 0));
94 	KUNIT_EXPECT_EQ(test, 0x0000000000000003ull, GENMASK_U128(1, 0));
95 	KUNIT_EXPECT_EQ(test, 0x0000000000000006ull, GENMASK_U128(2, 1));
96 	KUNIT_EXPECT_EQ(test, 0x00000000ffffffffull, GENMASK_U128(31, 0));
97 	KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_U128(39, 21));
98 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(63, 0));
99 
100 	/* Above 64 bit masks - only 64 bit portion can be validated once */
101 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(64, 0) >> 1);
102 	KUNIT_EXPECT_EQ(test, 0x00000000ffffffffull, GENMASK_U128(81, 50) >> 50);
103 	KUNIT_EXPECT_EQ(test, 0x0000000000ffffffull, GENMASK_U128(87, 64) >> 64);
104 	KUNIT_EXPECT_EQ(test, 0x0000000000ff0000ull, GENMASK_U128(87, 80) >> 64);
105 
106 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(127, 0) >> 64);
107 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, (u64)GENMASK_U128(127, 0));
108 	KUNIT_EXPECT_EQ(test, 0x0000000000000003ull, GENMASK_U128(127, 126) >> 126);
109 	KUNIT_EXPECT_EQ(test, 0x0000000000000001ull, GENMASK_U128(127, 127) >> 127);
110 #ifdef TEST_GENMASK_FAILURES
111 	/* these should fail compilation */
112 	GENMASK_U128(0, 1);
113 	GENMASK_U128(0, 10);
114 	GENMASK_U128(9, 10);
115 #endif /* TEST_GENMASK_FAILURES */
116 #endif /* CONFIG_ARCH_SUPPORTS_INT128 */
117 }
118 
119 static void genmask_input_check_test(struct kunit *test)
120 {
121 	unsigned int x, y;
122 	int z, w;
123 
124 	/* Unknown input */
125 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, 0));
126 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, x));
127 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, y));
128 
129 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, 0));
130 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, z));
131 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, w));
132 
133 	/* Valid input */
134 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(1, 1));
135 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(39, 21));
136 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(100, 80));
137 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(110, 65));
138 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(127, 0));
139 }
140 
141 
142 static struct kunit_case bits_test_cases[] = {
143 	KUNIT_CASE(__genmask_test),
144 	KUNIT_CASE(__genmask_ull_test),
145 	KUNIT_CASE(genmask_test),
146 	KUNIT_CASE(genmask_ull_test),
147 	KUNIT_CASE(genmask_u128_test),
148 	KUNIT_CASE(genmask_input_check_test),
149 	{}
150 };
151 
152 static struct kunit_suite bits_test_suite = {
153 	.name = "bits-test",
154 	.test_cases = bits_test_cases,
155 };
156 kunit_test_suite(bits_test_suite);
157 
158 MODULE_DESCRIPTION("Test cases for functions and macros in bits.h");
159 MODULE_LICENSE("GPL");
160