mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
MISRA C Rule 20.7 states: "Expressions resulting from the expansion of macro parameters shall be enclosed in parentheses". Therefore, some macro definitions should gain additional parentheses to ensure that all current and future users will be safe with respect to expansions that can possibly alter the semantics of the passed-in macro parameter. No functional change. Signed-off-by: Nicola Vetrini <nicola.vetrini@bugseng.com> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
112 lines
3.2 KiB
C
112 lines
3.2 KiB
C
#ifndef __XEN_TOOLS_COMMON_MACROS__
|
|
#define __XEN_TOOLS_COMMON_MACROS__
|
|
|
|
/*
|
|
* Caution:
|
|
*
|
|
* This header must be completely self-contained. There are no external
|
|
* references to variables or functions allowed, as the file might be included
|
|
* for different runtime environments, such as firmware or target and build
|
|
* host programs.
|
|
*/
|
|
|
|
#ifndef BUILD_BUG_ON
|
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
|
|
#define BUILD_BUG_ON(p) ({ _Static_assert(!(p), "!(" #p ")"); })
|
|
#else
|
|
#define BUILD_BUG_ON(p) ((void)sizeof(char[1 - 2 * !!(p)]))
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef ARRAY_SIZE
|
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*a))
|
|
#endif
|
|
|
|
#ifndef MAX
|
|
#define MAX(x, y) ((x) > (y) ? (x) : (y))
|
|
#endif
|
|
|
|
#ifndef MIN
|
|
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
|
#endif
|
|
|
|
#ifndef min
|
|
#define min(x, y) \
|
|
({ \
|
|
const typeof(x) _x = (x); \
|
|
const typeof(y) _y = (y); \
|
|
(void) (&_x == &_y); \
|
|
(_x < _y) ? _x : _y; \
|
|
})
|
|
#endif
|
|
|
|
#ifndef max
|
|
#define max(x, y) \
|
|
({ \
|
|
const typeof(x) _x = (x); \
|
|
const typeof(y) _y = (y); \
|
|
(void)(&_x == &_y); \
|
|
(_x > _y) ? _x : _y; \
|
|
})
|
|
#endif
|
|
|
|
#ifndef min_t
|
|
#define min_t(type, x, y) \
|
|
({ \
|
|
const type _x = (x); \
|
|
const type _y = (y); \
|
|
(_x < _y) ? _x: _y; \
|
|
})
|
|
#endif
|
|
|
|
#ifndef max_t
|
|
#define max_t(type, x, y) \
|
|
({ \
|
|
const type _x = (x); \
|
|
const type _y = (y); \
|
|
(_x > _y) ? _x: _y; \
|
|
})
|
|
#endif
|
|
|
|
#ifndef ROUNDUP
|
|
#define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1))
|
|
#endif
|
|
|
|
#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m)))
|
|
#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m))
|
|
|
|
#ifndef __must_check
|
|
#define __must_check __attribute__((__warn_unused_result__))
|
|
#endif
|
|
|
|
#ifndef __packed
|
|
#define __packed __attribute__((__packed__))
|
|
#endif
|
|
|
|
#define container_of(ptr, type, member) ({ \
|
|
typeof(((type *)0)->member) *mptr__ = (ptr); \
|
|
(type *)((char *)mptr__ - offsetof(type, member)); \
|
|
})
|
|
|
|
#define __AC(X, Y) (X ## Y)
|
|
#define _AC(X, Y) __AC(X, Y)
|
|
|
|
/* Size macros. */
|
|
#define MB(_mb) (_AC(_mb, ULL) << 20)
|
|
#define GB(_gb) (_AC(_gb, ULL) << 30)
|
|
|
|
#define get_unaligned_t(type, ptr) ({ \
|
|
const struct { type x; } __packed *ptr_ = (typeof(ptr_))(ptr); \
|
|
ptr_->x; \
|
|
})
|
|
|
|
#define put_unaligned_t(type, val, ptr) do { \
|
|
struct { type x; } __packed *ptr_ = (typeof(ptr_))(ptr); \
|
|
ptr_->x = (val); \
|
|
} while (0)
|
|
|
|
#define get_unaligned(ptr) get_unaligned_t(typeof(*(ptr)), ptr)
|
|
#define put_unaligned(val, ptr) put_unaligned_t(typeof(*(ptr)), val, ptr)
|
|
|
|
#endif /* __XEN_TOOLS_COMMON_MACROS__ */
|