xref: /aosp_15_r20/external/coreboot/src/commonlib/include/commonlib/helpers.h (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef COMMONLIB_HELPERS_H
4 #define COMMONLIB_HELPERS_H
5 
6 /* This file is for helpers for both coreboot firmware and its utilities. Most
7    of this has moved into <commonlib/bsd/helpers.h> now, this wrapper is just
8    for the stuff that nobody bothered to confirm BSD-licensability of yet. */
9 
10 #include <commonlib/bsd/helpers.h>
11 
12 /*
13  * Divide positive or negative dividend by positive divisor and round
14  * to closest integer. Result is undefined for negative divisors and
15  * for negative dividends if the divisor variable type is unsigned.
16  */
17 #define DIV_ROUND_CLOSEST(x, divisor)({					\
18 	__typeof__(x) _div_local_x = (x);				\
19 	__typeof__(divisor) _div_local_d = (divisor);			\
20 	(((__typeof__(x))-1) > 0 ||					\
21 	 ((__typeof__(divisor))-1) > 0 || (_div_local_x) > 0) ?		\
22 		((_div_local_x + (_div_local_d / 2)) / _div_local_d) :	\
23 		((_div_local_x - (_div_local_d / 2)) / _div_local_d);	\
24 })
25 
26 /**
27  * container_of - cast a member of a structure out to the containing structure
28  * @param ptr:    the pointer to the member.
29  * @param type:   the type of the container struct this is embedded in.
30  * @param member: the name of the member within the struct.
31  *
32  */
33 #define container_of(ptr, type, member) ({			\
34 	const __typeof__(((type *)0)->member) *__mptr = (ptr);	\
35 	(type *)((char *)__mptr - offsetof(type, member)); })
36 
37 #ifndef alloca
38 #define alloca(x) __builtin_alloca(x)
39 #endif
40 
41 #endif /* COMMONLIB_HELPERS_H */
42