From 4c6be9cb63ff66ce49a6f733c1e00d1889f2c95f Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sun, 10 Apr 2022 20:37:51 +0300 Subject: add basic ubsan and fix issues reported by it --- include/apos/bits.h | 6 ++--- include/apos/mem.h | 4 +-- include/apos/unaligned.h | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 include/apos/unaligned.h (limited to 'include/apos') diff --git a/include/apos/bits.h b/include/apos/bits.h index cc3cd00..699cba4 100644 --- a/include/apos/bits.h +++ b/include/apos/bits.h @@ -8,9 +8,9 @@ #define __set_bit(x, y) ((x) |= (y)) #define __clear_bit(x, y) ((x) &= ~(y)) -#define __is_nset(x, y) (__is_set((x), 1 << (y))) -#define __set_nbit(x, y) (__set_bit((x), 1 << (y))) -#define __clear_nbit(x, y) (__clear_bit((x), 1 << (y))) +#define __is_nset(x, y) (__is_set((x), 1UL << (y))) +#define __set_nbit(x, y) (__set_bit((x), 1UL << (y))) +#define __clear_nbit(x, y) (__clear_bit((x), 1UL << (y))) uint16_t __bswap16(uint16_t u); uint32_t __bswap32(uint32_t u); diff --git a/include/apos/mem.h b/include/apos/mem.h index 7c0fde1..be44104 100644 --- a/include/apos/mem.h +++ b/include/apos/mem.h @@ -30,8 +30,8 @@ #define __o_container(idx) ((idx) / MM_OINFO_WIDTH) #define __o_bit(idx) ((idx) & (MM_OINFO_WIDTH - 1)) -#define __va(x) (((char *)(x)) + VM_DMAP - RAM_BASE) -#define __pa(x) (((char *)(x)) + RAM_BASE - VM_DMAP) +#define __va(x) (void *)(((uintptr_t)(x)) + VM_DMAP - RAM_BASE) +#define __pa(x) (void *)(((uintptr_t)(x)) - VM_DMAP + RAM_BASE) #define __page(x) ((x) / BASE_PAGE_SIZE) #define __addr(x) ((x)*BASE_PAGE_SIZE) #define __pages(x) \ diff --git a/include/apos/unaligned.h b/include/apos/unaligned.h new file mode 100644 index 0000000..1dbd253 --- /dev/null +++ b/include/apos/unaligned.h @@ -0,0 +1,67 @@ +#ifndef APOS_UNALIGNED_H +#define APOS_UNALIGNED_H + +#include +#include + +#define get_unaligned(ptr) \ + _Generic(*(ptr), uint8_t \ + : __get_unaligned_uint8_t, uint16_t \ + : __get_unaligned_uint16_t, uint32_t \ + : __get_unaligned_uint32_t, uint64_t \ + : __get_unaligned_uint64_t, int8_t \ + : __get_unaligned_int8_t, int16_t \ + : __get_unaligned_int16_t, int32_t \ + : __get_unaligned_int32_t, int64_t \ + : __get_unaligned_int64_t)((void *)ptr) + +#define put_unaligned(val, ptr) \ + _Generic(*(ptr), uint8_t \ + : __put_unaligned_uint8_t, uint16_t \ + : __put_unaligned_uint16_t, uint32_t \ + : __put_unaligned_uint32_t, uint64_t \ + : __put_unaligned_uint64_t, int8_t \ + : __put_unaligned_int8_t, int16_t \ + : __put_unaligned_int16_t, int32_t \ + : __put_unaligned_int32_t, int64_t \ + : __put_unaligned_int64_t)(val, (void *)ptr) + +#define DEFINE_GET(type) \ + static inline type __get_unaligned_##type(void *ptr) \ + { \ + const struct __packed { \ + type x; \ + } *__pptr = ptr; \ + return __pptr->x; \ + } + +DEFINE_GET(uint8_t); +DEFINE_GET(uint16_t); +DEFINE_GET(uint32_t); +DEFINE_GET(uint64_t); +DEFINE_GET(int8_t); +DEFINE_GET(int16_t); +DEFINE_GET(int32_t); +DEFINE_GET(int64_t); + +#undef DEFINE_GET + +#define DEFINE_PUT(type) \ + static inline void __put_unaligned_##type(type val, void *ptr) \ + { \ + struct __packed { \ + type x; \ + } *__pptr = ptr; \ + __pptr->x = val; \ + } + +DEFINE_PUT(uint8_t); +DEFINE_PUT(uint16_t); +DEFINE_PUT(uint32_t); +DEFINE_PUT(uint64_t); +DEFINE_PUT(int8_t); +DEFINE_PUT(int16_t); +DEFINE_PUT(int32_t); +DEFINE_PUT(int64_t); + +#endif /* APOS_UNALIGNED_H */ -- cgit v1.3