aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-04-23 20:59:04 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-04-23 20:59:04 +0300
commit38c7c94bcd131290dcbae110dfb33b0b78c99d90 (patch)
tree7ca41e8cbd221b3f3421bfdd4f184f539a8ba8d0
parent42451ed4718af3f93770feb201bd023625d69b3a (diff)
downloadkmi-38c7c94bcd131290dcbae110dfb33b0b78c99d90.tar.gz
kmi-38c7c94bcd131290dcbae110dfb33b0b78c99d90.zip
change alignment functions to be type generic
-rw-r--r--common/mem_regions.c4
-rw-r--r--include/apos/utils.h114
2 files changed, 95 insertions, 23 deletions
diff --git a/common/mem_regions.c b/common/mem_regions.c
index e5de0e3..e994b0e 100644
--- a/common/mem_regions.c
+++ b/common/mem_regions.c
@@ -393,7 +393,7 @@ static void __try_coalesce_regions(struct mem_region_root *r,
stat_t free_region(struct mem_region_root *r, vm_t start)
{
/* addr not aligned to page boundary, corrupted or incorrect pointer */
- if (!aligned(start, BASE_PAGE_SIZE))
+ if (!is_aligned(start, BASE_PAGE_SIZE))
return ERR_ALIGN;
struct mem_region *m = find_used_region(r, __page(start));
@@ -431,7 +431,7 @@ vm_t map_fill_region(struct vm_branch *b, region_callback_t *mem_handler,
/* NULL does pass this check, so technically all NULL pages are
* aligned, but they're caught in the while expr so this should
* work even if someone tries to map NULL */
- if (!aligned(runner, o_pages))
+ if (!is_aligned(runner, o_pages))
continue;
while (pages >= o_pages) {
diff --git a/include/apos/utils.h b/include/apos/utils.h
index 1d1d6dd..ce48776 100644
--- a/include/apos/utils.h
+++ b/include/apos/utils.h
@@ -49,34 +49,106 @@
#include <apos/types.h>
-static inline uintptr_t align_up(uintptr_t val, uintptr_t a)
-{
- if (!a)
- return val;
+#define align_up(x, y) \
+ _Generic((x), int8_t \
+ : align_up_int8_t, int16_t \
+ : align_up_int16_t, int32_t \
+ : align_up_int32_t, int64_t \
+ : align_up_int64_t, \
+ \
+ uint8_t \
+ : align_up_uint8_t, uint16_t \
+ : align_up_uint16_t, uint32_t \
+ : align_up_uint32_t, uint64_t \
+ : align_up_uint64_t)((x), (y))
- uintptr_t rem = val % a;
+#define DEFINE_ALIGN_UP(type) \
+ static inline type align_up_##type(type val, type a) \
+ { \
+ if (!a) \
+ return val; \
+ \
+ type rem = val % a; \
+ \
+ if (rem == 0) \
+ return val; \
+ \
+ return val + a - rem; \
+ }
- if (rem == 0)
- return val;
+DEFINE_ALIGN_UP(int8_t);
+DEFINE_ALIGN_UP(int16_t);
+DEFINE_ALIGN_UP(int32_t);
+DEFINE_ALIGN_UP(int64_t);
- return val + a - rem;
-}
+DEFINE_ALIGN_UP(uint8_t);
+DEFINE_ALIGN_UP(uint16_t);
+DEFINE_ALIGN_UP(uint32_t);
+DEFINE_ALIGN_UP(uint64_t);
-static inline uintptr_t align_down(uintptr_t val, uintptr_t a)
-{
- if (!a)
- return val;
+#define align_down(x, y) \
+ _Generic((x), int8_t \
+ : align_down_int8_t, int16_t \
+ : align_down_int16_t, int32_t \
+ : align_down_int32_t, int64_t \
+ : align_down_int64_t, \
+ \
+ uint8_t \
+ : align_down_uint8_t, uint16_t \
+ : align_down_uint16_t, uint32_t \
+ : align_down_uint32_t, uint64_t \
+ : align_down_uint64_t)((x), (y))
- return val - (val % a);
-}
+#define DEFINE_ALIGN_DOWN(type) \
+ static inline type align_down_##type(type val, type a) \
+ { \
+ if (!a) \
+ return val; \
+ \
+ return val - (val % a); \
+ }
-static inline bool aligned(uintmax_t val, uintmax_t a)
-{
- if (!a)
- return true;
+DEFINE_ALIGN_DOWN(int8_t);
+DEFINE_ALIGN_DOWN(int16_t);
+DEFINE_ALIGN_DOWN(int32_t);
+DEFINE_ALIGN_DOWN(int64_t);
- return val % a == 0;
-}
+DEFINE_ALIGN_DOWN(uint8_t);
+DEFINE_ALIGN_DOWN(uint16_t);
+DEFINE_ALIGN_DOWN(uint32_t);
+DEFINE_ALIGN_DOWN(uint64_t);
+
+#define is_aligned(x, y) \
+ _Generic((x), int8_t \
+ : is_aligned_int8_t, int16_t \
+ : is_aligned_int16_t, int32_t \
+ : is_aligned_int32_t, int64_t \
+ : is_aligned_int64_t, \
+ \
+ uint8_t \
+ : is_aligned_uint8_t, uint16_t \
+ : is_aligned_uint16_t, uint32_t \
+ : is_aligned_uint32_t, uint64_t \
+ : is_aligned_uint64_t)((x), (y))
+
+#define DEFINE_ALIGNED(type) \
+ static inline bool is_aligned_##type(type val, type a) \
+ { \
+ if (!a) \
+ return true; \
+ \
+ return val % a == 0; \
+ }
+
+DEFINE_ALIGNED(int8_t);
+DEFINE_ALIGNED(int16_t);
+DEFINE_ALIGNED(int32_t);
+DEFINE_ALIGNED(int64_t);
+
+DEFINE_ALIGNED(uint8_t);
+DEFINE_ALIGNED(uint16_t);
+DEFINE_ALIGNED(uint32_t);
+DEFINE_ALIGNED(uint64_t);
static inline int asciinum(char c)
{