File Index
Files and directories
Sign in
FILE

test_bits.c

File preview with syntax highlighting.

linux-6.19.14/lib/tests/test_bits.c C
  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");
~/ Read-only file preview.