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 
30 static void genmask_test(struct kunit *test)
31 {
32 	KUNIT_EXPECT_EQ(test, 1ul, GENMASK(0, 0));
33 	KUNIT_EXPECT_EQ(test, 3ul, GENMASK(1, 0));
34 	KUNIT_EXPECT_EQ(test, 6ul, GENMASK(2, 1));
35 	KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, GENMASK(31, 0));
36 
37 	KUNIT_EXPECT_EQ(test, 1u, GENMASK_U8(0, 0));
38 	KUNIT_EXPECT_EQ(test, 3u, GENMASK_U16(1, 0));
39 	KUNIT_EXPECT_EQ(test, 0x10000, GENMASK_U32(16, 16));
40 
41 #ifdef TEST_GENMASK_FAILURES
42 	/* these should fail compilation */
43 	GENMASK(0, 1);
44 	GENMASK(0, 10);
45 	GENMASK(9, 10);
46 
47 	GENMASK_U32(0, 31);
48 	GENMASK_U64(64, 0);
49 	GENMASK_U32(32, 0);
50 	GENMASK_U16(16, 0);
51 	GENMASK_U8(8, 0);
52 #endif
53 
54 
55 }
56 
57 static void genmask_ull_test(struct kunit *test)
58 {
59 	KUNIT_EXPECT_EQ(test, 1ull, GENMASK_ULL(0, 0));
60 	KUNIT_EXPECT_EQ(test, 3ull, GENMASK_ULL(1, 0));
61 	KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_ULL(39, 21));
62 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_ULL(63, 0));
63 
64 #ifdef TEST_GENMASK_FAILURES
65 	/* these should fail compilation */
66 	GENMASK_ULL(0, 1);
67 	GENMASK_ULL(0, 10);
68 	GENMASK_ULL(9, 10);
69 #endif
70 }
71 
72 static void genmask_u128_test(struct kunit *test)
73 {
74 #ifdef CONFIG_ARCH_SUPPORTS_INT128
75 	/* Below 64 bit masks */
76 	KUNIT_EXPECT_EQ(test, 0x0000000000000001ull, GENMASK_U128(0, 0));
77 	KUNIT_EXPECT_EQ(test, 0x0000000000000003ull, GENMASK_U128(1, 0));
78 	KUNIT_EXPECT_EQ(test, 0x0000000000000006ull, GENMASK_U128(2, 1));
79 	KUNIT_EXPECT_EQ(test, 0x00000000ffffffffull, GENMASK_U128(31, 0));
80 	KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_U128(39, 21));
81 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(63, 0));
82 
83 	/* Above 64 bit masks - only 64 bit portion can be validated once */
84 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(64, 0) >> 1);
85 	KUNIT_EXPECT_EQ(test, 0x00000000ffffffffull, GENMASK_U128(81, 50) >> 50);
86 	KUNIT_EXPECT_EQ(test, 0x0000000000ffffffull, GENMASK_U128(87, 64) >> 64);
87 	KUNIT_EXPECT_EQ(test, 0x0000000000ff0000ull, GENMASK_U128(87, 80) >> 64);
88 
89 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(127, 0) >> 64);
90 	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, (u64)GENMASK_U128(127, 0));
91 	KUNIT_EXPECT_EQ(test, 0x0000000000000003ull, GENMASK_U128(127, 126) >> 126);
92 	KUNIT_EXPECT_EQ(test, 0x0000000000000001ull, GENMASK_U128(127, 127) >> 127);
93 #ifdef TEST_GENMASK_FAILURES
94 	/* these should fail compilation */
95 	GENMASK_U128(0, 1);
96 	GENMASK_U128(0, 10);
97 	GENMASK_U128(9, 10);
98 #endif /* TEST_GENMASK_FAILURES */
99 #endif /* CONFIG_ARCH_SUPPORTS_INT128 */
100 }
101 
102 static void genmask_input_check_test(struct kunit *test)
103 {
104 	unsigned int x, y;
105 	int z, w;
106 
107 	/* Unknown input */
108 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, 0));
109 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, x));
110 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, y));
111 
112 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, 0));
113 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, z));
114 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, w));
115 
116 	/* Valid input */
117 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(1, 1));
118 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(39, 21));
119 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(100, 80));
120 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(110, 65));
121 	KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(127, 0));
122 }
123 
124 
125 static struct kunit_case bits_test_cases[] = {
126 	KUNIT_CASE(genmask_test),
127 	KUNIT_CASE(genmask_ull_test),
128 	KUNIT_CASE(genmask_u128_test),
129 	KUNIT_CASE(genmask_input_check_test),
130 	{}
131 };
132 
133 static struct kunit_suite bits_test_suite = {
134 	.name = "bits-test",
135 	.test_cases = bits_test_cases,
136 };
137 kunit_test_suite(bits_test_suite);
138 
139 MODULE_DESCRIPTION("Test cases for functions and macros in bits.h");
140 MODULE_LICENSE("GPL");
141