From e5cf9deb61fdc52c7647f4669a64d3fae126db94 Mon Sep 17 00:00:00 2001 From: Vladimir Kondratyev Date: Sat, 22 Apr 2023 11:29:29 +0300 Subject: [PATCH] LinuxKPI: Add bitmap_to_arr32() to bitmap_to_arr32() copies contents of bitmap to a uint32_t array of bits Required by: drm-kmod 5.15-lts Reviewed by: manu Differential Revision: https://reviews.freebsd.org/D39552 --- .../linuxkpi/common/include/linux/bitmap.h | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sys/compat/linuxkpi/common/include/linux/bitmap.h b/sys/compat/linuxkpi/common/include/linux/bitmap.h index 1ae6078966a4..4e156377cdaf 100644 --- a/sys/compat/linuxkpi/common/include/linux/bitmap.h +++ b/sys/compat/linuxkpi/common/include/linux/bitmap.h @@ -288,6 +288,26 @@ bitmap_copy(unsigned long *dst, const unsigned long *src, dst[i] = src[i]; } +static inline void +bitmap_to_arr32(uint32_t *dst, const unsigned long *src, unsigned int size) +{ + const unsigned int end = howmany(size, 32); + +#ifdef __LP64__ + unsigned int i = 0; + while (i < end) { + dst[i++] = (uint32_t)(*src & UINT_MAX); + if (i < end) + dst[i++] = (uint32_t)(*src >> 32); + src++; + } +#else + bitmap_copy(dst, src, size); +#endif + if ((size % 32) != 0) /* Linux uses BITS_PER_LONG. Seems to be a bug */ + dst[end - 1] &= (uint32_t)(UINT_MAX >> (32 - (size % 32))); +} + static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, const unsigned long *src2, const unsigned int size)