blob: c294bee1179a04f60eebb2e961ee97982439f4ec [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#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 <commonlib/bsd/helpers.h> now, this wrapper is just
for the stuff that nobody bothered to confirm BSD-licensability of yet. */
#include <commonlib/bsd/helpers.h>
/*
* 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 alloca
#define alloca(x) __builtin_alloca(x)
#endif
#endif /* COMMONLIB_HELPERS_H */