test_bits.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Test cases for functions and macros in bits.h
  4. */
  5. #include <kunit/test.h>
  6. #include <linux/bits.h>
  7. #include <linux/types.h>
  8. #define assert_type(t, x) _Generic(x, t: x, default: 0)
  9. static_assert(assert_type(u8, BIT_U8(0)) == 1u);
  10. static_assert(assert_type(u16, BIT_U16(0)) == 1u);
  11. static_assert(assert_type(u32, BIT_U32(0)) == 1u);
  12. static_assert(assert_type(u64, BIT_U64(0)) == 1ull);
  13. static_assert(assert_type(u8, BIT_U8(7)) == 0x80u);
  14. static_assert(assert_type(u16, BIT_U16(15)) == 0x8000u);
  15. static_assert(assert_type(u32, BIT_U32(31)) == 0x80000000u);
  16. static_assert(assert_type(u64, BIT_U64(63)) == 0x8000000000000000ull);
  17. static_assert(assert_type(unsigned long, GENMASK(31, 0)) == U32_MAX);
  18. static_assert(assert_type(unsigned long long, GENMASK_ULL(63, 0)) == U64_MAX);
  19. static_assert(assert_type(u8, GENMASK_U8(7, 0)) == U8_MAX);
  20. static_assert(assert_type(u16, GENMASK_U16(15, 0)) == U16_MAX);
  21. static_assert(assert_type(u32, GENMASK_U32(31, 0)) == U32_MAX);
  22. static_assert(assert_type(u64, GENMASK_U64(63, 0)) == U64_MAX);
  23. /* FIXME: add a test case written in asm for GENMASK() and GENMASK_ULL() */
  24. static void __genmask_test(struct kunit *test)
  25. {
  26. KUNIT_EXPECT_EQ(test, 1ul, __GENMASK(0, 0));
  27. KUNIT_EXPECT_EQ(test, 3ul, __GENMASK(1, 0));
  28. KUNIT_EXPECT_EQ(test, 6ul, __GENMASK(2, 1));
  29. KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, __GENMASK(31, 0));
  30. }
  31. static void __genmask_ull_test(struct kunit *test)
  32. {
  33. KUNIT_EXPECT_EQ(test, 1ull, __GENMASK_ULL(0, 0));
  34. KUNIT_EXPECT_EQ(test, 3ull, __GENMASK_ULL(1, 0));
  35. KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, __GENMASK_ULL(39, 21));
  36. KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, __GENMASK_ULL(63, 0));
  37. }
  38. static void genmask_test(struct kunit *test)
  39. {
  40. KUNIT_EXPECT_EQ(test, 1ul, GENMASK(0, 0));
  41. KUNIT_EXPECT_EQ(test, 3ul, GENMASK(1, 0));
  42. KUNIT_EXPECT_EQ(test, 6ul, GENMASK(2, 1));
  43. KUNIT_EXPECT_EQ(test, 0xFFFFFFFFul, GENMASK(31, 0));
  44. KUNIT_EXPECT_EQ(test, 1u, GENMASK_U8(0, 0));
  45. KUNIT_EXPECT_EQ(test, 3u, GENMASK_U16(1, 0));
  46. KUNIT_EXPECT_EQ(test, 0x10000, GENMASK_U32(16, 16));
  47. #ifdef TEST_GENMASK_FAILURES
  48. /* these should fail compilation */
  49. GENMASK(0, 1);
  50. GENMASK(0, 10);
  51. GENMASK(9, 10);
  52. GENMASK_U32(0, 31);
  53. GENMASK_U64(64, 0);
  54. GENMASK_U32(32, 0);
  55. GENMASK_U16(16, 0);
  56. GENMASK_U8(8, 0);
  57. #endif
  58. }
  59. static void genmask_ull_test(struct kunit *test)
  60. {
  61. KUNIT_EXPECT_EQ(test, 1ull, GENMASK_ULL(0, 0));
  62. KUNIT_EXPECT_EQ(test, 3ull, GENMASK_ULL(1, 0));
  63. KUNIT_EXPECT_EQ(test, 0x000000ffffe00000ull, GENMASK_ULL(39, 21));
  64. KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_ULL(63, 0));
  65. #ifdef TEST_GENMASK_FAILURES
  66. /* these should fail compilation */
  67. GENMASK_ULL(0, 1);
  68. GENMASK_ULL(0, 10);
  69. GENMASK_ULL(9, 10);
  70. #endif
  71. }
  72. static 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. /* Above 64 bit masks - only 64 bit portion can be validated once */
  83. KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(64, 0) >> 1);
  84. KUNIT_EXPECT_EQ(test, 0x00000000ffffffffull, GENMASK_U128(81, 50) >> 50);
  85. KUNIT_EXPECT_EQ(test, 0x0000000000ffffffull, GENMASK_U128(87, 64) >> 64);
  86. KUNIT_EXPECT_EQ(test, 0x0000000000ff0000ull, GENMASK_U128(87, 80) >> 64);
  87. KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, GENMASK_U128(127, 0) >> 64);
  88. KUNIT_EXPECT_EQ(test, 0xffffffffffffffffull, (u64)GENMASK_U128(127, 0));
  89. KUNIT_EXPECT_EQ(test, 0x0000000000000003ull, GENMASK_U128(127, 126) >> 126);
  90. KUNIT_EXPECT_EQ(test, 0x0000000000000001ull, GENMASK_U128(127, 127) >> 127);
  91. #ifdef TEST_GENMASK_FAILURES
  92. /* these should fail compilation */
  93. GENMASK_U128(0, 1);
  94. GENMASK_U128(0, 10);
  95. GENMASK_U128(9, 10);
  96. #endif /* TEST_GENMASK_FAILURES */
  97. #endif /* CONFIG_ARCH_SUPPORTS_INT128 */
  98. }
  99. static void genmask_input_check_test(struct kunit *test)
  100. {
  101. unsigned int x, y;
  102. int z, w;
  103. /* Unknown input */
  104. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, 0));
  105. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, x));
  106. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(x, y));
  107. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, 0));
  108. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(0, z));
  109. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(z, w));
  110. /* Valid input */
  111. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(1, 1));
  112. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(39, 21));
  113. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(100, 80));
  114. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(110, 65));
  115. KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(127, 0));
  116. }
  117. static struct kunit_case bits_test_cases[] = {
  118. KUNIT_CASE(__genmask_test),
  119. KUNIT_CASE(__genmask_ull_test),
  120. KUNIT_CASE(genmask_test),
  121. KUNIT_CASE(genmask_ull_test),
  122. KUNIT_CASE(genmask_u128_test),
  123. KUNIT_CASE(genmask_input_check_test),
  124. {}
  125. };
  126. static struct kunit_suite bits_test_suite = {
  127. .name = "bits-test",
  128. .test_cases = bits_test_cases,
  129. };
  130. kunit_test_suite(bits_test_suite);
  131. MODULE_DESCRIPTION("Test cases for functions and macros in bits.h");
  132. MODULE_LICENSE("GPL");