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/* 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");