12#ifndef ZEPHYR_INCLUDE_SYS_HEAP_KASAN_H_
13#define ZEPHYR_INCLUDE_SYS_HEAP_KASAN_H_
26#if defined(CONFIG_SYS_HEAP_KASAN) || defined(__DOXYGEN__)
36#define SYS_HEAP_KASAN_GRANULE ((size_t)CONFIG_SYS_HEAP_KASAN_GRANULE)
40#define SYS_HEAP_KASAN_SHADOW_BITS(_sz) ((_sz) / SYS_HEAP_KASAN_GRANULE)
42#define SYS_HEAP_KASAN_SHADOW_BUNDLES(_sz) DIV_ROUND_UP(SYS_HEAP_KASAN_SHADOW_BITS(_sz), 32)
91#define SYS_HEAP_KASAN_ENABLE(_heap_name, _heap_sz) \
93 _heap_name##_kasan_bundles[SYS_HEAP_KASAN_SHADOW_BUNDLES(_heap_sz)] __noinit \
95 static sys_bitarray_t _heap_name##_kasan_ba = { \
96 .num_bits = SYS_HEAP_KASAN_SHADOW_BITS(_heap_sz), \
97 .num_bundles = SYS_HEAP_KASAN_SHADOW_BUNDLES(_heap_sz), \
98 .bundles = _heap_name##_kasan_bundles, \
100 static int _heap_name##_kasan_init_fn(void) \
102 heap_kasan_register(&(_heap_name), &_heap_name##_kasan_ba); \
105 SYS_INIT(_heap_name##_kasan_init_fn, PRE_KERNEL_1, 0)
123#define K_HEAP_KASAN_ENABLE(_heap_name, _heap_sz) \
124 static uint32_t _heap_name##_kasan_bundles[SYS_HEAP_KASAN_SHADOW_BUNDLES( \
125 MAX(_heap_sz, Z_HEAP_MIN_SIZE))] __noinit __aligned(4); \
126 static sys_bitarray_t _heap_name##_kasan_ba = { \
127 .num_bits = SYS_HEAP_KASAN_SHADOW_BITS(MAX(_heap_sz, Z_HEAP_MIN_SIZE)), \
128 .num_bundles = SYS_HEAP_KASAN_SHADOW_BUNDLES(MAX(_heap_sz, Z_HEAP_MIN_SIZE)), \
129 .bundles = _heap_name##_kasan_bundles, \
131 static int _heap_name##_kasan_init_fn(void) \
133 heap_kasan_register(&(_heap_name).heap, &_heap_name##_kasan_ba); \
136 SYS_INIT(_heap_name##_kasan_init_fn, PRE_KERNEL_1, 0)
143#define SYS_HEAP_KASAN_ENABLE(_heap_name, _heap_sz)
144#define K_HEAP_KASAN_ENABLE(_heap_name, _heap_sz)
Header file for the bit array API.
struct sys_bitarray sys_bitarray_t
Bitarray structure.
Definition bitarray.h:50
void heap_kasan_report(uintptr_t addr, size_t size)
Report a heap KASAN violation.
void heap_kasan_register(struct sys_heap *heap, sys_bitarray_t *ba)
Associate a shadow bitarray with a heap for KASAN tracking.
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105