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