helper: add align.h

OpenOCD has to often align values or check for alignment.
Use a dedicated set of macros instead of reinventing the wheel
each time.

Change-Id: Ia58711608aae0801deeaccb5f33148f2073b0bbd
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/6374
Tested-by: jenkins
Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
This commit is contained in:
Antonio Borneo 2021-05-13 19:07:50 +02:00
parent 41efc6c419
commit 9544cd653d
2 changed files with 31 additions and 0 deletions

View File

@ -15,6 +15,7 @@ noinst_LTLIBRARIES += %D%/libhelper.la
%D%/util.c \ %D%/util.c \
%D%/jep106.c \ %D%/jep106.c \
%D%/jim-nvp.c \ %D%/jim-nvp.c \
%D%/align.h \
%D%/binarybuffer.h \ %D%/binarybuffer.h \
%D%/bits.h \ %D%/bits.h \
%D%/configuration.h \ %D%/configuration.h \

30
src/helper/align.h Normal file
View File

@ -0,0 +1,30 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* The content of this file is mainly copied/inspired from Linux kernel
* code in include/linux/align.h and include/uapi/linux/const.h
*
* Macro name 'ALIGN' conflicts with macOS/BSD file param.h
*/
#ifndef OPENOCD_HELPER_ALIGN_H
#define OPENOCD_HELPER_ALIGN_H
#define ALIGN_MASK(x, mask) \
({ \
typeof(mask) _mask = (mask); \
((x) + _mask) & ~_mask; \
})
/* @a is a power of 2 value */
#define ALIGN_UP(x, a) ALIGN_MASK(x, (typeof(x))(a) - 1)
#define ALIGN_DOWN(x, a) ((x) & ~((typeof(x))(a) - 1))
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)
#define IS_PWR_OF_2(x) \
({ \
typeof(x) _x = (x); \
_x == 0 || (_x & (_x - 1)) == 0; \
})
#endif /* OPENOCD_HELPER_ALIGN_H */