lib/tests/test_bits.c

Source file repositories/reference/linux-study-clean/lib/tests/test_bits.c

File Facts

System
Linux kernel
Corpus path
lib/tests/test_bits.c
Extension
.c
Size
5353 bytes
Lines
160
Domain
Kernel Services
Bucket
lib
Inferred role
Kernel Services: implementation source
Status
source implementation candidate

Why This File Exists

Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0+
/*
 * Test cases for functions and macros in bits.h
 */

#include <kunit/test.h>
#include <linux/bits.h>
#include <linux/types.h>

#define assert_type(t, x) _Generic(x, t: x, default: 0)

static_assert(assert_type(u8, BIT_U8(0)) == 1u);
static_assert(assert_type(u16, BIT_U16(0)) == 1u);
static_assert(assert_type(u32, BIT_U32(0)) == 1u);
static_assert(assert_type(u64, BIT_U64(0)) == 1ull);

static_assert(assert_type(u8, BIT_U8(7)) == 0x80u);
static_assert(assert_type(u16, BIT_U16(15)) == 0x8000u);
static_assert(assert_type(u32, BIT_U32(31)) == 0x80000000u);
static_assert(assert_type(u64, BIT_U64(63)) == 0x8000000000000000ull);

static_assert(assert_type(unsigned long, GENMASK(31, 0)) == U32_MAX);
static_assert(assert_type(unsigned long long, GENMASK_ULL(63, 0)) == U64_MAX);
static_assert(assert_type(u8, GENMASK_U8(7, 0)) == U8_MAX);
static_assert(assert_type(u16, GENMASK_U16(15, 0)) == U16_MAX);
static_assert(assert_type(u32, GENMASK_U32(31, 0)) == U32_MAX);
static_assert(assert_type(u64, GENMASK_U64(63, 0)) == U64_MAX);

/* FIXME: add a test case written in asm for GENMASK() and GENMASK_ULL() */

static void __genmask_test(struct kunit *test)
{
	KUNIT_EXPECT_EQ(test, 1ul, __GENMASK(0, 0));
	KUNIT_EXPECT_EQ(test, 3ul, __GENMASK(1, 0));
	KUNIT_EXPECT_EQ(test, 6ul, __GENMASK(2, 1));
	KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, __GENMASK(31, 0));
}

static void __genmask_ull_test(struct kunit *test)
{
	KUNIT_EXPECT_EQ(test, 1ull, __GENMASK_ULL(0, 0));
	KUNIT_EXPECT_EQ(test, 3ull, __GENMASK_ULL(1, 0));
	KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, __GENMASK_ULL(39, 21));
	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, __GENMASK_ULL(63, 0));
}

static void genmask_test(struct kunit *test)
{
	KUNIT_EXPECT_EQ(test, 1ul, GENMASK(0, 0));
	KUNIT_EXPECT_EQ(test, 3ul, GENMASK(1, 0));
	KUNIT_EXPECT_EQ(test, 6ul, GENMASK(2, 1));
	KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, GENMASK(31, 0));

	KUNIT_EXPECT_EQ(test, 1u, GENMASK_U8(0, 0));
	KUNIT_EXPECT_EQ(test, 3u, GENMASK_U16(1, 0));
	KUNIT_EXPECT_EQ(test, 0x10000, GENMASK_U32(16, 16));

#ifdef TEST_GENMASK_FAILURES
	/* these should fail compilation */
	GENMASK(0, 1);
	GENMASK(0, 10);
	GENMASK(9, 10);

	GENMASK_U32(0, 31);
	GENMASK_U64(64, 0);
	GENMASK_U32(32, 0);
	GENMASK_U16(16, 0);
	GENMASK_U8(8, 0);
#endif


}

static void genmask_ull_test(struct kunit *test)
{
	KUNIT_EXPECT_EQ(test, 1ull, GENMASK_ULL(0, 0));
	KUNIT_EXPECT_EQ(test, 3ull, GENMASK_ULL(1, 0));
	KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_ULL(39, 21));
	KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_ULL(63, 0));

#ifdef TEST_GENMASK_FAILURES
	/* these should fail compilation */
	GENMASK_ULL(0, 1);
	GENMASK_ULL(0, 10);
	GENMASK_ULL(9, 10);
#endif
}

static void genmask_u128_test(struct kunit *test)
{

Annotation

Implementation Notes