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