at master 5.4 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/* FIXME: add a test case written in asm for GENMASK() and GENMASK_ULL() */ 30 31static 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 39static 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 47static 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 74static 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 89static 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 119static 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 142static 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 152static struct kunit_suite bits_test_suite = { 153 .name = "bits-test", 154 .test_cases = bits_test_cases, 155}; 156kunit_test_suite(bits_test_suite); 157 158MODULE_DESCRIPTION("Test cases for functions and macros in bits.h"); 159MODULE_LICENSE("GPL");