Skip to content

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:

#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__))