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