aboutsummaryrefslogtreecommitdiff
path: root/src/helper/align.h
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2021-05-13 19:07:50 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2021-08-14 13:29:43 +0100
commit9544cd653df120266582f69bddc77d32541caae7 (patch)
tree885bf8cf99e3d9760f1c44fe902ae8213ff4cf97 /src/helper/align.h
parent41efc6c419cf5c63a1f555dc5b7634a2e18d9c04 (diff)
downloadriscv-openocd-9544cd653df120266582f69bddc77d32541caae7.zip
riscv-openocd-9544cd653df120266582f69bddc77d32541caae7.tar.gz
riscv-openocd-9544cd653df120266582f69bddc77d32541caae7.tar.bz2
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>
Diffstat (limited to 'src/helper/align.h')
-rw-r--r--src/helper/align.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/helper/align.h b/src/helper/align.h
new file mode 100644
index 0000000..935a6a3
--- /dev/null
+++ b/src/helper/align.h
@@ -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 */