The branch main has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=70c508e691de1ed0f70b4a6f0773bfb5d627050d

commit 70c508e691de1ed0f70b4a6f0773bfb5d627050d
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2025-09-04 20:26:32 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2025-09-05 23:24:16 +0000

    LinuxKPI: sync overflow.h from Linux v6.16
    
    It seems overflow.h wsa imported directly from Linux in 3208d4ad2b8320a.
    Update the file to the newer version as needed for wireless driver updates.
    
    Sponsored by:   The FreeBSD Foundation (initially)
    MFC after:      3 days
    Obtained from:  git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
                    038d61fd642278 (tag: v6.16)
    Reviewed by:    dumbbell
    Differential Revision:  https://reviews.freebsd.org/D52078
---
 .../linuxkpi/common/include/linux/overflow.h       | 180 +++++++++++++++++----
 1 file changed, 153 insertions(+), 27 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/overflow.h 
b/sys/compat/linuxkpi/common/include/linux/overflow.h
index 9ba9b9500f11..e811037b8ecc 100644
--- a/sys/compat/linuxkpi/common/include/linux/overflow.h
+++ b/sys/compat/linuxkpi/common/include/linux/overflow.h
@@ -33,8 +33,10 @@
  * credit to Christian Biere.
  */
 #define __type_half_max(type) ((type)1 << (8*sizeof(type) - 1 - 
is_signed_type(type)))
-#define type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T)))
-#define type_min(T) ((T)((T)-type_max(T)-(T)1))
+#define __type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T)))
+#define type_max(t)    __type_max(typeof(t))
+#define __type_min(T) ((T)((T)-type_max(T)-(T)1))
+#define type_min(t)    __type_min(typeof(t))
 
 /*
  * Avoids triggering -Wtype-limits compilation warning,
@@ -59,45 +61,122 @@ static inline bool __must_check __must_check_overflow(bool 
overflow)
  * @b: second addend
  * @d: pointer to store sum
  *
- * Returns 0 on success.
+ * Returns true on wrap-around, false otherwise.
  *
- * *@d holds the results of the attempted addition, but is not considered
- * "safe for use" on a non-zero return value, which indicates that the
- * sum has overflowed or been truncated.
+ * *@d holds the results of the attempted addition, regardless of whether
+ * wrap-around occurred.
  */
 #define check_add_overflow(a, b, d)    \
        __must_check_overflow(__builtin_add_overflow(a, b, d))
 
+/**
+ * wrapping_add() - Intentionally perform a wrapping addition
+ * @type: type for result of calculation
+ * @a: first addend
+ * @b: second addend
+ *
+ * Return the potentially wrapped-around addition without
+ * tripping any wrap-around sanitizers that may be enabled.
+ */
+#define wrapping_add(type, a, b)                               \
+       ({                                                      \
+               type __val;                                     \
+               __builtin_add_overflow(a, b, &__val);           \
+               __val;                                          \
+       })
+
+/**
+ * wrapping_assign_add() - Intentionally perform a wrapping increment 
assignment
+ * @var: variable to be incremented
+ * @offset: amount to add
+ *
+ * Increments @var by @offset with wrap-around. Returns the resulting
+ * value of @var. Will not trip any wrap-around sanitizers.
+ *
+ * Returns the new value of @var.
+ */
+#define wrapping_assign_add(var, offset)                               \
+       ({                                                              \
+               typeof(var) *__ptr = &(var);                            \
+               *__ptr = wrapping_add(typeof(var), *__ptr, offset);     \
+       })
+
 /**
  * check_sub_overflow() - Calculate subtraction with overflow checking
  * @a: minuend; value to subtract from
  * @b: subtrahend; value to subtract from @a
  * @d: pointer to store difference
  *
- * Returns 0 on success.
+ * Returns true on wrap-around, false otherwise.
  *
- * *@d holds the results of the attempted subtraction, but is not considered
- * "safe for use" on a non-zero return value, which indicates that the
- * difference has underflowed or been truncated.
+ * *@d holds the results of the attempted subtraction, regardless of whether
+ * wrap-around occurred.
  */
 #define check_sub_overflow(a, b, d)    \
        __must_check_overflow(__builtin_sub_overflow(a, b, d))
 
+/**
+ * wrapping_sub() - Intentionally perform a wrapping subtraction
+ * @type: type for result of calculation
+ * @a: minuend; value to subtract from
+ * @b: subtrahend; value to subtract from @a
+ *
+ * Return the potentially wrapped-around subtraction without
+ * tripping any wrap-around sanitizers that may be enabled.
+ */
+#define wrapping_sub(type, a, b)                               \
+       ({                                                      \
+               type __val;                                     \
+               __builtin_sub_overflow(a, b, &__val);           \
+               __val;                                          \
+       })
+
+/**
+ * wrapping_assign_sub() - Intentionally perform a wrapping decrement assign
+ * @var: variable to be decremented
+ * @offset: amount to subtract
+ *
+ * Decrements @var by @offset with wrap-around. Returns the resulting
+ * value of @var. Will not trip any wrap-around sanitizers.
+ *
+ * Returns the new value of @var.
+ */
+#define wrapping_assign_sub(var, offset)                               \
+       ({                                                              \
+               typeof(var) *__ptr = &(var);                            \
+               *__ptr = wrapping_sub(typeof(var), *__ptr, offset);     \
+       })
+
 /**
  * check_mul_overflow() - Calculate multiplication with overflow checking
  * @a: first factor
  * @b: second factor
  * @d: pointer to store product
  *
- * Returns 0 on success.
+ * Returns true on wrap-around, false otherwise.
  *
- * *@d holds the results of the attempted multiplication, but is not
- * considered "safe for use" on a non-zero return value, which indicates
- * that the product has overflowed or been truncated.
+ * *@d holds the results of the attempted multiplication, regardless of whether
+ * wrap-around occurred.
  */
 #define check_mul_overflow(a, b, d)    \
        __must_check_overflow(__builtin_mul_overflow(a, b, d))
 
+/**
+ * wrapping_mul() - Intentionally perform a wrapping multiplication
+ * @type: type for result of calculation
+ * @a: first factor
+ * @b: second factor
+ *
+ * Return the potentially wrapped-around multiplication without
+ * tripping any wrap-around sanitizers that may be enabled.
+ */
+#define wrapping_mul(type, a, b)                               \
+       ({                                                      \
+               type __val;                                     \
+               __builtin_mul_overflow(a, b, &__val);           \
+               __val;                                          \
+       })
+
 /**
  * check_shl_overflow() - Calculate a left-shifted value and check overflow
  * @a: Value to be shifted
@@ -122,7 +201,7 @@ static inline bool __must_check __must_check_overflow(bool 
overflow)
        typeof(a) _a = a;                                               \
        typeof(s) _s = s;                                               \
        typeof(d) _d = d;                                               \
-       u64 _a_full = _a;                                               \
+       unsigned long long _a_full = _a;                                \
        unsigned int _to_shift =                                        \
                is_non_negative(_s) && _s < 8 * sizeof(*d) ? _s : 0;    \
        *_d = (_a_full << _to_shift);                                   \
@@ -132,10 +211,10 @@ static inline bool __must_check 
__must_check_overflow(bool overflow)
 
 #define __overflows_type_constexpr(x, T) (                     \
        is_unsigned_type(typeof(x)) ?                           \
-               (x) > type_max(typeof(T)) :                     \
+               (x) > type_max(T) :                             \
        is_unsigned_type(typeof(T)) ?                           \
-               (x) < 0 || (x) > type_max(typeof(T)) :          \
-       (x) < type_min(typeof(T)) || (x) > type_max(typeof(T)))
+               (x) < 0 || (x) > type_max(T) :                  \
+       (x) < type_min(T) || (x) > type_max(T))
 
 #define __overflows_type(x, T)         ({      \
        typeof(T) v = 0;                        \
@@ -312,27 +391,40 @@ static inline size_t __must_check size_sub(size_t 
minuend, size_t subtrahend)
        struct_size((type *)NULL, member, count)
 
 /**
- * _DEFINE_FLEX() - helper macro for DEFINE_FLEX() family.
- * Enables caller macro to pass (different) initializer.
+ * __DEFINE_FLEX() - helper macro for DEFINE_FLEX() family.
+ * Enables caller macro to pass arbitrary trailing expressions
  *
  * @type: structure type name, including "struct" keyword.
  * @name: Name for a variable to define.
  * @member: Name of the array member.
  * @count: Number of elements in the array; must be compile-time const.
- * @initializer: initializer expression (could be empty for no init).
+ * @trailer: Trailing expressions for attributes and/or initializers.
  */
-#define _DEFINE_FLEX(type, name, member, count, initializer)                   
\
+#define __DEFINE_FLEX(type, name, member, count, trailer...)                   
\
        _Static_assert(__builtin_constant_p(count),                             
\
                       "onstack flex array members require compile-time const 
count"); \
        union {                                                                 
\
                u8 bytes[struct_size_t(type, member, count)];                   
\
                type obj;                                                       
\
-       } name##_u initializer;                                                 
\
+       } name##_u trailer;                                                     
\
        type *name = (type *)&name##_u
 
 /**
- * DEFINE_FLEX() - Define an on-stack instance of structure with a trailing
- * flexible array member.
+ * _DEFINE_FLEX() - helper macro for DEFINE_FLEX() family.
+ * Enables caller macro to pass (different) initializer.
+ *
+ * @type: structure type name, including "struct" keyword.
+ * @name: Name for a variable to define.
+ * @member: Name of the array member.
+ * @count: Number of elements in the array; must be compile-time const.
+ * @initializer: Initializer expression (e.g., pass `= { }` at minimum).
+ */
+#define _DEFINE_FLEX(type, name, member, count, initializer...)                
        \
+       __DEFINE_FLEX(type, name, member, count, = { .obj initializer })
+
+/**
+ * DEFINE_RAW_FLEX() - Define an on-stack instance of structure with a trailing
+ * flexible array member, when it does not have a __counted_by annotation.
  *
  * @type: structure type name, including "struct" keyword.
  * @name: Name for a variable to define.
@@ -342,8 +434,42 @@ static inline size_t __must_check size_sub(size_t minuend, 
size_t subtrahend)
  * Define a zeroed, on-stack, instance of @type structure with a trailing
  * flexible array member.
  * Use __struct_size(@name) to get compile-time size of it afterwards.
+ * Use __member_size(@name->member) to get compile-time size of @name members.
+ * Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time number of
+ * elements in array @member.
+ */
+#define DEFINE_RAW_FLEX(type, name, member, count)     \
+       __DEFINE_FLEX(type, name, member, count, = { })
+
+/**
+ * DEFINE_FLEX() - Define an on-stack instance of structure with a trailing
+ * flexible array member.
+ *
+ * @TYPE: structure type name, including "struct" keyword.
+ * @NAME: Name for a variable to define.
+ * @MEMBER: Name of the array member.
+ * @COUNTER: Name of the __counted_by member.
+ * @COUNT: Number of elements in the array; must be compile-time const.
+ *
+ * Define a zeroed, on-stack, instance of @TYPE structure with a trailing
+ * flexible array member.
+ * Use __struct_size(@NAME) to get compile-time size of it afterwards.
+ * Use __member_size(@NAME->member) to get compile-time size of @NAME members.
+ * Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time number of
+ * elements in array @member.
+ */
+#define DEFINE_FLEX(TYPE, NAME, MEMBER, COUNTER, COUNT)        \
+       _DEFINE_FLEX(TYPE, NAME, MEMBER, COUNT, = { .COUNTER = COUNT, })
+
+/**
+ * STACK_FLEX_ARRAY_SIZE() - helper macro for DEFINE_FLEX() family.
+ * Returns the number of elements in @array.
+ *
+ * @name: Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX().
+ * @array: Name of the array member.
  */
-#define DEFINE_FLEX(type, name, member, count)                 \
-       _DEFINE_FLEX(type, name, member, count, = {})
+#define STACK_FLEX_ARRAY_SIZE(name, array)                                     
        \
+       (__member_size((name)->array) / sizeof(*(name)->array) +                
        \
+                                               __must_be_array((name)->array))
 
 #endif /* _LINUXKPI_LINUX_OVERFLOW_H */

Reply via email to