Message ID | 20250306-fixed-type-genmasks-v5-7-b443e9dcba63@wanadoo.fr (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | bits: Fixed-type GENMASK()/BIT() | expand |
On Thu, Mar 06, 2025 at 08:29:58PM +0900, Vincent Mailhol via B4 Relay wrote: > From: Vincent Mailhol <mailhol.vincent@wanadoo.fr> > > Add some additional tests in lib/test_bits.c to cover the expected > results of the fixed type BIT_U*() macros. Still would be good to have a small assembly test case for GENMASK*() as they went split and it will be a good regression test in case somebody decides to unify both without much thinking..
On 06/03/2025 at 22:11, Andy Shevchenko wrote: > On Thu, Mar 06, 2025 at 08:29:58PM +0900, Vincent Mailhol via B4 Relay wrote: >> From: Vincent Mailhol <mailhol.vincent@wanadoo.fr> >> >> Add some additional tests in lib/test_bits.c to cover the expected >> results of the fixed type BIT_U*() macros. > > Still would be good to have a small assembly test case for GENMASK*() as they > went split and it will be a good regression test in case somebody decides to > unify both without much thinking.. Let me confirm that I correctly understood your ask. Would something like this meet your expectations? diff --git a/lib/test_bits.c b/lib/test_bits.c index 72984fae7b81..869b291587e6 100644 --- a/lib/test_bits.c +++ b/lib/test_bits.c @@ -136,6 +136,29 @@ static void genmask_input_check_test(struct kunit *test) KUNIT_EXPECT_EQ(test, 0, GENMASK_INPUT_CHECK(127, 0)); } +#undef __LINUX_BITS_H +#undef GENMASK +#undef GENMASK_ULL +#define __ASSEMBLY__ +#include <linux/bits.h> +static void asm_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 asm_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)); +} +#undef __ASSEMBLY__ +#undef GENMASK +#undef GENMASK_ULL static struct kunit_case bits_test_cases[] = { KUNIT_CASE(__genmask_test), @@ -144,6 +167,8 @@ static struct kunit_case bits_test_cases[] = { KUNIT_CASE(genmask_ull_test), KUNIT_CASE(genmask_u128_test), KUNIT_CASE(genmask_input_check_test), + KUNIT_CASE(asm_genmask_test), + KUNIT_CASE(asm_genmask_ull_test), {} }; Yours sincerely, Vincent Mailhol
diff --git a/lib/test_bits.c b/lib/test_bits.c index 91968227687bb11b7d1361b153c27eb851c6c1c2..72984fae7b815031bb6eb2892c772ffcc409cf78 100644 --- a/lib/test_bits.c +++ b/lib/test_bits.c @@ -9,6 +9,16 @@ #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);