/* SPDX-License-Identifier: GPL-2.0-only */ /* This file is part of the coreboot project. */ #ifndef COMMONLIB_HELPERS_H #define COMMONLIB_HELPERS_H /* This file is for helpers for both coreboot firmware and its utilities. Most of this has moved into now, this wrapper is just for the stuff that nobody bothered to confirm BSD-licensability of yet. */ #include /* * Divide positive or negative dividend by positive divisor and round * to closest integer. Result is undefined for negative divisors and * for negative dividends if the divisor variable type is unsigned. */ #define DIV_ROUND_CLOSEST(x, divisor)({ \ __typeof__(x) _div_local_x = (x); \ __typeof__(divisor) _div_local_d = (divisor); \ (((__typeof__(x))-1) > 0 || \ ((__typeof__(divisor))-1) > 0 || (_div_local_x) > 0) ? \ ((_div_local_x + (_div_local_d / 2)) / _div_local_d) : \ ((_div_local_x - (_div_local_d / 2)) / _div_local_d); \ }) /** * container_of - cast a member of a structure out to the containing structure * @param ptr: the pointer to the member. * @param type: the type of the container struct this is embedded in. * @param member: the name of the member within the struct. * */ #define container_of(ptr, type, member) ({ \ const __typeof__(((type *)0)->member) *__mptr = (ptr); \ (type *)((char *)__mptr - offsetof(type, member)); }) #ifndef __unused #define __unused __attribute__((unused)) #endif #ifndef alloca #define alloca(x) __builtin_alloca(x) #endif #endif /* COMMONLIB_HELPERS_H */