On 9/27/18 8:50 AM, Stanislaw Gruszka wrote:
--snip
+#define BIT_LEN_MASK_32(__bitlen) (0xFFFFFFFF >> (32 - (__bitlen)))
+#define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
+ (BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
+#define LE_P4BYTE_TO_HOST_4BYTE(__start) (le32_to_cpu(*((__le32 *)(__start))))
+#define LE_BITS_CLEARED_TO_4BYTE(__start, __bitoffset, __bitlen) \
+ (LE_P4BYTE_TO_HOST_4BYTE(__start) & \
+ (~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)))
+#define LE_BITS_TO_4BYTE(__start, __bitoffset, __bitlen) \
+ ((LE_P4BYTE_TO_HOST_4BYTE(__start) >> (__bitoffset)) & \
+ BIT_LEN_MASK_32(__bitlen))
+#define SET_BITS_TO_LE_4BYTE(__start, __bitoffset, __bitlen, __value) \
+ do { \
+ *((__le32 *)(__start)) = \
+ cpu_to_le32( \
+ LE_BITS_CLEARED_TO_4BYTE(__start, __bitoffset, __bitlen) | \
+ ((((u32)__value) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset))\
+ ); \
+ } while (0)
Stanislaw,
I have never loved these macros, and it took a lot of time to get them to be
endian correct. Could you point me to a method that would overwrite a portion of
a 32-bit little-endian word that would be correct for both little- and
big-endian machines? Keep in mind that Kalle hates the use of compile tests on
__LITTLE_ENDIAN.
Thanks,
Larry