1*db6fe4d6SKees Cook // SPDX-License-Identifier: GPL-2.0+
2*db6fe4d6SKees Cook /*
3*db6fe4d6SKees Cook * Test cases for functions and macros in bits.h
4*db6fe4d6SKees Cook */
5*db6fe4d6SKees Cook
6*db6fe4d6SKees Cook #include <kunit/test.h>
7*db6fe4d6SKees Cook #include <linux/bits.h>
8*db6fe4d6SKees Cook
9*db6fe4d6SKees Cook
genmask_test(struct kunit * test)10*db6fe4d6SKees Cook static void genmask_test(struct kunit *test)
11*db6fe4d6SKees Cook {
12*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 1ul, GENMASK(0, 0));
13*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 3ul, GENMASK(1, 0));
14*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 6ul, GENMASK(2, 1));
15*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, GENMASK(31, 0));
16*db6fe4d6SKees Cook
17*db6fe4d6SKees Cook #ifdef TEST_GENMASK_FAILURES
18*db6fe4d6SKees Cook /* these should fail compilation */
19*db6fe4d6SKees Cook GENMASK(0, 1);
20*db6fe4d6SKees Cook GENMASK(0, 10);
21*db6fe4d6SKees Cook GENMASK(9, 10);
22*db6fe4d6SKees Cook #endif
23*db6fe4d6SKees Cook
24*db6fe4d6SKees Cook
25*db6fe4d6SKees Cook }
26*db6fe4d6SKees Cook
genmask_ull_test(struct kunit * test)27*db6fe4d6SKees Cook static void genmask_ull_test(struct kunit *test)
28*db6fe4d6SKees Cook {
29*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 1ull, GENMASK_ULL(0, 0));
30*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 3ull, GENMASK_ULL(1, 0));
31*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_ULL(39, 21));
32*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_ULL(63, 0));
33*db6fe4d6SKees Cook
34*db6fe4d6SKees Cook #ifdef TEST_GENMASK_FAILURES
35*db6fe4d6SKees Cook /* these should fail compilation */
36*db6fe4d6SKees Cook GENMASK_ULL(0, 1);
37*db6fe4d6SKees Cook GENMASK_ULL(0, 10);
38*db6fe4d6SKees Cook GENMASK_ULL(9, 10);
39*db6fe4d6SKees Cook #endif
40*db6fe4d6SKees Cook }
41*db6fe4d6SKees Cook
genmask_u128_test(struct kunit * test)42*db6fe4d6SKees Cook static void genmask_u128_test(struct kunit *test)
43*db6fe4d6SKees Cook {
44*db6fe4d6SKees Cook #ifdef CONFIG_ARCH_SUPPORTS_INT128
45*db6fe4d6SKees Cook /* Below 64 bit masks */
46*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x0000000000000001ull, GENMASK_U128(0, 0));
47*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x0000000000000003ull, GENMASK_U128(1, 0));
48*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x0000000000000006ull, GENMASK_U128(2, 1));
49*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x00000000ffffffffull, GENMASK_U128(31, 0));
50*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_U128(39, 21));
51*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(63, 0));
52*db6fe4d6SKees Cook
53*db6fe4d6SKees Cook /* Above 64 bit masks - only 64 bit portion can be validated once */
54*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(64, 0) >> 1);
55*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x00000000ffffffffull, GENMASK_U128(81, 50) >> 50);
56*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x0000000000ffffffull, GENMASK_U128(87, 64) >> 64);
57*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x0000000000ff0000ull, GENMASK_U128(87, 80) >> 64);
58*db6fe4d6SKees Cook
59*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(127, 0) >> 64);
60*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, (u64)GENMASK_U128(127, 0));
61*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x0000000000000003ull, GENMASK_U128(127, 126) >> 126);
62*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0x0000000000000001ull, GENMASK_U128(127, 127) >> 127);
63*db6fe4d6SKees Cook #ifdef TEST_GENMASK_FAILURES
64*db6fe4d6SKees Cook /* these should fail compilation */
65*db6fe4d6SKees Cook GENMASK_U128(0, 1);
66*db6fe4d6SKees Cook GENMASK_U128(0, 10);
67*db6fe4d6SKees Cook GENMASK_U128(9, 10);
68*db6fe4d6SKees Cook #endif /* TEST_GENMASK_FAILURES */
69*db6fe4d6SKees Cook #endif /* CONFIG_ARCH_SUPPORTS_INT128 */
70*db6fe4d6SKees Cook }
71*db6fe4d6SKees Cook
genmask_input_check_test(struct kunit * test)72*db6fe4d6SKees Cook static void genmask_input_check_test(struct kunit *test)
73*db6fe4d6SKees Cook {
74*db6fe4d6SKees Cook unsigned int x, y;
75*db6fe4d6SKees Cook int z, w;
76*db6fe4d6SKees Cook
77*db6fe4d6SKees Cook /* Unknown input */
78*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, 0));
79*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, x));
80*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, y));
81*db6fe4d6SKees Cook
82*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, 0));
83*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, z));
84*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, w));
85*db6fe4d6SKees Cook
86*db6fe4d6SKees Cook /* Valid input */
87*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(1, 1));
88*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(39, 21));
89*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(100, 80));
90*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(110, 65));
91*db6fe4d6SKees Cook KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(127, 0));
92*db6fe4d6SKees Cook }
93*db6fe4d6SKees Cook
94*db6fe4d6SKees Cook
95*db6fe4d6SKees Cook static struct kunit_case bits_test_cases[] = {
96*db6fe4d6SKees Cook KUNIT_CASE(genmask_test),
97*db6fe4d6SKees Cook KUNIT_CASE(genmask_ull_test),
98*db6fe4d6SKees Cook KUNIT_CASE(genmask_u128_test),
99*db6fe4d6SKees Cook KUNIT_CASE(genmask_input_check_test),
100*db6fe4d6SKees Cook {}
101*db6fe4d6SKees Cook };
102*db6fe4d6SKees Cook
103*db6fe4d6SKees Cook static struct kunit_suite bits_test_suite = {
104*db6fe4d6SKees Cook .name = "bits-test",
105*db6fe4d6SKees Cook .test_cases = bits_test_cases,
106*db6fe4d6SKees Cook };
107*db6fe4d6SKees Cook kunit_test_suite(bits_test_suite);
108*db6fe4d6SKees Cook
109*db6fe4d6SKees Cook MODULE_DESCRIPTION("Test cases for functions and macros in bits.h");
110*db6fe4d6SKees Cook MODULE_LICENSE("GPL");
111