Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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");