Allocator API
enum alloc_flags { ALLOC_FLAG_PREFER_CACHE_ALIGNED = (1 << 0), ALLOC_FLAG_NO_CACHE_ALIGN = 0, ALLOC_FLAG_FLEXIBLE_LOCALITY = (1 << 1), ALLOC_FLAG_STRICT_LOCALITY = 0, ALLOC_FLAG_PAGEABLE = (1 << 2), ALLOC_FLAG_NONPAGEABLE = 0, ALLOC_FLAG_MOVABLE = (1 << 3), ALLOC_FLAG_NONMOVABLE = 0, ALLOC_FLAG_CLASS_DEFAULT = (0 << ALLOC_CLASS_SHIFT), ALLOC_FLAG_CLASS_INTERLEAVED = (1 << ALLOC_CLASS_SHIFT), ALLOC_FLAG_CLASS_HIGH_BANDWIDTH = (2 << ALLOC_CLASS_SHIFT),};enum alloc_behavior { ALLOC_BEHAVIOR_NORMAL, ALLOC_BEHAVIOR_ATOMIC, ALLOC_BEHAVIOR_NO_WAIT, ALLOC_BEHAVIOR_NO_RECLAIM, ALLOC_BEHAVIOR_FAULT_SAFE, ALLOC_BEHAVIOR_FLAG_FAST = 1 << ALLOC_BEHAVIOR_FLAG_SHIFT,};bool alloc_flags_valid(uint16_t flags);enum alloc_behavior alloc_behavior_base(enum alloc_behavior raw);alloc_behavior_base referenced types:
bool alloc_behavior_may_fault(enum alloc_behavior raw);alloc_behavior_may_fault referenced types:
bool alloc_behavior_may_block(enum alloc_behavior raw);alloc_behavior_may_block referenced types:
bool alloc_behavior_is_isr_safe(enum alloc_behavior raw);alloc_behavior_is_isr_safe referenced types:
bool alloc_behavior_no_reclaim(enum alloc_behavior raw);alloc_behavior_no_reclaim referenced types:
bool alloc_behavior_is_fast(enum alloc_behavior raw);alloc_behavior_is_fast referenced types:
bool alloc_flag_behavior_verify(enum alloc_flags f, enum alloc_behavior behavior);alloc_flag_behavior_verify referenced types:
void alloc_request_sanitize(enum alloc_flags *f, enum alloc_behavior *b);alloc_request_sanitize referenced types:
Defines
Section titled “Defines”#define ALLOC_LOCALITY_SHIFT 4#define ALLOC_CLASS_SHIFT 12#define ALLOC_CLASS_MASK 0xF#define ALLOC_LOCALITY_MAX 7#define ALLOC_LOCALITY_MIN 0#define ALLOC_LOCALITY_MASK 0x7#define ALLOC_LOCALITY_FROM_FLAGS(flags) \ (((flags) >> ALLOC_LOCALITY_SHIFT) & ALLOC_LOCALITY_MASK)#define ALLOC_LOCALITY_TO_FLAGS(locality) \ (((locality) & ALLOC_LOCALITY_MASK) << ALLOC_LOCALITY_SHIFT)#define ALLOC_FLAG_TEST(flags, mask) (flags & mask)#define ALLOC_FLAG_CLASS(flags) \ ((flags >> ALLOC_CLASS_SHIFT) & ALLOC_CLASS_MASK)#define ALLOC_FLAGS_DEFAULT \ (ALLOC_FLAG_CLASS_DEFAULT | ALLOC_FLAG_FLEXIBLE_LOCALITY | \ ALLOC_FLAG_NONMOVABLE | ALLOC_FLAG_NONPAGEABLE | \ ALLOC_FLAG_NO_CACHE_ALIGN | ALLOC_LOCALITY_TO_FLAGS(ALLOC_LOCALITY_MIN))#define ALLOC_FLAGS_PAGEABLE \ ALLOC_FLAG_PAGEABLE | ALLOC_FLAG_CLASS_DEFAULT | \ ALLOC_FLAG_FLEXIBLE_LOCALITY#define ALLOC_BEHAVIOR_FLAG_SHIFT 4#define ALLOC_BEHAVIOR_MASK (0xF)#define ALLOC_BEHAVIOR_DEFAULT ALLOC_BEHAVIOR_NORMAL#define kfree_1(ptr) kfree_internal((ptr), ALLOC_BEHAVIOR_DEFAULT)#define kfree_2(ptr, bh) kfree_internal((ptr), (bh))#define kfree(...) _DISPATCH(kfree, PP_NARG(__VA_ARGS__))(__VA_ARGS__)#define kmalloc_1(sz) \ kmalloc_internal((sz), ALLOC_FLAGS_DEFAULT, ALLOC_BEHAVIOR_DEFAULT)#define kmalloc_2(sz, fl) kmalloc_internal((sz), (fl), ALLOC_BEHAVIOR_DEFAULT)#define kmalloc_3(sz, fl, bh) kmalloc_internal((sz), (fl), (bh))#define kmalloc(...) _DISPATCH(kmalloc, PP_NARG(__VA_ARGS__))(__VA_ARGS__)#define kzalloc_1(sz) \ kzalloc_internal((sz), ALLOC_FLAGS_DEFAULT, ALLOC_BEHAVIOR_DEFAULT)#define kzalloc_2(sz, fl) kzalloc_internal((sz), (fl), ALLOC_BEHAVIOR_DEFAULT)#define kzalloc_3(sz, fl, bh) kzalloc_internal((sz), (fl), (bh))#define kzalloc(...) _DISPATCH(kzalloc, PP_NARG(__VA_ARGS__))(__VA_ARGS__)#define kmalloc_aligned_2(sz, al) \ kmalloc_aligned_internal((sz), (al), ALLOC_FLAGS_DEFAULT, \ ALLOC_BEHAVIOR_DEFAULT)#define kmalloc_aligned_3(sz, al, fl) \ kmalloc_aligned_internal((sz), (al), (fl), ALLOC_BEHAVIOR_DEFAULT)#define kmalloc_aligned_4(sz, al, fl, bh) \ kmalloc_aligned_internal((sz), (al), (fl), (bh))#define kmalloc_aligned(...) \ _DISPATCH(kmalloc_aligned, PP_NARG(__VA_ARGS__))(__VA_ARGS__)#define kzalloc_aligned_2(sz, al) \ kzalloc_aligned_internal((sz), (al), ALLOC_FLAGS_DEFAULT, \ ALLOC_BEHAVIOR_DEFAULT)#define kzalloc_aligned_3(sz, al, fl) \ kzalloc_aligned_internal((sz), (al), (fl), ALLOC_BEHAVIOR_DEFAULT)#define kzalloc_aligned_4(sz, al, fl, bh) \ kzalloc_aligned_internal((sz), (al), (fl), (bh))#define kzalloc_aligned(...) \ _DISPATCH(kzalloc_aligned, PP_NARG(__VA_ARGS__))(__VA_ARGS__)#define kfree_aligned_1(ptr) \ kfree_aligned_internal((ptr), ALLOC_BEHAVIOR_DEFAULT)#define kfree_aligned_2(ptr, bh) kfree_aligned_internal((ptr), (bh))#define kfree_aligned(...) \ _DISPATCH(kfree_aligned, PP_NARG(__VA_ARGS__))(__VA_ARGS__)#define krealloc_2(ptr, sz) \ krealloc_internal((ptr), (sz), ALLOC_FLAGS_DEFAULT, ALLOC_BEHAVIOR_DEFAULT)#define krealloc_3(ptr, sz, fl) \ krealloc_internal((ptr), (sz), (fl), ALLOC_BEHAVIOR_DEFAULT)#define krealloc_4(ptr, sz, fl, bh) krealloc_internal((ptr), (sz), (fl), (bh))#define krealloc(...) _DISPATCH(krealloc, PP_NARG(__VA_ARGS__))(__VA_ARGS__)#define knew(ptr, ...) ((ptr) = kmalloc(sizeof(*(ptr)), ##__VA_ARGS__))