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