at v6.16 4.7 kB view raw
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 12static_assert(assert_type(u8, BIT_U8(0)) == 1u); 13static_assert(assert_type(u16, BIT_U16(0)) == 1u); 14static_assert(assert_type(u32, BIT_U32(0)) == 1u); 15static_assert(assert_type(u64, BIT_U64(0)) == 1ull); 16 17static_assert(assert_type(u8, BIT_U8(7)) == 0x80u); 18static_assert(assert_type(u16, BIT_U16(15)) == 0x8000u); 19static_assert(assert_type(u32, BIT_U32(31)) == 0x80000000u); 20static_assert(assert_type(u64, BIT_U64(63)) == 0x8000000000000000ull); 21 22static_assert(assert_type(unsigned long, GENMASK(31, 0)) == U32_MAX); 23static_assert(assert_type(unsigned long long, GENMASK_ULL(63, 0)) == U64_MAX); 24static_assert(assert_type(u8, GENMASK_U8(7, 0)) == U8_MAX); 25static_assert(assert_type(u16, GENMASK_U16(15, 0)) == U16_MAX); 26static_assert(assert_type(u32, GENMASK_U32(31, 0)) == U32_MAX); 27static_assert(assert_type(u64, GENMASK_U64(63, 0)) == U64_MAX); 28 29 30static 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 57static 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 72static 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 102static 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 125static 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 133static struct kunit_suite bits_test_suite = { 134 .name = "bits-test", 135 .test_cases = bits_test_cases, 136}; 137kunit_test_suite(bits_test_suite); 138 139MODULE_DESCRIPTION("Test cases for functions and macros in bits.h"); 140MODULE_LICENSE("GPL");