mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-25 14:56:03 +00:00

Port mbedtls with adapted libc header files. Add mbedtls default config header file. Optimize mbedtls default config by disabling unused features to reduce the target size. Add mbedtls kbuild makefile. Add Kconfig skeleton and config submenu entry for selecting crypto libraries between mbedtls and legacy ones. Add the mbedtls include directories into the build system. Port u-boot hash functions as MbedTLS crypto alternatives and set it as default. Subsequent patches will separate those Kconfigs into pairs of _LEGACY and _MBEDTLS for controlling the implementations of legacy crypto libraries and MbedTLS ones respectively. The motivation of moving and adapting *INT* macros from kernel.h to limits.h is to fulfill the MbedTLS building requirement. The conditional compilation statements in MbedTLS expects the *INT* macros as constant expressions, thus expressions like `((int)(~0U >> 1))` will not work. Prerequisite ------------ This patch series requires mbedtls git repo to be added as a subtree to the main U-Boot repo via: $ git subtree add --prefix lib/mbedtls/external/mbedtls \ https://github.com/Mbed-TLS/mbedtls.git \ v3.6.0 --squash Moreover, due to the Windows-style files from mbedtls git repo, we need to convert the CRLF endings to LF and do a commit manually: $ git add --renormalize . $ git commit Signed-off-by: Raymond Mao <raymond.mao@linaro.org>
299 lines
8.4 KiB
C
299 lines
8.4 KiB
C
#ifndef _LINUX_KERNEL_H
|
|
#define _LINUX_KERNEL_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/printk.h> /* for printf/pr_* utilities */
|
|
#include <limits.h>
|
|
|
|
#define USHRT_MAX ((u16)(~0U))
|
|
#define SHRT_MAX ((s16)(USHRT_MAX>>1))
|
|
#define SHRT_MIN ((s16)(-SHRT_MAX - 1))
|
|
#define INT_MIN (-INT_MAX - 1)
|
|
#define LONG_MAX ((long)(~0UL>>1))
|
|
#define LONG_MIN (-LONG_MAX - 1)
|
|
#define ULONG_MAX (~0UL)
|
|
#define LLONG_MAX ((long long)(~0ULL>>1))
|
|
#define LLONG_MIN (-LLONG_MAX - 1)
|
|
#define ULLONG_MAX (~0ULL)
|
|
|
|
#define U8_MAX ((u8)~0U)
|
|
#define S8_MAX ((s8)(U8_MAX>>1))
|
|
#define S8_MIN ((s8)(-S8_MAX - 1))
|
|
#define U16_MAX ((u16)~0U)
|
|
#define S16_MAX ((s16)(U16_MAX>>1))
|
|
#define S16_MIN ((s16)(-S16_MAX - 1))
|
|
#define U32_MAX ((u32)~0U)
|
|
#define S32_MAX ((s32)(U32_MAX>>1))
|
|
#define S32_MIN ((s32)(-S32_MAX - 1))
|
|
#define U64_MAX ((u64)~0ULL)
|
|
#define S64_MAX ((s64)(U64_MAX>>1))
|
|
#define S64_MIN ((s64)(-S64_MAX - 1))
|
|
|
|
#define INT32_MAX S32_MAX
|
|
|
|
#define STACK_MAGIC 0xdeadbeef
|
|
|
|
#define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
|
|
|
|
#define ALIGN(x,a) __ALIGN_MASK((x),(typeof(x))(a)-1)
|
|
#define ALIGN_DOWN(x, a) ALIGN((x) - ((a) - 1), (a))
|
|
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
|
|
#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a)))
|
|
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)
|
|
|
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
|
|
|
/*
|
|
* This looks more complex than it should be. But we need to
|
|
* get the type for the ~ right in round_down (it needs to be
|
|
* as wide as the result!), and we want to evaluate the macro
|
|
* arguments just once each.
|
|
*/
|
|
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
|
|
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
|
|
#define round_down(x, y) ((x) & ~__round_mask(x, y))
|
|
|
|
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
|
|
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
|
|
|
|
#define DIV_ROUND_DOWN_ULL(ll, d) \
|
|
({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; })
|
|
|
|
#define DIV_ROUND_UP_ULL(ll, d) DIV_ROUND_DOWN_ULL((ll) + (d) - 1, (d))
|
|
|
|
#define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1))
|
|
|
|
#if BITS_PER_LONG == 32
|
|
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
|
|
#else
|
|
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
|
|
#endif
|
|
|
|
/* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
|
|
#define roundup(x, y) ( \
|
|
{ \
|
|
const typeof(y) __y = y; \
|
|
(((x) + (__y - 1)) / __y) * __y; \
|
|
} \
|
|
)
|
|
#define rounddown(x, y) ( \
|
|
{ \
|
|
typeof(x) __x = (x); \
|
|
__x - (__x % (y)); \
|
|
} \
|
|
)
|
|
|
|
/*
|
|
* 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) __x = x; \
|
|
typeof(divisor) __d = divisor; \
|
|
(((typeof(x))-1) > 0 || \
|
|
((typeof(divisor))-1) > 0 || (__x) > 0) ? \
|
|
(((__x) + ((__d) / 2)) / (__d)) : \
|
|
(((__x) - ((__d) / 2)) / (__d)); \
|
|
} \
|
|
)
|
|
/*
|
|
* Same as above but for u64 dividends. divisor must be a 32-bit
|
|
* number.
|
|
*/
|
|
#define DIV_ROUND_CLOSEST_ULL(x, divisor)( \
|
|
{ \
|
|
typeof(divisor) __d = divisor; \
|
|
unsigned long long _tmp = (x) + (__d) / 2; \
|
|
do_div(_tmp, __d); \
|
|
_tmp; \
|
|
} \
|
|
)
|
|
|
|
/*
|
|
* Multiplies an integer by a fraction, while avoiding unnecessary
|
|
* overflow or loss of precision.
|
|
*/
|
|
#define mult_frac(x, numer, denom)( \
|
|
{ \
|
|
typeof(x) quot = (x) / (denom); \
|
|
typeof(x) rem = (x) % (denom); \
|
|
(quot * (numer)) + ((rem * (numer)) / (denom)); \
|
|
} \
|
|
)
|
|
|
|
/**
|
|
* upper_32_bits - return bits 32-63 of a number
|
|
* @n: the number we're accessing
|
|
*
|
|
* A basic shift-right of a 64- or 32-bit quantity. Use this to suppress
|
|
* the "right shift count >= width of type" warning when that quantity is
|
|
* 32-bits.
|
|
*/
|
|
#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
|
|
|
|
/**
|
|
* lower_32_bits - return bits 0-31 of a number
|
|
* @n: the number we're accessing
|
|
*/
|
|
#define lower_32_bits(n) ((u32)(n))
|
|
|
|
/*
|
|
* abs() handles unsigned and signed longs, ints, shorts and chars. For all
|
|
* input types abs() returns a signed long.
|
|
* abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
|
|
* for those.
|
|
*/
|
|
#define abs(x) ({ \
|
|
long ret; \
|
|
if (sizeof(x) == sizeof(long)) { \
|
|
long __x = (x); \
|
|
ret = (__x < 0) ? -__x : __x; \
|
|
} else { \
|
|
int __x = (x); \
|
|
ret = (__x < 0) ? -__x : __x; \
|
|
} \
|
|
ret; \
|
|
})
|
|
|
|
#define abs64(x) ({ \
|
|
s64 __x = (x); \
|
|
(__x < 0) ? -__x : __x; \
|
|
})
|
|
|
|
/*
|
|
* min()/max()/clamp() macros that also do
|
|
* strict type-checking.. See the
|
|
* "unnecessary" pointer comparison.
|
|
*/
|
|
#define min(x, y) ({ \
|
|
typeof(x) _min1 = (x); \
|
|
typeof(y) _min2 = (y); \
|
|
(void) (&_min1 == &_min2); \
|
|
_min1 < _min2 ? _min1 : _min2; })
|
|
|
|
#define max(x, y) ({ \
|
|
typeof(x) _max1 = (x); \
|
|
typeof(y) _max2 = (y); \
|
|
(void) (&_max1 == &_max2); \
|
|
_max1 > _max2 ? _max1 : _max2; })
|
|
|
|
#define min3(x, y, z) min((typeof(x))min(x, y), z)
|
|
#define max3(x, y, z) max((typeof(x))max(x, y), z)
|
|
|
|
/**
|
|
* min_not_zero - return the minimum that is _not_ zero, unless both are zero
|
|
* @x: value1
|
|
* @y: value2
|
|
*/
|
|
#define min_not_zero(x, y) ({ \
|
|
typeof(x) __x = (x); \
|
|
typeof(y) __y = (y); \
|
|
__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
|
|
|
|
/**
|
|
* clamp - return a value clamped to a given range with strict typechecking
|
|
* @val: current value
|
|
* @lo: lowest allowable value
|
|
* @hi: highest allowable value
|
|
*
|
|
* This macro does strict typechecking of lo/hi to make sure they are of the
|
|
* same type as val. See the unnecessary pointer comparisons.
|
|
*/
|
|
#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
|
|
|
|
/*
|
|
* ..and if you can't take the strict
|
|
* types, you can specify one yourself.
|
|
*
|
|
* Or not use min/max/clamp at all, of course.
|
|
*/
|
|
#define min_t(type, x, y) ({ \
|
|
type __min1 = (x); \
|
|
type __min2 = (y); \
|
|
__min1 < __min2 ? __min1: __min2; })
|
|
|
|
#define max_t(type, x, y) ({ \
|
|
type __max1 = (x); \
|
|
type __max2 = (y); \
|
|
__max1 > __max2 ? __max1: __max2; })
|
|
|
|
/**
|
|
* clamp_t - return a value clamped to a given range using a given type
|
|
* @type: the type of variable to use
|
|
* @val: current value
|
|
* @lo: minimum allowable value
|
|
* @hi: maximum allowable value
|
|
*
|
|
* This macro does no typechecking and uses temporary variables of type
|
|
* 'type' to make all the comparisons.
|
|
*/
|
|
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
|
|
|
|
/**
|
|
* clamp_val - return a value clamped to a given range using val's type
|
|
* @val: current value
|
|
* @lo: minimum allowable value
|
|
* @hi: maximum allowable value
|
|
*
|
|
* This macro does no typechecking and uses temporary variables of whatever
|
|
* type the input argument 'val' is. This is useful when val is an unsigned
|
|
* type and min and max are literals that will otherwise be assigned a signed
|
|
* integer type.
|
|
*/
|
|
#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
|
|
|
|
/*
|
|
* swap - swap value of @a and @b
|
|
*/
|
|
#define swap(a, b) \
|
|
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
|
|
|
|
/**
|
|
* container_of - cast a member of a structure out to the containing structure
|
|
* @ptr: the pointer to the member.
|
|
* @type: the type of the container struct this is embedded in.
|
|
* @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) );})
|
|
|
|
/*
|
|
* check_member() - Check the offset of a structure member
|
|
*
|
|
* @structure: Name of structure (e.g. global_data)
|
|
* @member: Name of member (e.g. baudrate)
|
|
* @offset: Expected offset in bytes
|
|
*/
|
|
#define check_member(structure, member, offset) _Static_assert( \
|
|
offsetof(struct structure, member) == (offset), \
|
|
"`struct " #structure "` offset for `" #member "` is not " #offset)
|
|
|
|
#define __find_closest(x, a, as, op) \
|
|
({ \
|
|
typeof(as) __fc_i, __fc_as = (as) - 1; \
|
|
typeof(x) __fc_x = (x); \
|
|
typeof(*a) const *__fc_a = (a); \
|
|
for (__fc_i = 0; __fc_i < __fc_as; __fc_i++) { \
|
|
if (__fc_x op DIV_ROUND_CLOSEST(__fc_a[__fc_i] + \
|
|
__fc_a[__fc_i + 1], 2)) \
|
|
break; \
|
|
} \
|
|
(__fc_i); \
|
|
})
|
|
|
|
/**
|
|
* find_closest - locate the closest element in a sorted array
|
|
* @x: The reference value.
|
|
* @a: The array in which to look for the closest element. Must be sorted
|
|
* in ascending order.
|
|
* @as: Size of 'a'.
|
|
*
|
|
* Returns the index of the element closest to 'x'.
|
|
*/
|
|
#define find_closest(x, a, as) __find_closest(x, a, as, <=)
|
|
|
|
#endif
|